Releases: EmptyCode0x86/OffCode-Tor-Chat-E2EE
Releases · EmptyCode0x86/OffCode-Tor-Chat-E2EE
Release list
OffCode Tor Chat 0.1
Info: https://github.com/EmptyCode0x86/OffCode-Tor-Chat-E2EE
https://www.dev-offcode.com/TorChatPage.html
VER: 0.1
- 12/08/2026
Changes
- FileSeal: Client wraps a random DEK with the room/hybrid CryptoKey (AES-GCM + AAD), encrypts the file in 256 KiB plaintext chunks, and uploads opaque ciphertext via PUT /api/attachments/{id}/chunks/{n} with HMAC X-Transfer-Token.
- Manifest v2: Compact envelope (wrap + salts + downloadToken) still goes through E2EE SendEncrypted; legacy v1 Base64 envelopes remain readable.
- Limits: Max 32 MiB per file; hub Begin/Complete/Cancel; SQLCipher attachment_transfers + disk under the data dir; TTL/orphan cleanup with messages.
- Policy: attachments_disabled still blocks Begin; text-only PayloadB64 gate unchanged for disabled rooms.
- Generate new code: Profile button + hub RebindCreatorSecret(old, new) rebinds all room_creators rows to the new SHA-256 hash and revokes the old code immediately. Restore alone does not invalidate server bindings.
- Hash model docs: Creator/manage/invite tokens use SHA-256 of high-entropy secrets; join proof uses PBKDF2. Weak-restore warning in Profile UI.
- Invite tokens: Stored as SHA-256 only; plaintext returned once on create/rotate; client caches last link; startup migrates legacy plaintext rows.
- JoinRoom owner-proof: Server verifies manageToken / creatorSecret only when joins are closed or a hidden room lacks a valid invite; client sends recovery only when this browser likely owns the room (manage token, owned-room cache from create/My rooms/restore, or My rooms page). Owner bypass logs + caller SystemNotice.
- GetMyRooms IncludePublic: Separate rate limit (5 / min) vs hidden-only My rooms (20 / min).
- Recovery docs: Profile + README treat recovery as a capability token (Settings, listing, closed rejoin).
- Attachments disabled: Text-only PayloadB64 gate tightened to ~16 KiB (blind size gate; not content-type).
- Restore recovery code: After saving the code, client calls GetMyRooms(includePublic: true) and shows a toast listing Hidden (My rooms) vs Public (Public rooms) room ids (or “none” / empty-server message).
- API: GetMyRoomsRequest.IncludePublic; ListRoomsForCreator(secret, hiddenOnly).
- Owner bypass on JoinRoom: When joins_closed (and for hidden rooms, disabled invite), the creator can still join by sending manageToken and/or Profile creatorSecret. Other members stay blocked. Password joinProof still required for locked rooms.
- Client: joinRoom / reconnect attach ownership proof from localStorage recovery + per-room manage token.
- API: IRoomInviteService.IsOwner; optional fields on JoinRoomRequest.
- Disable attachments: Creator Room Settings toggle (attachments_disabled in SQLCipher). Members get AttachmentsPolicy on join / toggle; Attach button gated in room-attachments.js. Server enforces a text-only PayloadB64 size cap when disabled (blind relay cannot inspect ciphertext kind).
- Hub / registry: SetAttachmentsDisabled, InviteStatusResponse.AttachmentsDisabled, registry getters/setters, DB migration.
- Room Settings UI: Wider two-column layout (Membership | Attachments; Slow mode compact row; Invite / Lock / Delete full width); denser hints and spacing.
- Max members: Creator Room Settings toggle (max_members in SQLCipher, 0 = off, else 2–50). Enforced in RoomPresenceService.Join; public "Room is full.", hidden generic "Cannot join room.". Existing members stay if the cap is lowered.
- Announcement / read-only: Creator Room Settings toggle (read_only). Only the creator may SendEncrypted / BeginAttachmentUpload; owner tokens are extra hub args (not persisted). Members get a disabled composer (room-readonly.js).