PaperMove user onboarding and isolation check
PaperMove user onboarding and isolation check
PaperMove uses one Supabase project, but every authenticated user receives a separate database row and a separate Storage folder. Users must never receive Supabase Dashboard access, a secret key, or a database password.
One-time Auth configuration
In Authentication > URL Configuration:
- Set the Site URL to
https://chen-liu.com/papermove/. - Add
https://chen-liu.com/papermove/**to Redirect URLs. - During local testing, also allow
http://127.0.0.1:4174/papermove/**.
Invite a user
- Open Authentication > Users.
- Select Add user > Send invitation.
- Enter the user’s email and send the invitation.
- The user opens the invitation, sets a password of at least 12 characters, and enrolls a TOTP authenticator.
- After AAL2 verification, PaperMove automatically creates an empty workspace owned by that user’s Supabase UUID.
If an invitation expires, send a new one. Do not create or share a common PaperMove password.
Second-account isolation test
Use a second email address that you control:
- Invite the second address and complete password and MFA setup.
- In the second account, create a project named
SECOND ACCOUNT TESTand upload one harmless test file. - Sign out completely.
- Sign in as the original owner and verify that the test project and test file are absent.
- Create a harmless owner-only project or file, sign out, and sign back in as the second account. Verify the owner-only item is absent.
- Run both SQL files in the SQL Editor:
supabase/tests/papermove_rls_isolation.sqlsupabase/tests/papermove_storage_isolation.sql
- Delete the harmless test data after the check.
Passing both the real two-account test and the SQL tests confirms that AAL2 users cannot read or change another user’s workspace or private files.
File-box limits
Each account may store at most 30 files, and each file may be at most 20 MiB. The website checks the limit before uploading. The Storage INSERT policy must also include private.papermove_has_file_capacity() so a modified client cannot bypass the limit.
