@@ -28,13 +28,12 @@ function decrypt(key, encrypted) {
28
28
29
29
// An "id schema" used to validate Kinto IDs and generate new ones.
30
30
const notesIdSchema = { // eslint-disable-line no-unused-vars
31
- // FIXME: Maybe this should generate IDs?
31
+ // We do not generate ID to keep retrocompatibility with single note version.
32
32
generate ( ) {
33
33
throw new Error ( 'cannot generate IDs' ) ;
34
34
} ,
35
35
36
36
validate ( ) {
37
- // FIXME: verify that at least this matches Kinto server ID format
38
37
return true ;
39
38
} ,
40
39
} ;
@@ -51,6 +50,8 @@ class ServerKeyOlderError extends Error {
51
50
}
52
51
}
53
52
53
+ const deletedNotesStillOnServer = { } ;
54
+
54
55
class JWETransformer {
55
56
constructor ( key ) {
56
57
this . key = key ;
@@ -61,13 +62,10 @@ class JWETransformer {
61
62
const ciphertext = await encrypt ( this . key , record ) ;
62
63
// Copy over the _status field, so that we handle concurrency
63
64
// headers (If-Match, If-None-Match) correctly.
64
- // DON'T copy over "deleted" status, because then we'd leak
65
- // plaintext deletes.
66
- const status = record . _status && ( record . _status === 'deleted' ? 'updated' : record . _status ) ;
67
65
const encryptedResult = {
68
66
content : ciphertext ,
69
67
id : record . id ,
70
- _status : status ,
68
+ _status : record . _status ,
71
69
kid : this . key . kid ,
72
70
} ;
73
71
if ( record . hasOwnProperty ( 'last_modified' ) ) {
@@ -104,6 +102,12 @@ class JWETransformer {
104
102
// If we get such a record, flag it as deleted.
105
103
if ( decoded . _status === 'deleted' ) {
106
104
decoded . deleted = true ;
105
+ // On decode, we flag notes with _status deleted but still on server.
106
+ // We automatically will request deletion for those.
107
+ // (This is due to singleNote replacing 'deleted' state by 'updated')
108
+ // Should be deleted when every user who tried beta runned it once.
109
+ // (see metrics deleteDeleted)
110
+ deletedNotesStillOnServer [ decoded . id ] = decoded ;
107
111
}
108
112
return decoded ;
109
113
}
@@ -261,6 +265,16 @@ function syncKinto(client, credentials) {
261
265
} else if ( error . message === 'Failed to renew token' ) {
262
266
// cannot refresh the access token, log the user out.
263
267
return reconnectSync ( credentials ) ;
268
+ } else if ( error . response
269
+ && error . response . status === 507
270
+ && error . message . includes ( 'Insufficient Storage' ) ) {
271
+
272
+ // cannot refresh the access token, log the user out.
273
+ browser . runtime . sendMessage ( 'notes@mozilla.com' , {
274
+ action : 'error' ,
275
+ message : browser . i18n . getMessage ( 'insufficientStorage' )
276
+ } ) ;
277
+ return Promise . reject ( error ) ;
264
278
}
265
279
console . error ( error ) ; // eslint-disable-line no-console
266
280
reconnectSync ( credentials ) ;
@@ -276,7 +290,18 @@ function reconnectSync(credentials) {
276
290
}
277
291
278
292
function retrieveNote ( client ) {
279
- return client . collection ( 'notes' , { idSchema : notesIdSchema } ) . list ( { } ) ;
293
+ return client
294
+ . collection ( 'notes' , { idSchema : notesIdSchema } )
295
+ . list ( { } )
296
+ . then ( ( list ) => {
297
+ // We delete all notes retrieved from server and not properly deleted
298
+ Object . keys ( deletedNotesStillOnServer ) . forEach ( ( id ) => {
299
+ sendMetrics ( 'delete-deleted-notes' ) ; // eslint-disable-line no-undef
300
+ client . collection ( 'notes' , { idSchema : notesIdSchema } ) . deleteAny ( id ) ;
301
+ } ) ;
302
+
303
+ return list ;
304
+ } ) ;
280
305
}
281
306
282
307
/**
0 commit comments