@@ -72,6 +72,28 @@ const AUTO_ADD_RULE_FOR = {
72
72
BASE_DOMAIN : 2 ,
73
73
} ;
74
74
75
+ /**
76
+ * Exported DKIM user signing rule.
77
+ *
78
+ * @typedef {object } DkimExportedUserSignRule
79
+ * @property {string } domain
80
+ * @property {string } listId
81
+ * @property {string } addr
82
+ * @property {string } sdid - space separated list of SDIDs
83
+ * @property {number } type
84
+ * @property {number } priority
85
+ * @property {boolean } enabled
86
+ */
87
+
88
+ /**
89
+ * Exported DKIM user signing rules.
90
+ *
91
+ * @typedef {object } DkimExportedUserSignRules
92
+ * @property {"DkimExportedUserSignRules" } dataId
93
+ * @property {1 } dataFormatVersion
94
+ * @property {DkimExportedUserSignRule[] } rules
95
+ */
96
+
75
97
/**
76
98
* DKIM user signing rule.
77
99
*
@@ -372,6 +394,56 @@ export default class SignRules {
372
394
return userRules ;
373
395
}
374
396
397
+ /**
398
+ * Get the user sign rules in the export format.
399
+ *
400
+ * @returns {Promise<DkimExportedUserSignRules> }
401
+ */
402
+ static async exportUserRules ( ) {
403
+ /** @type {{id?: number, domain: string, listId: string, addr: string, sdid: string, type: number, priority: number, enabled: boolean }[] } */
404
+ const rules = copy ( await this . getUserRules ( ) ) ;
405
+ rules . map ( rule => { delete rule . id ; return rule ; } ) ;
406
+ return {
407
+ dataId : "DkimExportedUserSignRules" ,
408
+ dataFormatVersion : 1 ,
409
+ rules,
410
+ } ;
411
+ }
412
+
413
+ /**
414
+ * Import the given user sign rules.
415
+ * Existing rules will be overridden.
416
+ *
417
+ * @param {{dataId: string, dataFormatVersion: number} } data
418
+ * @returns {Promise<void> }
419
+ */
420
+ static async importUserRules ( data ) {
421
+ if ( data . dataId !== "DkimExportedUserSignRules" ) {
422
+ // TODO: proper translated error message
423
+ log . error ( data . dataId ) ;
424
+ throw new Error ( "Unknown data" ) ;
425
+ }
426
+ if ( data . dataFormatVersion !== 1 ) {
427
+ // TODO: proper translated error message
428
+ throw new Error ( "Unsupported format of exported rules" ) ;
429
+ }
430
+ /** @type {DkimExportedUserSignRules } */
431
+ // @ts -expect-error
432
+ const exportedRules = data ;
433
+
434
+ // Costly but easy way to ensure a race condition with loading the rules does not happen.
435
+ await loadUserRules ( ) ;
436
+
437
+ let maxId = 0 ;
438
+ userRules = exportedRules . rules . map ( rule => ( { id : ++ maxId , ...rule } ) ) ;
439
+ userRulesMaxId = maxId ;
440
+
441
+ await storeUserRules ( ) ;
442
+
443
+ browser . runtime . sendMessage ( { event : "ruleAdded" } ) .
444
+ catch ( error => log . debug ( "Error sending ruleAdded event" , error ) ) ;
445
+ }
446
+
375
447
/**
376
448
* Checks the DKIM result against the sign rules.
377
449
*
@@ -658,6 +730,14 @@ export function initSignRulesProxy() {
658
730
// eslint-disable-next-line consistent-return
659
731
return SignRules . getUserRules ( ) ;
660
732
}
733
+ if ( request . method === "exportUserRules" ) {
734
+ // eslint-disable-next-line consistent-return
735
+ return SignRules . exportUserRules ( ) ;
736
+ }
737
+ if ( request . method === "importUserRules" ) {
738
+ // eslint-disable-next-line consistent-return
739
+ return SignRules . importUserRules ( request . parameters . data ) ;
740
+ }
661
741
if ( request . method === "updateRule" ) {
662
742
// eslint-disable-next-line consistent-return
663
743
return SignRules . updateRule ( request . parameters . id , request . parameters . propertyName , request . parameters . newValue ) ;
0 commit comments