From 9e2ff88b8f904a75e2185fdd5056cb17716c0924 Mon Sep 17 00:00:00 2001 From: usermaneGermane Date: Mon, 9 Nov 2026 22:34:32 +0200 Subject: [PATCH] Rename to SecretSpace (display names only) Owner decision 2026-11-09: another password manager is already called PassMan. Every name a reader sees is now SecretSpace: README, messages, the setup's screens, the version resource, and on Windows the installer (SecretSpace-Server-Installer.exe), its Settings -> Apps entry, the Start Menu folder and the default program folder. What a running server is made of keeps its name, so an installed server needs no change and an upgrade finds and replaces it: - Linux: service passman-sync, user passman, /opt/passman/server, /etc/passman, /var/lib/passman/store (the prod box runs these); - Windows: PassMan-Server.exe and PassMan-Server-Setup.exe (the startup task starts the first), the task and firewall group "PassMan Sync Server", %ProgramData%\PassMan Server, the installer AppId; - both: passman_server.py / passman_setup.py, the X-PassMan-* headers and the PassManSync/1.0 server id of the sync protocol. The README says so in a "Formerly PassMan" note. passman_server.py and passman_setup.py stay identical in both server repos. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011ojnyVg7ccsR3pZ64s7aRH --- .gitignore | 1 + README.md | 92 ++++++++++--------- SECURITY.md | 2 +- builder/build.py | 27 +++--- builder/tests/test_build.py | 8 +- ...sMan-Server.iss => SecretSpace-Server.iss} | 32 ++++--- server/PassMan-Server.spec | 6 +- server/build_version.py | 4 +- server/passman_server.py | 4 +- server/passman_server_exe.py | 6 +- server/passman_server_setup_exe.py | 2 +- server/passman_setup.py | 10 +- server/version.py | 2 +- tests/test_server_setup.py | 4 +- 14 files changed, 108 insertions(+), 92 deletions(-) rename installer/{PassMan-Server.iss => SecretSpace-Server.iss} (76%) diff --git a/.gitignore b/.gitignore index aedf3e4..331769d 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ server/token # What builder\build.py writes here. Publish it as a release asset rather # than committing it. +SecretSpace-Server-Installer.exe PassMan-Server-Installer.exe # Working notes, kept locally. diff --git a/README.md b/README.md index d51e9dc..ffcbbc4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PassMan sync server for Windows +# SecretSpace sync server for Windows A place to keep your encrypted vault so two PCs can stay in step. It stores one blob per user, numbers each revision, and refuses a write computed against @@ -12,20 +12,30 @@ your PC. It needs no Python: the installer brings everything with it. -**Which apps it serves.** PassMan for Windows 2.x and PassMan for Linux -0.x sync with it. The PassMan 3 test versions (Windows 3.0.0-alpha, Linux +**Formerly PassMan.** The project was renamed to SecretSpace in November +2026, because another password manager already uses the name PassMan. The +installer (`SecretSpace-Server-Installer.exe`), its entry in Settings → Apps +and the Start Menu folder carry the new name. What a running server is made +of keeps its name, so an upgrade finds and replaces it: the programs +`PassMan-Server.exe` and `PassMan-Server-Setup.exe`, the task and firewall +rule **PassMan Sync Server**, `%ProgramData%\PassMan Server`, and the +`X-PassMan-*` headers of the sync protocol. An upgrade keeps the program +folder it was installed in. + +**Which apps it serves.** SecretSpace for Windows 2.x and SecretSpace for Linux +0.x sync with it. The SecretSpace 3 test versions (Windows 3.0.0-alpha, Linux 1.0.0-alpha) do not sync yet: they need accounts on the server, which come with server 2.0. -This repository is the server for **Windows**. The other parts of PassMan +This repository is the server for **Windows**. The other parts of SecretSpace have their own repositories: | Repository | What it holds | |---|---| -| [PassMan-Client-Windows](https://github.com/usermaneGermane/PassMan-Client-Windows) | the app for Windows — what your PCs run | -| [PassMan-Client-Linux](https://github.com/usermaneGermane/PassMan-Client-Linux) | the app for Linux — from source or a .deb package | -| **PassMan-Server-Windows** (this one) | the server for Windows | -| [PassMan-Server-Linux](https://github.com/usermaneGermane/PassMan-Server-Linux) | the same server for Linux, run by systemd | +| [SecretSpace-Client-Windows](https://github.com/usermaneGermane/SecretSpace-Client-Windows) | the app for Windows — what your PCs run | +| [SecretSpace-Client-Linux](https://github.com/usermaneGermane/SecretSpace-Client-Linux) | the app for Linux — from source or a .deb package | +| **SecretSpace-Server-Windows** (this one) | the server for Windows | +| [SecretSpace-Server-Linux](https://github.com/usermaneGermane/SecretSpace-Server-Linux) | the same server for Linux, run by systemd | ## Before you start @@ -43,20 +53,20 @@ The steps below use `192.168.1.60` for the server and `8787` for the port. ## The three files -The server is its own download, **`PassMan-Server-Installer.exe`**, separate -from the app's `PassMan-Client-Installer.exe`. Either works without the +The server is its own download, **`SecretSpace-Server-Installer.exe`**, separate +from the app's `SecretSpace-Client-Installer.exe`. Either works without the other: install only the server on the PC that stays on, only the app on the PCs — or both on one PC. | File | What it does | |---|---| -| `PassMan-Server-Installer.exe` | **installs** (or upgrades) the server — the download | +| `SecretSpace-Server-Installer.exe` | **installs** (or upgrades) the server — the download | | `PassMan-Server.exe` | **is** the server; the startup task runs it, you never need to | | `PassMan-Server-Setup.exe` | **changes the settings** — network, port, token. Installs and unpacks nothing | ## Install -1. **Run `PassMan-Server-Installer.exe`** and allow it to make changes (it +1. **Run `SecretSpace-Server-Installer.exe`** and allow it to make changes (it installs for the whole machine). It is not code-signed, so SmartScreen may warn first: **More info → Run anyway**. Near the end it runs `PassMan-Server-Setup.exe` in a console window, which asks two things: @@ -68,14 +78,14 @@ PCs — or both on one PC. another from 1024 to 65535. 2. **Note what it prints**: the token, and the address to enter on each PC, e.g. `http://192.168.1.60:8787`. Then press Enter to close the window. -3. **Connect PassMan** on each PC — see [below](#connect-passman). +3. **Connect SecretSpace** on each PC — see [below](#connect-passman). The setup did the rest: | What | Where | |---|---| -| the programs | `C:\Program Files\PassMan Server\` (`PassMan-Server.exe`, `PassMan-Server-Setup.exe`) | -| settings, token, vaults, log | `C:\ProgramData\PassMan Server\` (`sync.env`, `token`, `store\`, `logs\server.log`) | +| the programs | `C:\Program Files\SecretSpace Server\` (`PassMan-Server.exe`, `PassMan-Server-Setup.exe`) | +| settings, token, vaults, log | `C:\ProgramData\SecretSpace Server\` (`sync.env`, `token`, `store\`, `logs\server.log`) | | starts with Windows, nobody logged in | Task Scheduler → **PassMan Sync Server**, as LOCAL SERVICE | | firewall | Windows Defender Firewall → inbound rule **PassMan Sync Server (TCP *port*)**, open to the networks this PC is on (or just the one you picked) | @@ -85,10 +95,10 @@ passed on the command line, which every user on the machine can read. For a silent install, e.g. for testing: ``` -PassMan-Server-Installer.exe /VERYSILENT /SUPPRESSMSGBOXES /HOST=0.0.0.0 /PORT=8787 +SecretSpace-Server-Installer.exe /VERYSILENT /SUPPRESSMSGBOXES /HOST=0.0.0.0 /PORT=8787 ``` -## Connect PassMan +## Connect SecretSpace Get the token: double-click `PassMan-Server-Setup.exe` and choose **Show the token**, or use the Start Menu shortcut of the same name. @@ -104,7 +114,7 @@ not. the same address and token, your username and your master password. After that, press **Sync** on either PC whenever you like. -To check it worked, `C:\ProgramData\PassMan Server\store\\vault.enc` +To check it worked, `C:\ProgramData\SecretSpace Server\store\\vault.enc` appears after the first sync, and the server log shows the requests. The log records usernames and status codes — never the vault, never the token. @@ -121,12 +131,12 @@ administrator rights) and it shows where the server listens now, then: ``` After each choice the menu comes back, so you can change the port and then -show the token, until **Close**. The Start Menu folder **PassMan Server** has +show the token, until **Close**. The Start Menu folder **SecretSpace Server** has a shortcut for each, and one to open the **server log**. From an administrator terminal, each one directly: ``` -"C:\Program Files\PassMan Server\PassMan-Server-Setup.exe" setup | show-token | new-token +"C:\Program Files\SecretSpace Server\PassMan-Server-Setup.exe" setup | show-token | new-token ``` For a script, skip the questions: `… setup --host 0.0.0.0 --port 9443`. @@ -152,18 +162,18 @@ and if the vault might have been copied, change the master password too. ## Upgrading -Run the newer `PassMan-Server-Installer.exe`. It stops the server, replaces +Run the newer `SecretSpace-Server-Installer.exe`. It stops the server, replaces the program files, keeps the network, port and token without asking, and starts the server again — it is not the way to change the port. -**Upgrade the server before changing a master password** in PassMan. The +**Upgrade the server before changing a master password** in SecretSpace. The server records how many times each vault's password has changed; an older server does not, and after a second change it can send a PC the wrong way. ## Uninstalling -Settings → Apps → **PassMan Server** removes the programs, the task and the -firewall rule, and **keeps** `C:\ProgramData\PassMan Server` — your vaults. +Settings → Apps → **SecretSpace Server** removes the programs, the task and the +firewall rule, and **keeps** `C:\ProgramData\SecretSpace Server` — your vaults. Delete that folder yourself if you are sure. ## Troubleshooting @@ -172,7 +182,7 @@ Delete that folder yourself if you are sure. failures are simply that nothing is running: - Task Scheduler → **PassMan Sync Server** should be *Running*. -- The server log (Start Menu → PassMan Server → Server log) says why it +- The server log (Start Menu → SecretSpace Server → Server log) says why it stopped, if it did. - On the server itself, in PowerShell: `curl.exe http://127.0.0.1:8787/health` should answer @@ -194,10 +204,10 @@ dropping it. | PC and server on different networks | Compare `ipconfig` on both; a VPN address and a LAN address are not the same network | | Server log: an address this PC no longer has | The network changed. Run the setup and pick again — every network (`0.0.0.0`) avoids this | | `Address already in use` in the log | Something else on the port. Pick another port in the setup | -| PassMan: "rejected the sync token" | A stray space or line break when pasting; copy it again. Or the token was replaced — paste the new one | -| PassMan: "Could not reach …" | Wrong address or port in Settings → Sync, the PC is on another network, or the firewall is blocking it | +| SecretSpace: "rejected the sync token" | A stray space or line break when pasting; copy it again. Or the token was replaced — paste the new one | +| SecretSpace: "Could not reach …" | Wrong address or port in Settings → Sync, the PC is on another network, or the firewall is blocking it | | It worked, then stopped | The server's address changed — see below | -| PassMan asks for a master password when you press Sync | Expected after a password change on another PC (or on this one while offline) — see [Changing the master password](https://github.com/usermaneGermane/PassMan-Client-Windows#changing-the-master-password-of-a-vault-you-sync) | +| SecretSpace asks for a master password when you press Sync | Expected after a password change on another PC (or on this one while offline) — see [Changing the master password](https://github.com/usermaneGermane/SecretSpace-Client-Windows#changing-the-master-password-of-a-vault-you-sync) | ## If the server's address changes @@ -229,7 +239,7 @@ To get rid of a vault for good: Settings → **Delete this user**, which removes the vault, its backup and its sync state on that PC. 2. **Then on the server:** delete - `C:\ProgramData\PassMan Server\store\`. This removes the current + `C:\ProgramData\SecretSpace Server\store\`. This removes the current copy, `meta.json` and all its history. The server does not need stopping; it reads the files on every request. @@ -253,7 +263,7 @@ the encrypted blobs — without being able to decrypt them. On a home network or a VPN you trust, that is usually acceptable. The server can serve TLS with a pinned self-signed certificate (`--cert`, -`--key`; PassMan-Server-Linux's README shows how), but the Windows setup does +`--key`; SecretSpace-Server-Linux's README shows how), but the Windows setup does not set that up yet. ## API @@ -286,7 +296,7 @@ which the client never sends — it exists for recovering by hand. ## What it keeps -Inside `C:\ProgramData\PassMan Server\store`: +Inside `C:\ProgramData\SecretSpace Server\store`: ``` \vault.enc the current blob — encrypted @@ -294,14 +304,14 @@ Inside `C:\ProgramData\PassMan Server\store`: \history\*.enc the last 20 revisions — encrypted ``` -One folder per PassMan username, so several vaults can share one server +One folder per SecretSpace username, so several vaults can share one server without touching each other. `vault.enc` and the history are the same AES-256-GCM files as on the PCs; the server never has the key. `meta.json` and the folder name are plain: they reveal the username, when it last synced and roughly how large the vault is — never an entry. Each history file stays encrypted with the master password in use when it was -written. When you change a master password, PassMan offers to delete them — +written. When you change a master password, SecretSpace offers to delete them — ticked by default — since they would still open with the old one. History is server-side undo. To roll back: stop **PassMan Sync Server** in @@ -314,7 +324,7 @@ safe outcome. This server is not a backup. It holds one copy of a file your PCs also hold, and it will happily store a vault you damaged. Keep -`C:\ProgramData\PassMan Server\store` in whatever backs up the rest of the +`C:\ProgramData\SecretSpace Server\store` in whatever backs up the rest of the machine — the contents are encrypted, so a backup of it is no more sensitive than the vault itself. @@ -335,7 +345,7 @@ py builder\build.py --install-missing install what is missing first ``` It checks each prerequisite, offers pip and winget for what is missing, and -writes `PassMan-Server-Installer.exe` here. The version comes from +writes `SecretSpace-Server-Installer.exe` here. The version comes from `server/version.py`. ## Versions @@ -349,9 +359,9 @@ separate from the app's and from the Linux server's. ## Project layout ``` -PassMan-Server-Windows/ +SecretSpace-Server-Windows/ ├── builder/ build.py: checks, then builds the installer -├── installer/PassMan-Server.iss the Inno Setup script +├── installer/SecretSpace-Server.iss the Inno Setup script └── server/ ├── passman_server.py the server (standard library only) ├── passman_setup.py network, port, token, the task, the firewall rule @@ -378,12 +388,12 @@ for every pull request and every push to `main`. 127.0.0.1, with no client involved: the token, which paths exist, If-Match (including two pushes racing for one revision), malformed and oversized bodies, the history limit and the access log. It is the same file in -PassMan-Server-Linux. +SecretSpace-Server-Linux. `server/passman_server.py` and `server/passman_setup.py` are the same files -as in PassMan-Server-Linux — `passman_setup.py` holds the setup for both +as in SecretSpace-Server-Linux — `passman_setup.py` holds the setup for both systems. Make a change to either in both repositories, so the two servers -never drift apart. PassMan-Client-Windows and PassMan-Client-Linux each keep +never drift apart. SecretSpace-Client-Windows and SecretSpace-Client-Linux each keep a copy of `passman_server.py` for their end-to-end sync tests; refresh those too. @@ -394,7 +404,7 @@ Free software under the **GNU General Public License v3.0 only** share it; if you distribute a changed version, it must stay under the same licence, with its source. -The other PassMan repositories (the Windows and Linux clients and sync servers) +The other SecretSpace repositories (the Windows and Linux clients and sync servers) are free software under the same licence. Security issues: please report them privately, see [SECURITY.md](SECURITY.md). diff --git a/SECURITY.md b/SECURITY.md index 3ff6235..71e926b 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,6 +1,6 @@ # Security policy -PassMan keeps passwords, so security reports are welcome and taken seriously. +SecretSpace keeps passwords, so security reports are welcome and taken seriously. ## Reporting a vulnerability diff --git a/builder/build.py b/builder/build.py index df260f1..2c893fa 100644 --- a/builder/build.py +++ b/builder/build.py @@ -1,5 +1,5 @@ """ -Build PassMan-Server-Installer.exe from the source, after checking every +Build SecretSpace-Server-Installer.exe from the source, after checking every prerequisite: py builder\\build.py check, then build @@ -8,8 +8,8 @@ The server is standard library only, so the build needs Python, PyInstaller and Inno Setup 6 and nothing else. Everything here is plain functions over an injectable command runner, so the tests can check every decision without -starting a single process. The app (PassMan-Client-Installer.exe) is built -from its own repository, PassMan-Client-Windows. +starting a single process. The app (SecretSpace-Client-Installer.exe) is built +from its own repository, SecretSpace-Client-Windows. """ import os @@ -28,7 +28,7 @@ os.path.join("server", "version.py"), os.path.join("server", "build_version.py"), os.path.join("server", "PassMan-logo.ico"), - os.path.join("installer", "PassMan-Server.iss"), + os.path.join("installer", "SecretSpace-Server.iss"), ) #: winget packages for what pip cannot install. @@ -230,9 +230,12 @@ def remove_previous(project: str) -> None: """Delete the old outputs first, so a failed build cannot look like a successful one because last time's files are still there.""" import shutil - path = os.path.join(project, "PassMan-Server-Installer.exe") - if os.path.exists(path): - os.remove(path) + # PassMan-Server-Installer.exe is the name from before the rename to + # SecretSpace: removed too, so it cannot pass for a current build. + for name in ("SecretSpace-Server-Installer.exe", "PassMan-Server-Installer.exe"): + path = os.path.join(project, name) + if os.path.exists(path): + os.remove(path) folder = os.path.join(project, "build", "server", "PassMan-Server") if os.path.isdir(folder): shutil.rmtree(folder) @@ -250,10 +253,10 @@ def build_steps(project: str, py: "Python", iscc: str, version: str) -> list: os.path.join(project, "server", "PassMan-Server.spec")], os.path.join(project, "build", "server", "PassMan-Server", "PassMan-Server.exe")), - ("Packing PassMan-Server-Installer.exe", + ("Packing SecretSpace-Server-Installer.exe", [iscc, "/Q", f"/DAppVersion={version}", - os.path.join(project, "installer", "PassMan-Server.iss")], - os.path.join(project, "PassMan-Server-Installer.exe")), + os.path.join(project, "installer", "SecretSpace-Server.iss")], + os.path.join(project, "SecretSpace-Server-Installer.exe")), ] @@ -261,7 +264,7 @@ def build(project: str, py: "Python", iscc: str, log=print, runner=run, exists=os.path.isfile) -> bool: """Run the build, logging as it goes. True when every output exists.""" version = app_version(project) - log(f"PassMan Server {version}") + log(f"SecretSpace Server {version}") remove_previous(project) for label, cmd, product in build_steps(project, py, iscc, version): log("") @@ -273,7 +276,7 @@ def build(project: str, py: "Python", iscc: str, log=print, runner=run, "The messages above give the reason.") return False log("") - log(f"DONE. Version {version}: PassMan-Server-Installer.exe") + log(f"DONE. Version {version}: SecretSpace-Server-Installer.exe") return True diff --git a/builder/tests/test_build.py b/builder/tests/test_build.py index 01465e5..182f032 100644 --- a/builder/tests/test_build.py +++ b/builder/tests/test_build.py @@ -136,7 +136,7 @@ def test_iscc_found_in_the_per_user_location(monkeypatch): def project(tmp_path): (tmp_path / "server").mkdir() (tmp_path / "server" / "version.py").write_text('__version__ = "9.8.7"\n') - (tmp_path / "PassMan-Server-Installer.exe").write_text("last time's build") + (tmp_path / "SecretSpace-Server-Installer.exe").write_text("last time's build") return str(tmp_path) @@ -147,7 +147,7 @@ def test_build_runs_the_steps_in_order(project): runner=runner, exists=lambda p: True) cmds = [" ".join(c) for c, _ in runner.calls] assert "PassMan-Server.spec" in cmds[0] - assert "/DAppVersion=9.8.7" in cmds[1] and "PassMan-Server.iss" in cmds[1] + assert "/DAppVersion=9.8.7" in cmds[1] and "SecretSpace-Server.iss" in cmds[1] assert len(cmds) == 2 @@ -155,13 +155,13 @@ def test_only_the_server_is_built(): """The app has its own repository and its own build.""" steps = build.build_steps("P", build.Python(["py"], "3", "p"), "iscc", "1") products = [os.path.basename(product) for _, _, product in steps] - assert products == ["PassMan-Server.exe", "PassMan-Server-Installer.exe"] + assert products == ["PassMan-Server.exe", "SecretSpace-Server-Installer.exe"] def test_old_outputs_are_removed_before_building(project): build.remove_previous(project) assert not os.path.exists(os.path.join(project, - "PassMan-Server-Installer.exe")) + "SecretSpace-Server-Installer.exe")) def test_build_stops_at_the_first_failure(project): diff --git a/installer/PassMan-Server.iss b/installer/SecretSpace-Server.iss similarity index 76% rename from installer/PassMan-Server.iss rename to installer/SecretSpace-Server.iss index dbc8dde..f73a4c2 100644 --- a/installer/PassMan-Server.iss +++ b/installer/SecretSpace-Server.iss @@ -1,13 +1,13 @@ -; PassMan sync server installer for Windows - compiled by builder\build.py +; SecretSpace sync server installer for Windows - compiled by builder\build.py ; with Inno Setup 6: -; ISCC.exe /DAppVersion=2.3.0 installer\PassMan-Server.iss +; ISCC.exe /DAppVersion=2.3.0 installer\SecretSpace-Server.iss ; -; Separate from PassMan-Client-Installer.exe (the app): either can be +; Separate from SecretSpace-Client-Installer.exe (the app): either can be ; installed, run and uninstalled without the other, on the same PC or on ; different ones. ; ; Installs for the whole machine (it needs administrator rights) into -; Program Files\PassMan Server two programs: PassMan-Server.exe, the server, +; Program Files\SecretSpace Server two programs: PassMan-Server.exe, the server, ; and PassMan-Server-Setup.exe, which changes its settings. At the end it ; runs PassMan-Server-Setup.exe in a console window, which asks for the ; network and port and creates: @@ -16,11 +16,11 @@ ; - a Task Scheduler task "PassMan Sync Server" that starts the server ; at boot as LOCAL SERVICE ; An upgrade keeps the saved network and port without asking. Uninstalling -; removes the task and the firewall rule and KEEPS %ProgramData%\PassMan +; removes the task and the firewall rule and KEEPS %ProgramData%\SecretSpace ; Server, because that is where the vaults are. ; ; Silent install, e.g. for testing: -; PassMan-Server-Installer.exe /VERYSILENT /SUPPRESSMSGBOXES /HOST=0.0.0.0 /PORT=8787 +; SecretSpace-Server-Installer.exe /VERYSILENT /SUPPRESSMSGBOXES /HOST=0.0.0.0 /PORT=8787 #ifndef AppVersion #define AppVersion "0.0.0" @@ -30,21 +30,21 @@ ; Never change AppId: it is how an upgrade finds the copy it replaces. It is ; not the app's AppId, so the two never replace each other. AppId={{6C1E2B7A-5F3D-4C8E-9A41-2D7B0E93F615} -AppName=PassMan Server +AppName=SecretSpace Server AppVersion={#AppVersion} -AppVerName=PassMan Server {#AppVersion} +AppVerName=SecretSpace Server {#AppVersion} VersionInfoVersion={#AppVersion} -DefaultDirName={autopf}\PassMan Server +DefaultDirName={autopf}\SecretSpace Server DisableProgramGroupPage=yes PrivilegesRequired=admin MinVersion=10.0 ArchitecturesAllowed=x64compatible ArchitecturesInstallIn64BitMode=x64compatible OutputDir=.. -OutputBaseFilename=PassMan-Server-Installer +OutputBaseFilename=SecretSpace-Server-Installer SetupIconFile=..\server\PassMan-logo.ico UninstallDisplayIcon={app}\PassMan-Server.exe -UninstallDisplayName=PassMan Server +UninstallDisplayName=SecretSpace Server WizardStyle=modern Compression=lzma2 SolidCompression=yes @@ -52,15 +52,17 @@ SolidCompression=yes [InstallDelete] ; An upgrade must not leave the previous version's libraries behind. Type: filesandordirs; Name: "{app}\_internal" +; Nor the Start Menu folder of the name before SecretSpace. +Type: filesandordirs; Name: "{autoprograms}\PassMan Server" [Files] Source: "..\build\server\PassMan-Server\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs [Icons] -Name: "{autoprograms}\PassMan Server\Change network or port"; Filename: "{app}\PassMan-Server-Setup.exe"; Parameters: "--pause setup" -Name: "{autoprograms}\PassMan Server\Show the token"; Filename: "{app}\PassMan-Server-Setup.exe"; Parameters: "--pause show-token" -Name: "{autoprograms}\PassMan Server\Replace the token"; Filename: "{app}\PassMan-Server-Setup.exe"; Parameters: "--pause new-token" -Name: "{autoprograms}\PassMan Server\Server log"; Filename: "{commonappdata}\PassMan Server\logs\server.log" +Name: "{autoprograms}\SecretSpace Server\Change network or port"; Filename: "{app}\PassMan-Server-Setup.exe"; Parameters: "--pause setup" +Name: "{autoprograms}\SecretSpace Server\Show the token"; Filename: "{app}\PassMan-Server-Setup.exe"; Parameters: "--pause show-token" +Name: "{autoprograms}\SecretSpace Server\Replace the token"; Filename: "{app}\PassMan-Server-Setup.exe"; Parameters: "--pause new-token" +Name: "{autoprograms}\SecretSpace Server\Server log"; Filename: "{commonappdata}\PassMan Server\logs\server.log" [Run] ; Upgrade: same network and port, task re-pointed at this copy, restarted. diff --git a/server/PassMan-Server.spec b/server/PassMan-Server.spec index 12250dd..80a709d 100644 --- a/server/PassMan-Server.spec +++ b/server/PassMan-Server.spec @@ -1,6 +1,6 @@ # -*- mode: python ; coding: utf-8 -*- # -# The Windows server's program folder, which PassMan-Server-Installer.exe +# The Windows server's program folder, which SecretSpace-Server-Installer.exe # ships. Two console programs sharing one _internal\ folder: # # PassMan-Server.exe the server; the startup task runs it @@ -34,10 +34,10 @@ def program(script, name, description): server_a, server_exe = program('passman_server_exe.py', 'PassMan-Server', - 'PassMan sync server') + 'SecretSpace sync server') setup_a, setup_exe = program('passman_server_setup_exe.py', 'PassMan-Server-Setup', - 'PassMan sync server setup') + 'SecretSpace sync server setup') coll = COLLECT( server_exe, setup_exe, diff --git a/server/build_version.py b/server/build_version.py index 1cff2c5..4c9291c 100644 --- a/server/build_version.py +++ b/server/build_version.py @@ -15,7 +15,7 @@ from version import __version__ -def version_info(description="PassMan sync server", +def version_info(description="SecretSpace sync server", filename="PassMan-Server.exe") -> VSVersionInfo: numbers = tuple(int(part) for part in __version__.split(".")) + (0,) return VSVersionInfo( @@ -26,7 +26,7 @@ def version_info(description="PassMan sync server", StringStruct("FileVersion", __version__), StringStruct("InternalName", filename[:-4]), StringStruct("OriginalFilename", filename), - StringStruct("ProductName", "PassMan Server"), + StringStruct("ProductName", "SecretSpace Server"), StringStruct("ProductVersion", __version__), ])]), VarFileInfo([VarStruct("Translation", [0x0409, 1200])]), diff --git a/server/passman_server.py b/server/passman_server.py index 4b2c557..47e7d98 100644 --- a/server/passman_server.py +++ b/server/passman_server.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -PassMan sync server -- a store for encrypted vault blobs. +SecretSpace sync server -- a store for encrypted vault blobs. What it is NOT: it cannot read your passwords. The client encrypts the vault with your master password before it ever reaches the network, so this process @@ -524,7 +524,7 @@ def main(argv=None): # flush: under systemd stdout is a pipe and fully buffered, so without it # these lines never reach the journal while the server is running -- and # a silent journal after `systemctl start` reads as a failure. - print(f"PassMan sync on {scheme}://{args.host}:{args.port}") + print(f"SecretSpace sync on {scheme}://{args.host}:{args.port}") print(f"Vault store: {httpd.store.root}") if scheme == "http" and args.host not in ("127.0.0.1", "localhost"): print("NOTE: plain HTTP on a network address. Vaults are encrypted " diff --git a/server/passman_server_exe.py b/server/passman_server_exe.py index afa6f60..31f7ac1 100644 --- a/server/passman_server_exe.py +++ b/server/passman_server_exe.py @@ -6,7 +6,7 @@ PassMan-Server.exe --host ... --port ... --store ... --token-file ... To change the network, the port or the token, use PassMan-Server-Setup.exe -(Start Menu -> PassMan Server). This program still accepts the setup +(Start Menu -> SecretSpace Server). This program still accepts the setup commands (setup, new-token, show-token, remove) and hands them over, because an installation made before the two were split uninstalls with `PassMan-Server.exe remove`. @@ -22,7 +22,7 @@ USAGE = ("This is the server that the startup task runs. To change its " "network, port or token, run PassMan-Server-Setup.exe (Start Menu " - "-> PassMan Server).") + "-> SecretSpace Server).") def main(argv=None): @@ -30,7 +30,7 @@ def main(argv=None): if not argv: # Double-clicked: say what it is instead of failing for lack of a # token in a window that closes at once. - print("PassMan sync server.\n\n" + USAGE) + print("SecretSpace sync server.\n\n" + USAGE) input("\nPress Enter to close this window.") return # No server option takes a value that is also a command name. diff --git a/server/passman_server_setup_exe.py b/server/passman_server_setup_exe.py index 6dd961d..dade2e4 100644 --- a/server/passman_server_setup_exe.py +++ b/server/passman_server_setup_exe.py @@ -10,7 +10,7 @@ It installs nothing and unpacks nothing: it rewrites %ProgramData%\\PassMan Server\\sync.env, replaces the firewall rule and the startup task, and restarts the server. Installing and upgrading the program -is PassMan-Server-Installer.exe's job, which runs this once at the end. +is SecretSpace-Server-Installer.exe's job, which runs this once at the end. Every command needs administrator rights; started without them, it asks Windows (the UAC prompt) to run it elevated, in a new window. diff --git a/server/passman_setup.py b/server/passman_setup.py index 748bf26..f099e74 100644 --- a/server/passman_setup.py +++ b/server/passman_setup.py @@ -1,13 +1,13 @@ #!/usr/bin/env python3 """ -PassMan sync server setup -- where it listens, its token, its firewall rule. +SecretSpace sync server setup -- where it listens, its token, its firewall rule. Linux (systemd): sudo python3 passman_setup.py # ask, then write the settings sudo python3 passman_setup.py new-token # replace a leaked token sudo python3 passman_setup.py show-token # print the token -Windows (PassMan-Server-Installer.exe runs the first one for you): +Windows (SecretSpace-Server-Installer.exe runs the first one for you): PassMan-Server-Setup.exe [setup] | new-token | show-token | remove `setup` asks which address to listen on (listing this machine's networks) @@ -172,7 +172,7 @@ def read_env(path): def render_env(host, port, allow=()): - text = ("# PassMan sync server -- written by passman_setup.py.\n" + text = ("# SecretSpace sync server -- written by passman_setup.py.\n" "# Change it by running the setup again.\n" f"PASSMAN_HOST={host}\n" f"PASSMAN_PORT={port}\n") @@ -447,7 +447,7 @@ def restart_task(run): def firewall_windows(run, host, port, addresses, allow=()): """ - Replace PassMan's inbound rule and say what it allows. Every network + Replace SecretSpace's inbound rule and say what it allows. Every network means LocalSubnet -- the networks this PC is on, whichever they are today -- and one network means just that range; the extra addresses are added to either. This machine only needs no rule at all. @@ -655,7 +655,7 @@ def cmd_menu(args, ask=input, say=print, run=_run): while True: current = read_env(env_path) say("") - say("PassMan sync server") + say("SecretSpace sync server") if "PASSMAN_HOST" in current and "PASSMAN_PORT" in current: say(f" Listening on {current['PASSMAN_HOST']}:" f"{current['PASSMAN_PORT']}") diff --git a/server/version.py b/server/version.py index 0261605..fb742f5 100644 --- a/server/version.py +++ b/server/version.py @@ -7,4 +7,4 @@ from the app's and from the Linux server's. """ -__version__ = "1.1.2" +__version__ = "1.2.0" diff --git a/tests/test_server_setup.py b/tests/test_server_setup.py index 8021a3a..562ef02 100644 --- a/tests/test_server_setup.py +++ b/tests/test_server_setup.py @@ -641,11 +641,11 @@ def broken(address, handler): def test_the_task_runs_the_server_not_the_setup_program(): """Run from PassMan-Server-Setup.exe, the task must still start PassMan-Server.exe beside it -- never the setup program itself.""" - setup = os.path.join("C:\\Program Files", "PassMan Server", + setup = os.path.join("C:\\Program Files", "SecretSpace Server", "PassMan-Server-Setup.exe") program, prefix = passman_setup.server_command(frozen=True, executable=setup) - assert program == os.path.join("C:\\Program Files", "PassMan Server", + assert program == os.path.join("C:\\Program Files", "SecretSpace Server", "PassMan-Server.exe") assert prefix == []