Nothing user-visible. The schema change and the configuration land on their own so the widest-reaching edit can be reviewed for what it is.
Scope
Make customers.password_hash nullable, and audit what assumed it was not. Three sites in routes/customers.ts compare against it with bcrypt: login, change password, and the email change. Each must first ask whether there is anything to compare.
Add customer_identities — provider, provider subject, customer id, created and last used. Unique across (provider, provider_sub), never on the subject alone. Keyed on the provider's stable subject and never the email.
Update the schema mirror and test reset lists. The Kysely schema file, REQUIRED_TABLES, the truncate statement, and the table count asserted by the schema-loss test all move together.
Derive the redirect URI from PUBLIC_URL, in a module shaped like passkeys/relyingParty.ts, exposing an enabled flag so Google sign-in is absent rather than broken when the credentials are unset.
Add GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET to environment validation, both-or-neither as a warning, following the SMTP pair.
That issue lists account deletion as confirming with the password. It does not.DELETE /api/customers/me takes no password, and the confirmation is an antd modal in the account page. Deletion needs no change here.
Done when
Migrations run up and down cleanly, the schema mirror test passes, and the backend boots with the credentials set, unset and half-set, saying something sensible in each case.
Part of #332. Phase 1 of six.
Nothing user-visible. The schema change and the configuration land on their own so the widest-reaching edit can be reviewed for what it is.
## Scope
- **Make `customers.password_hash` nullable**, and audit what assumed it was not. Three sites in `routes/customers.ts` compare against it with bcrypt: login, change password, and the email change. Each must first ask whether there is anything to compare.
- **Add `customer_identities`** — provider, provider subject, customer id, created and last used. Unique across `(provider, provider_sub)`, never on the subject alone. Keyed on the provider's stable subject and **never the email**.
- **Update the schema mirror and test reset lists.** The Kysely schema file, `REQUIRED_TABLES`, the truncate statement, and the table count asserted by the schema-loss test all move together.
- **Derive the redirect URI from `PUBLIC_URL`**, in a module shaped like `passkeys/relyingParty.ts`, exposing an `enabled` flag so Google sign-in is absent rather than broken when the credentials are unset.
- **Add `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET` to environment validation**, both-or-neither as a warning, following the SMTP pair.
## A correction to #332
That issue lists account deletion as confirming with the password. **It does not.** `DELETE /api/customers/me` takes no password, and the confirmation is an antd modal in the account page. Deletion needs no change here.
## Done when
Migrations run up and down cleanly, the schema mirror test passes, and the backend boots with the credentials set, unset and half-set, saying something sensible in each case.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Part of #332. Phase 1 of six.
Nothing user-visible. The schema change and the configuration land on their own so the widest-reaching edit can be reviewed for what it is.
Scope
customers.password_hashnullable, and audit what assumed it was not. Three sites inroutes/customers.tscompare against it with bcrypt: login, change password, and the email change. Each must first ask whether there is anything to compare.customer_identities— provider, provider subject, customer id, created and last used. Unique across(provider, provider_sub), never on the subject alone. Keyed on the provider's stable subject and never the email.REQUIRED_TABLES, the truncate statement, and the table count asserted by the schema-loss test all move together.PUBLIC_URL, in a module shaped likepasskeys/relyingParty.ts, exposing anenabledflag so Google sign-in is absent rather than broken when the credentials are unset.GOOGLE_CLIENT_IDandGOOGLE_CLIENT_SECRETto environment validation, both-or-neither as a warning, following the SMTP pair.A correction to #332
That issue lists account deletion as confirming with the password. It does not.
DELETE /api/customers/metakes no password, and the confirmation is an antd modal in the account page. Deletion needs no change here.Done when
Migrations run up and down cleanly, the schema mirror test passes, and the backend boots with the credentials set, unset and half-set, saying something sensible in each case.