@@ -38,6 +38,10 @@ service cloud.firestore {
3838 // Only the completePhoneVerification cloud function (Admin SDK) sets phoneVerified
3939 return ! request .resource.data .diff (resource .data ).affectedKeys ().hasAny ([' phoneVerified' ])
4040 }
41+ function doesNotChangeMemberCode () {
42+ // memberCode is set at signup and is immutable - only Admin SDK can write it
43+ return ! request .resource.data .diff (resource .data ).affectedKeys ().hasAny ([' memberCode' ])
44+ }
4145 // either the change doesn't include the public field,
4246 // or the user is a base user (i.e. not an org)
4347 function validPublicChange () {
@@ -56,7 +60,7 @@ service cloud.firestore {
5660
5761 // Allow users to make updates except to delete their profile or set the role field.
5862 // Only admins can delete a user profile or set the user role field.
59- allow update : if validUser () && doesNotChangeRole () && validPublicChange () && doesNotChangeNextDigestAt () && doesNotChangePhoneVerified ()
63+ allow update : if validUser () && doesNotChangeRole () && doesNotChangeMemberCode () && validPublicChange () && doesNotChangeNextDigestAt () && doesNotChangePhoneVerified ()
6064 }
6165 // Allow querying publications individually or with a collection group.
6266 match / {path =** }/ publishedTestimony/ {id } {
@@ -99,6 +103,10 @@ service cloud.firestore {
99103 allow read , write : if request .auth.token .get (" role" , " user" ) == " admin"
100104 }
101105 }
106+ match / claimedMemberCodes/ {memberCode } {
107+ allow read : if true ;
108+ allow write : if false ;
109+ }
102110 match / ballotQuestions/ {id } {
103111 allow read : if true ;
104112 allow write : if false ;
0 commit comments