@fiduswriter/editor 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/README.md +22 -0
- package/dist/bibliography/tools.js +53 -0
- package/dist/bibliography/tools.js.map +1 -0
- package/dist/citations/index.js +339 -0
- package/dist/citations/index.js.map +1 -0
- package/dist/citations/render.js +47 -0
- package/dist/citations/render.js.map +1 -0
- package/dist/clipboard/copy/index.js +2 -0
- package/dist/clipboard/copy/index.js.map +1 -0
- package/dist/clipboard/copy/schema.js +54 -0
- package/dist/clipboard/copy/schema.js.map +1 -0
- package/dist/clipboard/copy/serializers.js +132 -0
- package/dist/clipboard/copy/serializers.js.map +1 -0
- package/dist/clipboard/paste/fidus_writer.js +45 -0
- package/dist/clipboard/paste/fidus_writer.js.map +1 -0
- package/dist/clipboard/paste/general.js +76 -0
- package/dist/clipboard/paste/general.js.map +1 -0
- package/dist/clipboard/paste/google_docs.js +24 -0
- package/dist/clipboard/paste/google_docs.js.map +1 -0
- package/dist/clipboard/paste/html.js +68 -0
- package/dist/clipboard/paste/html.js.map +1 -0
- package/dist/clipboard/paste/index.js +3 -0
- package/dist/clipboard/paste/index.js.map +1 -0
- package/dist/clipboard/paste/libreoffice_writer.js +27 -0
- package/dist/clipboard/paste/libreoffice_writer.js.map +1 -0
- package/dist/clipboard/paste/microsoft_word.js +79 -0
- package/dist/clipboard/paste/microsoft_word.js.map +1 -0
- package/dist/clipboard/paste/text.js +41 -0
- package/dist/clipboard/paste/text.js.map +1 -0
- package/dist/collab/chat.js +154 -0
- package/dist/collab/chat.js.map +1 -0
- package/dist/collab/colors.js +62 -0
- package/dist/collab/colors.js.map +1 -0
- package/dist/collab/doc.js +1090 -0
- package/dist/collab/doc.js.map +1 -0
- package/dist/collab/index.js +75 -0
- package/dist/collab/index.js.map +1 -0
- package/dist/collab/merge/changeset.js +90 -0
- package/dist/collab/merge/changeset.js.map +1 -0
- package/dist/collab/merge/editor.js +708 -0
- package/dist/collab/merge/editor.js.map +1 -0
- package/dist/collab/merge/footnotes.js +149 -0
- package/dist/collab/merge/footnotes.js.map +1 -0
- package/dist/collab/merge/index.js +270 -0
- package/dist/collab/merge/index.js.map +1 -0
- package/dist/collab/merge/recreate_transform.js +259 -0
- package/dist/collab/merge/recreate_transform.js.map +1 -0
- package/dist/collab/merge/schema.js +117 -0
- package/dist/collab/merge/schema.js.map +1 -0
- package/dist/collab/merge/state_plugins/action.js +138 -0
- package/dist/collab/merge/state_plugins/action.js.map +1 -0
- package/dist/collab/merge/state_plugins/clipboard.js +32 -0
- package/dist/collab/merge/state_plugins/clipboard.js.map +1 -0
- package/dist/collab/merge/state_plugins/diff.js +541 -0
- package/dist/collab/merge/state_plugins/diff.js.map +1 -0
- package/dist/collab/merge/state_plugins/index.js +3 -0
- package/dist/collab/merge/state_plugins/index.js.map +1 -0
- package/dist/collab/merge/tools.js +175 -0
- package/dist/collab/merge/tools.js.map +1 -0
- package/dist/collab/templates.js +10 -0
- package/dist/collab/templates.js.map +1 -0
- package/dist/comments/comment.js +17 -0
- package/dist/comments/comment.js.map +1 -0
- package/dist/comments/editors/answer.js +43 -0
- package/dist/comments/editors/answer.js.map +1 -0
- package/dist/comments/editors/comment.js +278 -0
- package/dist/comments/editors/comment.js.map +1 -0
- package/dist/comments/editors/index.js +4 -0
- package/dist/comments/editors/index.js.map +1 -0
- package/dist/comments/editors/notify.js +13 -0
- package/dist/comments/editors/notify.js.map +1 -0
- package/dist/comments/editors/schema.js +60 -0
- package/dist/comments/editors/schema.js.map +1 -0
- package/dist/comments/index.js +11 -0
- package/dist/comments/index.js.map +1 -0
- package/dist/comments/interactions.js +379 -0
- package/dist/comments/interactions.js.map +1 -0
- package/dist/comments/store.js +438 -0
- package/dist/comments/store.js.map +1 -0
- package/dist/contacts/add_dialog.js +88 -0
- package/dist/contacts/add_dialog.js.map +1 -0
- package/dist/contacts/templates.js +23 -0
- package/dist/contacts/templates.js.map +1 -0
- package/dist/copyright_dialog/index.js +148 -0
- package/dist/copyright_dialog/index.js.map +1 -0
- package/dist/copyright_dialog/templates.js +48 -0
- package/dist/copyright_dialog/templates.js.map +1 -0
- package/dist/databases/bibliography.js +162 -0
- package/dist/databases/bibliography.js.map +1 -0
- package/dist/databases/images.js +260 -0
- package/dist/databases/images.js.map +1 -0
- package/dist/databases/index.js +55 -0
- package/dist/databases/index.js.map +1 -0
- package/dist/dialogs/citation.js +321 -0
- package/dist/dialogs/citation.js.map +1 -0
- package/dist/dialogs/code_block.js +192 -0
- package/dist/dialogs/code_block.js.map +1 -0
- package/dist/dialogs/contributor.js +132 -0
- package/dist/dialogs/contributor.js.map +1 -0
- package/dist/dialogs/figure.js +378 -0
- package/dist/dialogs/figure.js.map +1 -0
- package/dist/dialogs/index.js +11 -0
- package/dist/dialogs/index.js.map +1 -0
- package/dist/dialogs/language.js +47 -0
- package/dist/dialogs/language.js.map +1 -0
- package/dist/dialogs/link.js +243 -0
- package/dist/dialogs/link.js.map +1 -0
- package/dist/dialogs/math.js +121 -0
- package/dist/dialogs/math.js.map +1 -0
- package/dist/dialogs/ordered_list.js +67 -0
- package/dist/dialogs/ordered_list.js.map +1 -0
- package/dist/dialogs/revision.js +36 -0
- package/dist/dialogs/revision.js.map +1 -0
- package/dist/dialogs/subsup.js +109 -0
- package/dist/dialogs/subsup.js.map +1 -0
- package/dist/dialogs/table.js +217 -0
- package/dist/dialogs/table.js.map +1 -0
- package/dist/dialogs/templates.js +366 -0
- package/dist/dialogs/templates.js.map +1 -0
- package/dist/document_template/exporter.js +83 -0
- package/dist/document_template/exporter.js.map +1 -0
- package/dist/document_template/index.js +327 -0
- package/dist/document_template/index.js.map +1 -0
- package/dist/documents/access_rights/index.js +532 -0
- package/dist/documents/access_rights/index.js.map +1 -0
- package/dist/documents/access_rights/templates.js +150 -0
- package/dist/documents/access_rights/templates.js.map +1 -0
- package/dist/e2ee/encryptor.js +201 -0
- package/dist/e2ee/encryptor.js.map +1 -0
- package/dist/e2ee/key-manager.js +171 -0
- package/dist/e2ee/key-manager.js.map +1 -0
- package/dist/e2ee/passphrase-crypto.js +365 -0
- package/dist/e2ee/passphrase-crypto.js.map +1 -0
- package/dist/e2ee/passphrase-dialog.js +548 -0
- package/dist/e2ee/passphrase-dialog.js.map +1 -0
- package/dist/e2ee/passphrase-manager.js +350 -0
- package/dist/e2ee/passphrase-manager.js.map +1 -0
- package/dist/e2ee/password-dialog.js +552 -0
- package/dist/e2ee/password-dialog.js.map +1 -0
- package/dist/e2ee/snapshot-manager.js +238 -0
- package/dist/e2ee/snapshot-manager.js.map +1 -0
- package/dist/exporter/native/copy.js +29 -0
- package/dist/exporter/native/copy.js.map +1 -0
- package/dist/exporter/native/file.js +19 -0
- package/dist/exporter/native/file.js.map +1 -0
- package/dist/exporter/native/index.js +4 -0
- package/dist/exporter/native/index.js.map +1 -0
- package/dist/exporter/native/revision.js +54 -0
- package/dist/exporter/native/revision.js.map +1 -0
- package/dist/exporter/native/zip.js +2 -0
- package/dist/exporter/native/zip.js.map +1 -0
- package/dist/footnotes/editor.js +180 -0
- package/dist/footnotes/editor.js.map +1 -0
- package/dist/footnotes/index.js +15 -0
- package/dist/footnotes/index.js.map +1 -0
- package/dist/footnotes/layout.js +125 -0
- package/dist/footnotes/layout.js.map +1 -0
- package/dist/footnotes/state_plugins/access_rights.js +25 -0
- package/dist/footnotes/state_plugins/access_rights.js.map +1 -0
- package/dist/footnotes/state_plugins/index.js +2 -0
- package/dist/footnotes/state_plugins/index.js.map +1 -0
- package/dist/images/edit_dialog/edit_dialog/index.js +186 -0
- package/dist/images/edit_dialog/edit_dialog/index.js.map +1 -0
- package/dist/images/edit_dialog/edit_dialog/model.js +152 -0
- package/dist/images/edit_dialog/edit_dialog/model.js.map +1 -0
- package/dist/images/edit_dialog/edit_dialog/templates.js +33 -0
- package/dist/images/edit_dialog/edit_dialog/templates.js.map +1 -0
- package/dist/images/edit_dialog/model.js +6 -0
- package/dist/images/edit_dialog/model.js.map +1 -0
- package/dist/images/selection_dialog/index.js +149 -0
- package/dist/images/selection_dialog/index.js.map +1 -0
- package/dist/index.js +1002 -0
- package/dist/index.js.map +1 -0
- package/dist/keymap.js +73 -0
- package/dist/keymap.js.map +1 -0
- package/dist/marginboxes/index.js +674 -0
- package/dist/marginboxes/index.js.map +1 -0
- package/dist/marginboxes/templates.js +447 -0
- package/dist/marginboxes/templates.js.map +1 -0
- package/dist/menus/code_block/index.js +2 -0
- package/dist/menus/code_block/index.js.map +1 -0
- package/dist/menus/code_block/model.js +49 -0
- package/dist/menus/code_block/model.js.map +1 -0
- package/dist/menus/figure/index.js +3 -0
- package/dist/menus/figure/index.js.map +1 -0
- package/dist/menus/figure/model.js +80 -0
- package/dist/menus/figure/model.js.map +1 -0
- package/dist/menus/figure/utils.js +6 -0
- package/dist/menus/figure/utils.js.map +1 -0
- package/dist/menus/headerbar/index.js +3 -0
- package/dist/menus/headerbar/index.js.map +1 -0
- package/dist/menus/headerbar/model.js +743 -0
- package/dist/menus/headerbar/model.js.map +1 -0
- package/dist/menus/headerbar/view.js +579 -0
- package/dist/menus/headerbar/view.js.map +1 -0
- package/dist/menus/image/index.js +2 -0
- package/dist/menus/image/index.js.map +1 -0
- package/dist/menus/image/model.js +32 -0
- package/dist/menus/image/model.js.map +1 -0
- package/dist/menus/index.js +10 -0
- package/dist/menus/index.js.map +1 -0
- package/dist/menus/navigator/index.js +2 -0
- package/dist/menus/navigator/index.js.map +1 -0
- package/dist/menus/navigator/model.js +29 -0
- package/dist/menus/navigator/model.js.map +1 -0
- package/dist/menus/ordered_list/index.js +2 -0
- package/dist/menus/ordered_list/index.js.map +1 -0
- package/dist/menus/ordered_list/model.js +17 -0
- package/dist/menus/ordered_list/model.js.map +1 -0
- package/dist/menus/selection/index.js +3 -0
- package/dist/menus/selection/index.js.map +1 -0
- package/dist/menus/selection/model.js +108 -0
- package/dist/menus/selection/model.js.map +1 -0
- package/dist/menus/selection/view.js +125 -0
- package/dist/menus/selection/view.js.map +1 -0
- package/dist/menus/table/index.js +2 -0
- package/dist/menus/table/index.js.map +1 -0
- package/dist/menus/table/model.js +319 -0
- package/dist/menus/table/model.js.map +1 -0
- package/dist/menus/toolbar/index.js +3 -0
- package/dist/menus/toolbar/index.js.map +1 -0
- package/dist/menus/toolbar/model.js +747 -0
- package/dist/menus/toolbar/model.js.map +1 -0
- package/dist/menus/toolbar/view.js +314 -0
- package/dist/menus/toolbar/view.js.map +1 -0
- package/dist/navigator/index.js +435 -0
- package/dist/navigator/index.js.map +1 -0
- package/dist/no_collab_save/index.js +169 -0
- package/dist/no_collab_save/index.js.map +1 -0
- package/dist/plugins/citation_dialog/index.js +2 -0
- package/dist/plugins/citation_dialog/index.js.map +1 -0
- package/dist/plugins/editor/index.js +2 -0
- package/dist/plugins/editor/index.js.map +1 -0
- package/dist/state_plugins/access_rights.js +30 -0
- package/dist/state_plugins/access_rights.js.map +1 -0
- package/dist/state_plugins/citation_render.js +78 -0
- package/dist/state_plugins/citation_render.js.map +1 -0
- package/dist/state_plugins/clipboard.js +217 -0
- package/dist/state_plugins/clipboard.js.map +1 -0
- package/dist/state_plugins/code_block.js +165 -0
- package/dist/state_plugins/code_block.js.map +1 -0
- package/dist/state_plugins/collab_carets.js +115 -0
- package/dist/state_plugins/collab_carets.js.map +1 -0
- package/dist/state_plugins/comments.js +197 -0
- package/dist/state_plugins/comments.js.map +1 -0
- package/dist/state_plugins/contributor_input/add_button.js +101 -0
- package/dist/state_plugins/contributor_input/add_button.js.map +1 -0
- package/dist/state_plugins/contributor_input/dropup.js +273 -0
- package/dist/state_plugins/contributor_input/dropup.js.map +1 -0
- package/dist/state_plugins/contributor_input/helpers.js +23 -0
- package/dist/state_plugins/contributor_input/helpers.js.map +1 -0
- package/dist/state_plugins/contributor_input/index.js +3 -0
- package/dist/state_plugins/contributor_input/index.js.map +1 -0
- package/dist/state_plugins/contributor_input/node_view.js +76 -0
- package/dist/state_plugins/contributor_input/node_view.js.map +1 -0
- package/dist/state_plugins/contributor_input/plugin.js +236 -0
- package/dist/state_plugins/contributor_input/plugin.js.map +1 -0
- package/dist/state_plugins/document_template.js +213 -0
- package/dist/state_plugins/document_template.js.map +1 -0
- package/dist/state_plugins/figure.js +90 -0
- package/dist/state_plugins/figure.js.map +1 -0
- package/dist/state_plugins/footnote_markers.js +187 -0
- package/dist/state_plugins/footnote_markers.js.map +1 -0
- package/dist/state_plugins/headerbar.js +10 -0
- package/dist/state_plugins/headerbar.js.map +1 -0
- package/dist/state_plugins/index.js +27 -0
- package/dist/state_plugins/index.js.map +1 -0
- package/dist/state_plugins/inline_math.js +719 -0
- package/dist/state_plugins/inline_math.js.map +1 -0
- package/dist/state_plugins/inline_reference/dropup.js +182 -0
- package/dist/state_plugins/inline_reference/dropup.js.map +1 -0
- package/dist/state_plugins/inline_reference/index.js +2 -0
- package/dist/state_plugins/inline_reference/index.js.map +1 -0
- package/dist/state_plugins/inline_reference/plugin.js +1134 -0
- package/dist/state_plugins/inline_reference/plugin.js.map +1 -0
- package/dist/state_plugins/jump_hidden_nodes.js +47 -0
- package/dist/state_plugins/jump_hidden_nodes.js.map +1 -0
- package/dist/state_plugins/links.js +622 -0
- package/dist/state_plugins/links.js.map +1 -0
- package/dist/state_plugins/marginboxes.js +13 -0
- package/dist/state_plugins/marginboxes.js.map +1 -0
- package/dist/state_plugins/ordered_list_menu.js +72 -0
- package/dist/state_plugins/ordered_list_menu.js.map +1 -0
- package/dist/state_plugins/placeholders.js +98 -0
- package/dist/state_plugins/placeholders.js.map +1 -0
- package/dist/state_plugins/search.js +212 -0
- package/dist/state_plugins/search.js.map +1 -0
- package/dist/state_plugins/selection_menu.js +10 -0
- package/dist/state_plugins/selection_menu.js.map +1 -0
- package/dist/state_plugins/settings.js +191 -0
- package/dist/state_plugins/settings.js.map +1 -0
- package/dist/state_plugins/table.js +104 -0
- package/dist/state_plugins/table.js.map +1 -0
- package/dist/state_plugins/tag_input/helpers.js +55 -0
- package/dist/state_plugins/tag_input/helpers.js.map +1 -0
- package/dist/state_plugins/tag_input/index.js +3 -0
- package/dist/state_plugins/tag_input/index.js.map +1 -0
- package/dist/state_plugins/tag_input/node_view.js +77 -0
- package/dist/state_plugins/tag_input/node_view.js.map +1 -0
- package/dist/state_plugins/tag_input/plugin.js +199 -0
- package/dist/state_plugins/tag_input/plugin.js.map +1 -0
- package/dist/state_plugins/tag_input/tag_editor.js +159 -0
- package/dist/state_plugins/tag_input/tag_editor.js.map +1 -0
- package/dist/state_plugins/tag_input/tag_editor_plugins.js +61 -0
- package/dist/state_plugins/tag_input/tag_editor_plugins.js.map +1 -0
- package/dist/state_plugins/toc_render.js +142 -0
- package/dist/state_plugins/toc_render.js.map +1 -0
- package/dist/state_plugins/toolbar.js +10 -0
- package/dist/state_plugins/toolbar.js.map +1 -0
- package/dist/state_plugins/track/find_selected_changes.js +82 -0
- package/dist/state_plugins/track/find_selected_changes.js.map +1 -0
- package/dist/state_plugins/track/helpers.js +67 -0
- package/dist/state_plugins/track/helpers.js.map +1 -0
- package/dist/state_plugins/track/index.js +3 -0
- package/dist/state_plugins/track/index.js.map +1 -0
- package/dist/state_plugins/track/plugin.js +114 -0
- package/dist/state_plugins/track/plugin.js.map +1 -0
- package/dist/tools/index.js +4 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/key_bindings/index.js +20 -0
- package/dist/tools/key_bindings/index.js.map +1 -0
- package/dist/tools/key_bindings/templates.js +68 -0
- package/dist/tools/key_bindings/templates.js.map +1 -0
- package/dist/tools/search_replace/index.js +275 -0
- package/dist/tools/search_replace/index.js.map +1 -0
- package/dist/tools/search_replace/templates.js +18 -0
- package/dist/tools/search_replace/templates.js.map +1 -0
- package/dist/tools/word_count/index.js +40 -0
- package/dist/tools/word_count/index.js.map +1 -0
- package/dist/tools/word_count/templates.js +27 -0
- package/dist/tools/word_count/templates.js.map +1 -0
- package/dist/track/accept.js +66 -0
- package/dist/track/accept.js.map +1 -0
- package/dist/track/accept_all.js +51 -0
- package/dist/track/accept_all.js.map +1 -0
- package/dist/track/accept_all_no_insertions.js +63 -0
- package/dist/track/accept_all_no_insertions.js.map +1 -0
- package/dist/track/amend_transaction.js +390 -0
- package/dist/track/amend_transaction.js.map +1 -0
- package/dist/track/delete.js +62 -0
- package/dist/track/delete.js.map +1 -0
- package/dist/track/index.js +6 -0
- package/dist/track/index.js.map +1 -0
- package/dist/track/mod.js +86 -0
- package/dist/track/mod.js.map +1 -0
- package/dist/track/reject.js +67 -0
- package/dist/track/reject.js.map +1 -0
- package/dist/track/reject_all.js +56 -0
- package/dist/track/reject_all.js.map +1 -0
- package/package.json +80 -0
- package/src/bibliography/tools.js +58 -0
- package/src/citations/index.js +443 -0
- package/src/citations/render.js +68 -0
- package/src/clipboard/copy/index.js +1 -0
- package/src/clipboard/copy/schema.js +62 -0
- package/src/clipboard/copy/serializers.js +179 -0
- package/src/clipboard/paste/fidus_writer.js +55 -0
- package/src/clipboard/paste/general.js +80 -0
- package/src/clipboard/paste/google_docs.js +26 -0
- package/src/clipboard/paste/html.js +76 -0
- package/src/clipboard/paste/index.js +2 -0
- package/src/clipboard/paste/libreoffice_writer.js +32 -0
- package/src/clipboard/paste/microsoft_word.js +87 -0
- package/src/clipboard/paste/text.js +58 -0
- package/src/collab/chat.js +195 -0
- package/src/collab/colors.js +67 -0
- package/src/collab/doc.js +1436 -0
- package/src/collab/index.js +81 -0
- package/src/collab/merge/changeset.js +103 -0
- package/src/collab/merge/editor.js +1065 -0
- package/src/collab/merge/footnotes.js +175 -0
- package/src/collab/merge/index.js +401 -0
- package/src/collab/merge/recreate_transform.js +326 -0
- package/src/collab/merge/schema.js +135 -0
- package/src/collab/merge/state_plugins/action.js +171 -0
- package/src/collab/merge/state_plugins/clipboard.js +32 -0
- package/src/collab/merge/state_plugins/diff.js +780 -0
- package/src/collab/merge/state_plugins/index.js +2 -0
- package/src/collab/merge/tools.js +217 -0
- package/src/collab/templates.js +10 -0
- package/src/comments/comment.js +29 -0
- package/src/comments/editors/answer.js +55 -0
- package/src/comments/editors/comment.js +318 -0
- package/src/comments/editors/index.js +4 -0
- package/src/comments/editors/notify.js +13 -0
- package/src/comments/editors/schema.js +65 -0
- package/src/comments/index.js +11 -0
- package/src/comments/interactions.js +465 -0
- package/src/comments/store.js +513 -0
- package/src/contacts/add_dialog.js +110 -0
- package/src/contacts/templates.js +28 -0
- package/src/copyright_dialog/index.js +179 -0
- package/src/copyright_dialog/templates.js +56 -0
- package/src/databases/bibliography.js +179 -0
- package/src/databases/images.js +320 -0
- package/src/databases/index.js +69 -0
- package/src/dialogs/citation.js +428 -0
- package/src/dialogs/code_block.js +242 -0
- package/src/dialogs/contributor.js +173 -0
- package/src/dialogs/figure.js +479 -0
- package/src/dialogs/index.js +10 -0
- package/src/dialogs/language.js +58 -0
- package/src/dialogs/link.js +358 -0
- package/src/dialogs/math.js +148 -0
- package/src/dialogs/ordered_list.js +84 -0
- package/src/dialogs/revision.js +43 -0
- package/src/dialogs/subsup.js +116 -0
- package/src/dialogs/table.js +258 -0
- package/src/dialogs/templates.js +426 -0
- package/src/document_template/exporter.js +97 -0
- package/src/document_template/index.js +483 -0
- package/src/documents/access_rights/index.js +693 -0
- package/src/documents/access_rights/templates.js +178 -0
- package/src/e2ee/encryptor.js +228 -0
- package/src/e2ee/key-manager.js +202 -0
- package/src/e2ee/passphrase-crypto.js +606 -0
- package/src/e2ee/passphrase-dialog.js +655 -0
- package/src/e2ee/passphrase-manager.js +502 -0
- package/src/e2ee/password-dialog.js +652 -0
- package/src/e2ee/snapshot-manager.js +305 -0
- package/src/exporter/native/copy.js +54 -0
- package/src/exporter/native/file.js +37 -0
- package/src/exporter/native/index.js +3 -0
- package/src/exporter/native/revision.js +86 -0
- package/src/exporter/native/zip.js +1 -0
- package/src/footnotes/editor.js +227 -0
- package/src/footnotes/index.js +16 -0
- package/src/footnotes/layout.js +190 -0
- package/src/footnotes/state_plugins/access_rights.js +39 -0
- package/src/footnotes/state_plugins/index.js +1 -0
- package/src/images/edit_dialog/edit_dialog/index.js +222 -0
- package/src/images/edit_dialog/edit_dialog/model.js +183 -0
- package/src/images/edit_dialog/edit_dialog/templates.js +41 -0
- package/src/images/edit_dialog/model.js +5 -0
- package/src/images/selection_dialog/index.js +176 -0
- package/src/index.js +1252 -0
- package/src/keymap.js +102 -0
- package/src/marginboxes/index.js +946 -0
- package/src/marginboxes/templates.js +573 -0
- package/src/menus/code_block/index.js +1 -0
- package/src/menus/code_block/model.js +52 -0
- package/src/menus/figure/index.js +2 -0
- package/src/menus/figure/model.js +91 -0
- package/src/menus/figure/utils.js +5 -0
- package/src/menus/headerbar/index.js +2 -0
- package/src/menus/headerbar/model.js +1077 -0
- package/src/menus/headerbar/view.js +675 -0
- package/src/menus/image/index.js +1 -0
- package/src/menus/image/model.js +32 -0
- package/src/menus/index.js +9 -0
- package/src/menus/navigator/index.js +1 -0
- package/src/menus/navigator/model.js +28 -0
- package/src/menus/ordered_list/index.js +1 -0
- package/src/menus/ordered_list/model.js +19 -0
- package/src/menus/selection/index.js +2 -0
- package/src/menus/selection/model.js +134 -0
- package/src/menus/selection/view.js +154 -0
- package/src/menus/table/index.js +1 -0
- package/src/menus/table/model.js +414 -0
- package/src/menus/toolbar/index.js +2 -0
- package/src/menus/toolbar/model.js +920 -0
- package/src/menus/toolbar/view.js +354 -0
- package/src/navigator/index.js +515 -0
- package/src/no_collab_save/index.js +209 -0
- package/src/plugins/citation_dialog/index.js +1 -0
- package/src/plugins/editor/index.js +1 -0
- package/src/state_plugins/access_rights.js +47 -0
- package/src/state_plugins/citation_render.js +88 -0
- package/src/state_plugins/clipboard.js +289 -0
- package/src/state_plugins/code_block.js +201 -0
- package/src/state_plugins/collab_carets.js +152 -0
- package/src/state_plugins/comments.js +259 -0
- package/src/state_plugins/contributor_input/add_button.js +134 -0
- package/src/state_plugins/contributor_input/dropup.js +318 -0
- package/src/state_plugins/contributor_input/helpers.js +24 -0
- package/src/state_plugins/contributor_input/index.js +2 -0
- package/src/state_plugins/contributor_input/node_view.js +86 -0
- package/src/state_plugins/contributor_input/plugin.js +318 -0
- package/src/state_plugins/document_template.js +315 -0
- package/src/state_plugins/figure.js +108 -0
- package/src/state_plugins/footnote_markers.js +238 -0
- package/src/state_plugins/headerbar.js +12 -0
- package/src/state_plugins/index.js +73 -0
- package/src/state_plugins/inline_math.js +918 -0
- package/src/state_plugins/inline_reference/dropup.js +208 -0
- package/src/state_plugins/inline_reference/index.js +5 -0
- package/src/state_plugins/inline_reference/plugin.js +1429 -0
- package/src/state_plugins/jump_hidden_nodes.js +58 -0
- package/src/state_plugins/links.js +830 -0
- package/src/state_plugins/marginboxes.js +14 -0
- package/src/state_plugins/ordered_list_menu.js +84 -0
- package/src/state_plugins/placeholders.js +123 -0
- package/src/state_plugins/search.js +251 -0
- package/src/state_plugins/selection_menu.js +12 -0
- package/src/state_plugins/settings.js +223 -0
- package/src/state_plugins/table.js +127 -0
- package/src/state_plugins/tag_input/helpers.js +69 -0
- package/src/state_plugins/tag_input/index.js +2 -0
- package/src/state_plugins/tag_input/node_view.js +85 -0
- package/src/state_plugins/tag_input/plugin.js +278 -0
- package/src/state_plugins/tag_input/tag_editor.js +202 -0
- package/src/state_plugins/tag_input/tag_editor_plugins.js +74 -0
- package/src/state_plugins/toc_render.js +160 -0
- package/src/state_plugins/toolbar.js +12 -0
- package/src/state_plugins/track/find_selected_changes.js +107 -0
- package/src/state_plugins/track/helpers.js +108 -0
- package/src/state_plugins/track/index.js +6 -0
- package/src/state_plugins/track/plugin.js +140 -0
- package/src/tools/index.js +3 -0
- package/src/tools/key_bindings/index.js +21 -0
- package/src/tools/key_bindings/templates.js +68 -0
- package/src/tools/search_replace/index.js +421 -0
- package/src/tools/search_replace/templates.js +19 -0
- package/src/tools/word_count/index.js +59 -0
- package/src/tools/word_count/templates.js +34 -0
- package/src/track/accept.js +102 -0
- package/src/track/accept_all.js +103 -0
- package/src/track/accept_all_no_insertions.js +102 -0
- package/src/track/amend_transaction.js +562 -0
- package/src/track/delete.js +92 -0
- package/src/track/index.js +8 -0
- package/src/track/mod.js +116 -0
- package/src/track/reject.js +116 -0
- package/src/track/reject_all.js +121 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PassphraseCrypto - Client-side cryptography for the Personal Passphrase system.
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - Master key (MK) generation and storage
|
|
6
|
+
* - ECDH P-256 key pair generation and storage
|
|
7
|
+
* - Recovery key generation
|
|
8
|
+
* - Key-wrapping key (KWK) derivation from passphrase via PBKDF2
|
|
9
|
+
* - Encryption of MK and private key (SK) with KWK
|
|
10
|
+
* - Backup encryption of MK with recovery key
|
|
11
|
+
* - ECIES-style encryption of DEK with recipient's public key
|
|
12
|
+
* - Session storage management for MK and SK
|
|
13
|
+
*/
|
|
14
|
+
export class PassphraseCrypto {
|
|
15
|
+
// --- Key Generation ---
|
|
16
|
+
/**
|
|
17
|
+
* Generate a new 256-bit AES-GCM master key.
|
|
18
|
+
* The key is marked extractable so it can be exported for sessionStorage.
|
|
19
|
+
*/
|
|
20
|
+
static generateMasterKey() {
|
|
21
|
+
return crypto.subtle.generateKey({ name: "AES-GCM", length: 256 }, true, // extractable for sessionStorage
|
|
22
|
+
["encrypt", "decrypt"]);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Generate a random document password that is itself a valid raw DEK.
|
|
26
|
+
* Returns a 44-character base64-encoded 32-byte AES key.
|
|
27
|
+
* This password can be used directly as the encryption key without PBKDF2.
|
|
28
|
+
*/
|
|
29
|
+
static async generateDocumentPassword() {
|
|
30
|
+
const key = await crypto.subtle.generateKey({ name: "AES-GCM", length: 256 }, true, ["encrypt", "decrypt"]);
|
|
31
|
+
const raw = await crypto.subtle.exportKey("raw", key);
|
|
32
|
+
return btoa(String.fromCharCode(...new Uint8Array(raw)));
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Generate a new ECDH P-256 key pair.
|
|
36
|
+
* Both keys are marked extractable so the private key can be stored encrypted.
|
|
37
|
+
*/
|
|
38
|
+
static generateKeyPair() {
|
|
39
|
+
return crypto.subtle.generateKey({ name: "ECDH", namedCurve: "P-256" }, true, // extractable for encrypted storage
|
|
40
|
+
["deriveKey"]);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Generate a 128-bit recovery key as a hex string.
|
|
44
|
+
* This is shown to the user once during setup.
|
|
45
|
+
*/
|
|
46
|
+
static generateRecoveryKey() {
|
|
47
|
+
const bytes = crypto.getRandomValues(new Uint8Array(16));
|
|
48
|
+
return PassphraseCrypto._bytesToHex(bytes);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Generate a random 16-byte salt for PBKDF2.
|
|
52
|
+
*/
|
|
53
|
+
static generateSalt() {
|
|
54
|
+
return crypto.getRandomValues(new Uint8Array(16));
|
|
55
|
+
}
|
|
56
|
+
// --- Key Derivation ---
|
|
57
|
+
/**
|
|
58
|
+
* Derive a key-wrapping key (KWK) from a passphrase and salt using PBKDF2.
|
|
59
|
+
*
|
|
60
|
+
* @param {string} passphrase - The user's personal passphrase
|
|
61
|
+
* @param {Uint8Array} salt - 16-byte random salt
|
|
62
|
+
* @param {number} iterations - PBKDF2 iteration count (default 600000)
|
|
63
|
+
* @returns {Promise<CryptoKey>} An extractable AES-GCM-256 key
|
|
64
|
+
*/
|
|
65
|
+
static async deriveKWK(passphrase, salt, iterations = 600000) {
|
|
66
|
+
const encoder = new TextEncoder();
|
|
67
|
+
const keyMaterial = await crypto.subtle.importKey("raw", encoder.encode(passphrase), "PBKDF2", false, ["deriveKey"]);
|
|
68
|
+
return crypto.subtle.deriveKey({ name: "PBKDF2", salt, iterations, hash: "SHA-256" }, keyMaterial, { name: "AES-GCM", length: 256 }, true, // extractable so it can be used to encrypt keys
|
|
69
|
+
["encrypt", "decrypt"]);
|
|
70
|
+
}
|
|
71
|
+
// --- Key Wrapping / Unwrapping ---
|
|
72
|
+
/**
|
|
73
|
+
* Wrap (encrypt) a CryptoKey with a wrapping key using AES-KW.
|
|
74
|
+
* Returns a Base64-encoded wrapped key.
|
|
75
|
+
*/
|
|
76
|
+
static async wrapKey(keyToWrap, wrappingKey) {
|
|
77
|
+
const wrapped = await crypto.subtle.wrapKey("raw", keyToWrap, wrappingKey, "AES-KW");
|
|
78
|
+
return PassphraseCrypto._bytesToBase64(new Uint8Array(wrapped));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Unwrap (decrypt) a wrapped key with a wrapping key.
|
|
82
|
+
* Returns the original CryptoKey.
|
|
83
|
+
*/
|
|
84
|
+
static unwrapKey(wrappedKeyBase64, wrappingKey, keyType = "AES-GCM") {
|
|
85
|
+
const wrapped = PassphraseCrypto._base64ToBytes(wrappedKeyBase64);
|
|
86
|
+
const algorithm = keyType === "AES-GCM"
|
|
87
|
+
? { name: "AES-GCM", length: 256 }
|
|
88
|
+
: { name: "HMAC", hash: "SHA-256", length: 256 };
|
|
89
|
+
const usages = keyType === "AES-GCM" ? ["encrypt", "decrypt"] : ["sign", "verify"];
|
|
90
|
+
return crypto.subtle.unwrapKey("raw", wrapped, wrappingKey, "AES-KW", algorithm, true, usages);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Wrap a private key (JWK format) with a wrapping key.
|
|
94
|
+
* Returns a Base64-encoded wrapped JWK.
|
|
95
|
+
*/
|
|
96
|
+
static async wrapPrivateKey(privateKey, wrappingKey) {
|
|
97
|
+
const wrapped = await crypto.subtle.wrapKey("jwk", privateKey, wrappingKey, "AES-KW");
|
|
98
|
+
return PassphraseCrypto._bytesToBase64(new Uint8Array(wrapped));
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Unwrap a private key (JWK format) with a wrapping key.
|
|
102
|
+
*/
|
|
103
|
+
static unwrapPrivateKey(wrappedKeyBase64, wrappingKey) {
|
|
104
|
+
const wrapped = PassphraseCrypto._base64ToBytes(wrappedKeyBase64);
|
|
105
|
+
return crypto.subtle.unwrapKey("jwk", wrapped, wrappingKey, "AES-KW", { name: "ECDH", namedCurve: "P-256" }, true, ["deriveKey"]);
|
|
106
|
+
}
|
|
107
|
+
// --- AES-GCM encryption for key material (fallback when AES-KW not suitable) ---
|
|
108
|
+
/**
|
|
109
|
+
* Encrypt a raw key with AES-GCM.
|
|
110
|
+
* Returns Base64 string: iv (12 bytes) + ciphertext.
|
|
111
|
+
*/
|
|
112
|
+
static async encryptKey(key, encryptionKey) {
|
|
113
|
+
const raw = await crypto.subtle.exportKey("raw", key);
|
|
114
|
+
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
115
|
+
const ciphertext = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, encryptionKey, raw);
|
|
116
|
+
const combined = new Uint8Array(iv.length + ciphertext.byteLength);
|
|
117
|
+
combined.set(iv, 0);
|
|
118
|
+
combined.set(new Uint8Array(ciphertext), iv.length);
|
|
119
|
+
return PassphraseCrypto._bytesToBase64(combined);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Decrypt a raw key with AES-GCM.
|
|
123
|
+
*/
|
|
124
|
+
static async decryptKey(encryptedKeyBase64, encryptionKey, keyType = "AES-GCM") {
|
|
125
|
+
const combined = PassphraseCrypto._base64ToBytes(encryptedKeyBase64);
|
|
126
|
+
const iv = combined.slice(0, 12);
|
|
127
|
+
const ciphertext = combined.slice(12);
|
|
128
|
+
const raw = await crypto.subtle.decrypt({ name: "AES-GCM", iv }, encryptionKey, ciphertext);
|
|
129
|
+
const algorithm = keyType === "AES-GCM"
|
|
130
|
+
? { name: "AES-GCM", length: 256 }
|
|
131
|
+
: { name: "HMAC", hash: "SHA-256", length: 256 };
|
|
132
|
+
const usages = keyType === "AES-GCM" ? ["encrypt", "decrypt"] : ["sign", "verify"];
|
|
133
|
+
return crypto.subtle.importKey("raw", raw, algorithm, true, usages);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Encrypt a private key (exported as JWK JSON string) with AES-GCM.
|
|
137
|
+
*/
|
|
138
|
+
static async encryptPrivateKey(privateKey, encryptionKey) {
|
|
139
|
+
const jwk = await crypto.subtle.exportKey("jwk", privateKey);
|
|
140
|
+
const jwkString = JSON.stringify(jwk);
|
|
141
|
+
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
142
|
+
const encoded = new TextEncoder().encode(jwkString);
|
|
143
|
+
const ciphertext = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, encryptionKey, encoded);
|
|
144
|
+
const combined = new Uint8Array(iv.length + ciphertext.byteLength);
|
|
145
|
+
combined.set(iv, 0);
|
|
146
|
+
combined.set(new Uint8Array(ciphertext), iv.length);
|
|
147
|
+
return PassphraseCrypto._bytesToBase64(combined);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Decrypt a private key (as JWK JSON string) with AES-GCM.
|
|
151
|
+
*/
|
|
152
|
+
static async decryptPrivateKey(encryptedPrivateKeyBase64, encryptionKey) {
|
|
153
|
+
const combined = PassphraseCrypto._base64ToBytes(encryptedPrivateKeyBase64);
|
|
154
|
+
const iv = combined.slice(0, 12);
|
|
155
|
+
const ciphertext = combined.slice(12);
|
|
156
|
+
const decrypted = await crypto.subtle.decrypt({ name: "AES-GCM", iv }, encryptionKey, ciphertext);
|
|
157
|
+
const jwkString = new TextDecoder().decode(decrypted);
|
|
158
|
+
const jwk = JSON.parse(jwkString);
|
|
159
|
+
return crypto.subtle.importKey("jwk", jwk, { name: "ECDH", namedCurve: "P-256" }, true, ["deriveKey"]);
|
|
160
|
+
}
|
|
161
|
+
// --- Public Key Import/Export ---
|
|
162
|
+
/**
|
|
163
|
+
* Export a public key to JWK JSON string for sharing.
|
|
164
|
+
*/
|
|
165
|
+
static async exportPublicKey(publicKey) {
|
|
166
|
+
const jwk = await crypto.subtle.exportKey("jwk", publicKey);
|
|
167
|
+
return JSON.stringify(jwk);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Import a public key from JWK JSON string.
|
|
171
|
+
*/
|
|
172
|
+
static importPublicKey(jwkString) {
|
|
173
|
+
const jwk = JSON.parse(jwkString);
|
|
174
|
+
return crypto.subtle.importKey("jwk", jwk, { name: "ECDH", namedCurve: "P-256" }, true, []);
|
|
175
|
+
}
|
|
176
|
+
// --- ECIES-style DEK encryption for sharing ---
|
|
177
|
+
/**
|
|
178
|
+
* Encrypt a DEK with a recipient's public key using ECIES-style encryption.
|
|
179
|
+
*
|
|
180
|
+
* 1. Generate an ephemeral ECDH key pair.
|
|
181
|
+
* 2. Derive a shared AES-GCM key from ephemeral private + recipient public.
|
|
182
|
+
* 3. Encrypt the DEK with the shared key.
|
|
183
|
+
* 4. Return ephemeral public key + encrypted DEK.
|
|
184
|
+
*
|
|
185
|
+
* @param {CryptoKey} dek - The document encryption key (AES-GCM key)
|
|
186
|
+
* @param {CryptoKey} recipientPublicKey - The recipient's ECDH public key
|
|
187
|
+
* @returns {Promise<Object>} {ephemeralPublicKeyJwk: string, encryptedDEK: string}
|
|
188
|
+
*/
|
|
189
|
+
static async encryptDEKWithPublicKey(dek, recipientPublicKey) {
|
|
190
|
+
// Generate ephemeral key pair
|
|
191
|
+
const ephemeralPair = await crypto.subtle.generateKey({ name: "ECDH", namedCurve: "P-256" }, true, ["deriveKey"]);
|
|
192
|
+
// Derive shared AES-GCM key
|
|
193
|
+
const sharedKey = await crypto.subtle.deriveKey({ name: "ECDH", public: recipientPublicKey }, ephemeralPair.privateKey, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"]);
|
|
194
|
+
// Export DEK as raw bytes, then encrypt with shared key
|
|
195
|
+
const dekRaw = await crypto.subtle.exportKey("raw", dek);
|
|
196
|
+
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
197
|
+
const ciphertext = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, sharedKey, dekRaw);
|
|
198
|
+
// Export ephemeral public key
|
|
199
|
+
const ephemeralPublicJwk = await crypto.subtle.exportKey("jwk", ephemeralPair.publicKey);
|
|
200
|
+
const combined = new Uint8Array(iv.length + ciphertext.byteLength);
|
|
201
|
+
combined.set(iv, 0);
|
|
202
|
+
combined.set(new Uint8Array(ciphertext), iv.length);
|
|
203
|
+
return {
|
|
204
|
+
ephemeralPublicKeyJwk: JSON.stringify(ephemeralPublicJwk),
|
|
205
|
+
encryptedDEK: PassphraseCrypto._bytesToBase64(combined)
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Decrypt a DEK that was encrypted with the user's public key.
|
|
210
|
+
*
|
|
211
|
+
* @param {string} encryptedDEKBase64 - iv + ciphertext
|
|
212
|
+
* @param {string} ephemeralPublicKeyJwk - JSON string of ephemeral public key JWK
|
|
213
|
+
* @param {CryptoKey} privateKey - The user's ECDH private key
|
|
214
|
+
* @returns {Promise<CryptoKey>} The decrypted DEK (AES-GCM key)
|
|
215
|
+
*/
|
|
216
|
+
static async decryptDEKWithPrivateKey(encryptedDEKBase64, ephemeralPublicKeyJwk, privateKey) {
|
|
217
|
+
// Import ephemeral public key
|
|
218
|
+
const ephemeralPublicJwk = JSON.parse(ephemeralPublicKeyJwk);
|
|
219
|
+
const ephemeralPublicKey = await crypto.subtle.importKey("jwk", ephemeralPublicJwk, { name: "ECDH", namedCurve: "P-256" }, true, []);
|
|
220
|
+
// Derive shared AES-GCM key
|
|
221
|
+
const sharedKey = await crypto.subtle.deriveKey({ name: "ECDH", public: ephemeralPublicKey }, privateKey, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"]);
|
|
222
|
+
// Decrypt DEK
|
|
223
|
+
const combined = PassphraseCrypto._base64ToBytes(encryptedDEKBase64);
|
|
224
|
+
const iv = combined.slice(0, 12);
|
|
225
|
+
const ciphertext = combined.slice(12);
|
|
226
|
+
const dekRaw = await crypto.subtle.decrypt({ name: "AES-GCM", iv }, sharedKey, ciphertext);
|
|
227
|
+
return crypto.subtle.importKey("raw", dekRaw, { name: "AES-GCM", length: 256 }, true, ["encrypt", "decrypt"]);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Encrypt a string with AES-GCM using a direct key (e.g. master key).
|
|
231
|
+
*/
|
|
232
|
+
static async encryptString(str, encryptionKey) {
|
|
233
|
+
const encoder = new TextEncoder();
|
|
234
|
+
const data = encoder.encode(str);
|
|
235
|
+
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
236
|
+
const ciphertext = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, encryptionKey, data);
|
|
237
|
+
const combined = new Uint8Array(iv.length + ciphertext.byteLength);
|
|
238
|
+
combined.set(iv, 0);
|
|
239
|
+
combined.set(new Uint8Array(ciphertext), iv.length);
|
|
240
|
+
return PassphraseCrypto._bytesToBase64(combined);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Decrypt a string with AES-GCM using a direct key.
|
|
244
|
+
*/
|
|
245
|
+
static async decryptString(encryptedBase64, encryptionKey) {
|
|
246
|
+
const combined = PassphraseCrypto._base64ToBytes(encryptedBase64);
|
|
247
|
+
const iv = combined.slice(0, 12);
|
|
248
|
+
const ciphertext = combined.slice(12);
|
|
249
|
+
const decrypted = await crypto.subtle.decrypt({ name: "AES-GCM", iv }, encryptionKey, ciphertext);
|
|
250
|
+
const decoder = new TextDecoder();
|
|
251
|
+
return decoder.decode(decrypted);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Encrypt a string with a recipient's public key using ECIES-style encryption.
|
|
255
|
+
* Same as encryptDEKWithPublicKey but for string data instead of a CryptoKey.
|
|
256
|
+
*/
|
|
257
|
+
static async encryptStringWithPublicKey(str, recipientPublicKey) {
|
|
258
|
+
const encoder = new TextEncoder();
|
|
259
|
+
const data = encoder.encode(str);
|
|
260
|
+
const ephemeralPair = await crypto.subtle.generateKey({ name: "ECDH", namedCurve: "P-256" }, true, ["deriveKey"]);
|
|
261
|
+
const sharedKey = await crypto.subtle.deriveKey({ name: "ECDH", public: recipientPublicKey }, ephemeralPair.privateKey, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"]);
|
|
262
|
+
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
263
|
+
const ciphertext = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, sharedKey, data);
|
|
264
|
+
const ephemeralPublicJwk = await crypto.subtle.exportKey("jwk", ephemeralPair.publicKey);
|
|
265
|
+
const combined = new Uint8Array(iv.length + ciphertext.byteLength);
|
|
266
|
+
combined.set(iv, 0);
|
|
267
|
+
combined.set(new Uint8Array(ciphertext), iv.length);
|
|
268
|
+
return {
|
|
269
|
+
ephemeralPublicKeyJwk: JSON.stringify(ephemeralPublicJwk),
|
|
270
|
+
encryptedData: PassphraseCrypto._bytesToBase64(combined)
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Decrypt a string that was encrypted with the user's public key.
|
|
275
|
+
* Returns the plaintext string.
|
|
276
|
+
*/
|
|
277
|
+
static async decryptStringWithPrivateKey(encryptedDataBase64, ephemeralPublicKeyJwk, privateKey) {
|
|
278
|
+
const ephemeralPublicJwk = JSON.parse(ephemeralPublicKeyJwk);
|
|
279
|
+
const ephemeralPublicKey = await crypto.subtle.importKey("jwk", ephemeralPublicJwk, { name: "ECDH", namedCurve: "P-256" }, true, []);
|
|
280
|
+
const sharedKey = await crypto.subtle.deriveKey({ name: "ECDH", public: ephemeralPublicKey }, privateKey, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"]);
|
|
281
|
+
const combined = PassphraseCrypto._base64ToBytes(encryptedDataBase64);
|
|
282
|
+
const iv = combined.slice(0, 12);
|
|
283
|
+
const ciphertext = combined.slice(12);
|
|
284
|
+
const decrypted = await crypto.subtle.decrypt({ name: "AES-GCM", iv }, sharedKey, ciphertext);
|
|
285
|
+
const decoder = new TextDecoder();
|
|
286
|
+
return decoder.decode(decrypted);
|
|
287
|
+
}
|
|
288
|
+
// --- Session Storage ---
|
|
289
|
+
/**
|
|
290
|
+
* Store the master key and private key in sessionStorage.
|
|
291
|
+
* Both keys are exported and Base64-encoded.
|
|
292
|
+
*/
|
|
293
|
+
static async storeKeysInSession(masterKey, privateKey) {
|
|
294
|
+
const mkRaw = await crypto.subtle.exportKey("raw", masterKey);
|
|
295
|
+
const mkBase64 = PassphraseCrypto._bytesToBase64(new Uint8Array(mkRaw));
|
|
296
|
+
sessionStorage.setItem("e2ee_master_key", mkBase64);
|
|
297
|
+
const jwk = await crypto.subtle.exportKey("jwk", privateKey);
|
|
298
|
+
sessionStorage.setItem("e2ee_private_key", JSON.stringify(jwk));
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Retrieve the master key and private key from sessionStorage.
|
|
302
|
+
* Returns {masterKey: CryptoKey|null, privateKey: CryptoKey|null}
|
|
303
|
+
*/
|
|
304
|
+
static async getKeysFromSession() {
|
|
305
|
+
const mkBase64 = sessionStorage.getItem("e2ee_master_key");
|
|
306
|
+
const skJwkString = sessionStorage.getItem("e2ee_private_key");
|
|
307
|
+
if (!mkBase64 || !skJwkString) {
|
|
308
|
+
return { masterKey: null, privateKey: null };
|
|
309
|
+
}
|
|
310
|
+
try {
|
|
311
|
+
const mkRaw = PassphraseCrypto._base64ToBytes(mkBase64);
|
|
312
|
+
const masterKey = await crypto.subtle.importKey("raw", mkRaw, { name: "AES-GCM", length: 256 }, true, ["encrypt", "decrypt"]);
|
|
313
|
+
const skJwk = JSON.parse(skJwkString);
|
|
314
|
+
const privateKey = await crypto.subtle.importKey("jwk", skJwk, { name: "ECDH", namedCurve: "P-256" }, true, ["deriveKey"]);
|
|
315
|
+
return { masterKey, privateKey };
|
|
316
|
+
}
|
|
317
|
+
catch (_e) {
|
|
318
|
+
PassphraseCrypto.clearKeysFromSession();
|
|
319
|
+
return { masterKey: null, privateKey: null };
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Check if keys are present in sessionStorage.
|
|
324
|
+
*/
|
|
325
|
+
static hasKeysInSession() {
|
|
326
|
+
return !!(sessionStorage.getItem("e2ee_master_key") &&
|
|
327
|
+
sessionStorage.getItem("e2ee_private_key"));
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Clear master key and private key from sessionStorage.
|
|
331
|
+
*/
|
|
332
|
+
static clearKeysFromSession() {
|
|
333
|
+
sessionStorage.removeItem("e2ee_master_key");
|
|
334
|
+
sessionStorage.removeItem("e2ee_private_key");
|
|
335
|
+
}
|
|
336
|
+
// --- Helpers ---
|
|
337
|
+
static _bytesToBase64(bytes) {
|
|
338
|
+
let binary = "";
|
|
339
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
340
|
+
binary += String.fromCharCode(bytes[i]);
|
|
341
|
+
}
|
|
342
|
+
return btoa(binary);
|
|
343
|
+
}
|
|
344
|
+
static _base64ToBytes(base64) {
|
|
345
|
+
const binary = atob(base64);
|
|
346
|
+
const bytes = new Uint8Array(binary.length);
|
|
347
|
+
for (let i = 0; i < binary.length; i++) {
|
|
348
|
+
bytes[i] = binary.charCodeAt(i);
|
|
349
|
+
}
|
|
350
|
+
return bytes;
|
|
351
|
+
}
|
|
352
|
+
static _bytesToHex(bytes) {
|
|
353
|
+
return Array.from(bytes)
|
|
354
|
+
.map(b => b.toString(16).padStart(2, "0"))
|
|
355
|
+
.join("");
|
|
356
|
+
}
|
|
357
|
+
static _hexToBytes(hex) {
|
|
358
|
+
const bytes = new Uint8Array(hex.length / 2);
|
|
359
|
+
for (let i = 0; i < hex.length; i += 2) {
|
|
360
|
+
bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);
|
|
361
|
+
}
|
|
362
|
+
return bytes;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=passphrase-crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"passphrase-crypto.js","sourceRoot":"","sources":["../../src/e2ee/passphrase-crypto.js"],"names":[],"mappings":"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"}
|