@@ -87,6 +87,72 @@ service cloud.firestore {
8787 request .auth.uid == resource.data.user
8888 ;
8989 }
90+ match / personalAnalyticEvent/ {user } {
91+ match / objects/ {personalAnalyticEvent } {
92+ allow create : if
93+ // Type checks
94+ request .resource.data.createdWhen is timestamp &&
95+ request .resource.data.type is string &&
96+ (! (' str1' in request .resource.data .keys ()) || request .resource.data.str1 == null || request .resource.data.str1 is string ) &&
97+ (! (' str2' in request .resource.data .keys ()) || request .resource.data.str2 == null || request .resource.data.str2 is string ) &&
98+ (! (' str3' in request .resource.data .keys ()) || request .resource.data.str3 == null || request .resource.data.str3 is string ) &&
99+ (! (' float1' in request .resource.data .keys ()) || request .resource.data.float1 == null || request .resource.data.float1 is number ) &&
100+ (! (' float2' in request .resource.data .keys ()) || request .resource.data.float2 == null || request .resource.data.float2 is number ) &&
101+ (! (' float3' in request .resource.data .keys ()) || request .resource.data.float3 == null || request .resource.data.float3 is number ) &&
102+ (! (' time1' in request .resource.data .keys ()) || request .resource.data.time1 == null || request .resource.data.time1 is timestamp ) &&
103+ (! (' time2' in request .resource.data .keys ()) || request .resource.data.time2 == null || request .resource.data.time2 is timestamp ) &&
104+ (! (' time3' in request .resource.data .keys ()) || request .resource.data.time3 == null || request .resource.data.time3 is timestamp ) &&
105+
106+
107+ // Ownership rules
108+ request .auth.uid == user
109+ ;
110+ allow update : if
111+ // Type checks
112+ (! (' createdWhen' in request .resource.data .keys ()) || request .resource.data.createdWhen is timestamp ) &&
113+ (! (' type' in request .resource.data .keys ()) || request .resource.data.type is string ) &&
114+ (! (' str1' in request .resource.data .keys ()) || request .resource.data.str1 == null || request .resource.data.str1 is string ) &&
115+ (! (' str2' in request .resource.data .keys ()) || request .resource.data.str2 == null || request .resource.data.str2 is string ) &&
116+ (! (' str3' in request .resource.data .keys ()) || request .resource.data.str3 == null || request .resource.data.str3 is string ) &&
117+ (! (' float1' in request .resource.data .keys ()) || request .resource.data.float1 == null || request .resource.data.float1 is number ) &&
118+ (! (' float2' in request .resource.data .keys ()) || request .resource.data.float2 == null || request .resource.data.float2 is number ) &&
119+ (! (' float3' in request .resource.data .keys ()) || request .resource.data.float3 == null || request .resource.data.float3 is number ) &&
120+ (! (' time1' in request .resource.data .keys ()) || request .resource.data.time1 == null || request .resource.data.time1 is timestamp ) &&
121+ (! (' time2' in request .resource.data .keys ()) || request .resource.data.time2 == null || request .resource.data.time2 is timestamp ) &&
122+ (! (' time3' in request .resource.data .keys ()) || request .resource.data.time3 == null || request .resource.data.time3 is timestamp ) &&
123+
124+
125+ // Ownership rules
126+ request .auth.uid == user
127+ ;
128+ }
129+ }
130+ match / personalAnalyticStats/ {user } {
131+ allow get : if
132+ // Ownership rules
133+ request .auth.uid == user
134+ ;
135+ allow create : if
136+ // Type checks
137+ request .resource.data.installedWhen is timestamp &&
138+ (! (' registeredWhen' in request .resource.data .keys ()) || request .resource.data.registeredWhen == null || request .resource.data.registeredWhen is timestamp ) &&
139+ (! (' uninstalledWhen' in request .resource.data .keys ()) || request .resource.data.uninstalledWhen == null || request .resource.data.uninstalledWhen is timestamp ) &&
140+
141+
142+ // Ownership rules
143+ request .auth.uid == user
144+ ;
145+ allow update : if
146+ // Type checks
147+ (! (' installedWhen' in request .resource.data .keys ()) || request .resource.data.installedWhen is timestamp ) &&
148+ (! (' registeredWhen' in request .resource.data .keys ()) || request .resource.data.registeredWhen == null || request .resource.data.registeredWhen is timestamp ) &&
149+ (! (' uninstalledWhen' in request .resource.data .keys ()) || request .resource.data.uninstalledWhen == null || request .resource.data.uninstalledWhen is timestamp ) &&
150+
151+
152+ // Ownership rules
153+ request .auth.uid == user
154+ ;
155+ }
90156 match / sharedList/ {sharedList } {
91157 allow get : if
92158 // Permission rules
@@ -147,6 +213,64 @@ service cloud.firestore {
147213 ;
148214 }
149215 }
216+ match / sharedContentFingerprint/ {sharedContentFingerprint } {
217+ allow get : if
218+ // Permission rules
219+ true
220+ ;
221+ allow create : if
222+ // Type checks
223+ request .resource.data.normalizedUrl is string &&
224+ request .resource.data.fingerprintScheme is string &&
225+ request .resource.data.fingerprint is string &&
226+
227+
228+ // Permission rules
229+ (request .auth.uid == request .resource.data.creator && ((get (/ databases/ $(database )/ documents/ sharedList/ $(request .resource.data.sharedList )).data.creator == request .resource.data.creator ) || (exists (/ databases/ $(database )/ documents/ sharedListRole/ $(request .resource.data.sharedList )/ users/ $(request .auth.uid )) && (get (/ databases/ $(database )/ documents/ sharedListRole/ $(request .resource.data.sharedList )/ users/ $(request .auth.uid )).data.roleID >= 400 ))))
230+ ;
231+ allow update : if
232+ // Type checks
233+ (! (' normalizedUrl' in request .resource.data .keys ()) || request .resource.data.normalizedUrl is string ) &&
234+ (! (' fingerprintScheme' in request .resource.data .keys ()) || request .resource.data.fingerprintScheme is string ) &&
235+ (! (' fingerprint' in request .resource.data .keys ()) || request .resource.data.fingerprint is string ) &&
236+
237+
238+ // Permission rules
239+ (request .auth.uid == resource .data.creator && ((! (' creator' in request .resource.data .keys ())) || request .auth.uid == request .resource.data.creator ) && ((get (/ databases/ $(database )/ documents/ sharedList/ $(request .resource.data.sharedList )).data.creator == request .resource.data.creator ) || (exists (/ databases/ $(database )/ documents/ sharedListRole/ $(request .resource.data.sharedList )/ users/ $(request .auth.uid )) && (get (/ databases/ $(database )/ documents/ sharedListRole/ $(request .resource.data.sharedList )/ users/ $(request .auth.uid )).data.roleID >= 400 ))))
240+ ;
241+ allow delete : if
242+ // Permission rules
243+ (request .auth.uid == resource .data.creator && ((get (/ databases/ $(database )/ documents/ sharedList/ $(resource .data.sharedList )).data.creator == resource .data.creator ) || (exists (/ databases/ $(database )/ documents/ sharedListRole/ $(resource .data.sharedList )/ users/ $(request .auth.uid )) && (get (/ databases/ $(database )/ documents/ sharedListRole/ $(resource .data.sharedList )/ users/ $(request .auth.uid )).data.roleID >= 400 ))))
244+ ;
245+ }
246+ match / sharedContentLocator/ {sharedContentLocator } {
247+ allow get : if
248+ // Permission rules
249+ true
250+ ;
251+ allow create : if
252+ // Type checks
253+ request .resource.data.normalizedUrl is string &&
254+ request .resource.data.originalUrl is string &&
255+
256+
257+ // Permission rules
258+ (request .auth.uid == request .resource.data.creator && ((get (/ databases/ $(database )/ documents/ sharedList/ $(request .resource.data.sharedList )).data.creator == request .resource.data.creator ) || (exists (/ databases/ $(database )/ documents/ sharedListRole/ $(request .resource.data.sharedList )/ users/ $(request .auth.uid )) && (get (/ databases/ $(database )/ documents/ sharedListRole/ $(request .resource.data.sharedList )/ users/ $(request .auth.uid )).data.roleID >= 400 ))))
259+ ;
260+ allow update : if
261+ // Type checks
262+ (! (' normalizedUrl' in request .resource.data .keys ()) || request .resource.data.normalizedUrl is string ) &&
263+ (! (' originalUrl' in request .resource.data .keys ()) || request .resource.data.originalUrl is string ) &&
264+
265+
266+ // Permission rules
267+ (request .auth.uid == resource .data.creator && ((! (' creator' in request .resource.data .keys ())) || request .auth.uid == request .resource.data.creator ) && ((get (/ databases/ $(database )/ documents/ sharedList/ $(request .resource.data.sharedList )).data.creator == request .resource.data.creator ) || (exists (/ databases/ $(database )/ documents/ sharedListRole/ $(request .resource.data.sharedList )/ users/ $(request .auth.uid )) && (get (/ databases/ $(database )/ documents/ sharedListRole/ $(request .resource.data.sharedList )/ users/ $(request .auth.uid )).data.roleID >= 400 ))))
268+ ;
269+ allow delete : if
270+ // Permission rules
271+ (request .auth.uid == resource .data.creator && ((get (/ databases/ $(database )/ documents/ sharedList/ $(resource .data.sharedList )).data.creator == resource .data.creator ) || (exists (/ databases/ $(database )/ documents/ sharedListRole/ $(resource .data.sharedList )/ users/ $(request .auth.uid )) && (get (/ databases/ $(database )/ documents/ sharedListRole/ $(resource .data.sharedList )/ users/ $(request .auth.uid )).data.roleID >= 400 ))))
272+ ;
273+ }
150274 match / sharedListEntry/ {sharedListEntry } {
151275 allow get : if
152276 // Permission rules
@@ -980,6 +1104,8 @@ service cloud.firestore {
9801104 request .resource.data.primary is bool &&
9811105 request .resource.data.valid is bool &&
9821106 request .resource.data.version is timestamp &&
1107+ (! (' localId' in request .resource.data .keys ()) || request .resource.data.localId == null || request .resource.data.localId is string ) &&
1108+ (! (' fingerprintScheme' in request .resource.data .keys ()) || request .resource.data.fingerprintScheme == null || request .resource.data.fingerprintScheme is string ) &&
9831109 (! (' fingerprint' in request .resource.data .keys ()) || request .resource.data.fingerprint == null || request .resource.data.fingerprint is string ) &&
9841110 (! (' lastVisited' in request .resource.data .keys ()) || request .resource.data.lastVisited == null || request .resource.data.lastVisited is timestamp ) &&
9851111 (! (' contentSize' in request .resource.data .keys ()) || request .resource.data.contentSize == null || request .resource.data.contentSize is number ) &&
@@ -1000,6 +1126,8 @@ service cloud.firestore {
10001126 (! (' primary' in request .resource.data .keys ()) || request .resource.data.primary is bool ) &&
10011127 (! (' valid' in request .resource.data .keys ()) || request .resource.data.valid is bool ) &&
10021128 (! (' version' in request .resource.data .keys ()) || request .resource.data.version is timestamp ) &&
1129+ (! (' localId' in request .resource.data .keys ()) || request .resource.data.localId == null || request .resource.data.localId is string ) &&
1130+ (! (' fingerprintScheme' in request .resource.data .keys ()) || request .resource.data.fingerprintScheme == null || request .resource.data.fingerprintScheme is string ) &&
10031131 (! (' fingerprint' in request .resource.data .keys ()) || request .resource.data.fingerprint == null || request .resource.data.fingerprint is string ) &&
10041132 (! (' lastVisited' in request .resource.data .keys ()) || request .resource.data.lastVisited == null || request .resource.data.lastVisited is timestamp ) &&
10051133 (! (' contentSize' in request .resource.data .keys ()) || request .resource.data.contentSize == null || request .resource.data.contentSize is number ) &&
0 commit comments