activateKeylessUser(userId: number,password: string,): Promise<boolean>
A keyless invite leaves wrapped_data_key NULL. An editor holds no
DATA_KEY, so unlike acceptInvite there is no handoff to unwrap or
re-wrap. The password only authenticates, and protects no key.
Single-use: the UPDATE is guarded on the password_hash = '' unactivated
marker, which database pruning also uses. A replay or a race therefore no-ops
and never overwrites the password the first submit set.