├── .editorconfig ├── .eslintignore ├── .eslintrc.cjs ├── .gitattributes ├── .github ├── ISSUE_TEMPLATE │ ├── config.yml │ └── valid-actionable-issue.md └── workflows │ ├── master.yaml │ ├── pr-build.yaml │ └── release.yaml ├── .gitignore ├── .npmrc ├── .prettierrc ├── .tx └── config ├── .vscode └── settings.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── PULL_REQUEST_TEMPLATE.md ├── README.md ├── SUPPORT.md ├── _locales ├── cs │ └── messages.json ├── de │ └── messages.json ├── en │ └── messages.json ├── es_AR │ └── messages.json ├── es_ES │ └── messages.json ├── fi │ └── messages.json ├── fr │ └── messages.json ├── it │ └── messages.json ├── ja │ └── messages.json ├── ko_KR │ └── messages.json ├── pl │ └── messages.json ├── pt_BR │ └── messages.json ├── pt_PT │ └── messages.json ├── ru │ └── messages.json ├── sk │ └── messages.json ├── tr │ └── messages.json ├── uk │ └── messages.json └── zh_CN │ └── messages.json ├── lib ├── copyToClipboard.html ├── copyToClipboard.js └── linkContentScriptToKeeVaultWebsite.js ├── package-lock.json ├── package.json ├── scripts ├── assets.ts ├── jsLibs.ts ├── locales.ts ├── manifest.ts ├── prepare.ts └── utils.ts ├── src ├── assets │ ├── fonts │ │ ├── MaterialIcons-Regular.woff2 │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ ├── glyphicons-halflings-regular.woff2 │ │ └── materialdesignicons-webfont.woff2 │ ├── images │ │ ├── 128.png │ │ ├── 16.png │ │ ├── 24.png │ │ ├── 32.png │ │ ├── 48-kee-vault.png │ │ ├── 48-keepass.png │ │ ├── 48.png │ │ ├── 64.png │ │ ├── 96.png │ │ ├── KeeLock.png │ │ ├── KeeOrange.png │ │ ├── highlight-48.png │ │ ├── menu.png │ │ ├── pinChromeScreenshot.png │ │ ├── productHuntCat.jpg │ │ └── productHuntP.png │ └── styles │ │ ├── NetworkAuth.css │ │ ├── SRP.css │ │ ├── bootstrap.min.css │ │ ├── panels.css │ │ ├── release-notes.css │ │ └── settings.css ├── background │ ├── AccountManager.ts │ ├── Claim.ts │ ├── Command.ts │ ├── ConfigSyncManager.ts │ ├── EventSession.ts │ ├── JWT.ts │ ├── KF.ts │ ├── NativeNotification.ts │ ├── NetworkAuth.ts │ ├── PersistentDataItem.ts │ ├── PersistentTabState.ts │ ├── SRP.ts │ ├── WebsocketSession.ts │ ├── commands.ts │ ├── contentScriptHMR.ts │ ├── jsonrpcClient.ts │ ├── kprpcClient.ts │ ├── main.ts │ └── messageHandlers.ts ├── common │ ├── Action.ts │ ├── AddonMessage.ts │ ├── Button.ts │ ├── ConfigManager.ts │ ├── ConfigMigrations.ts │ ├── DefaultSiteConfig.ts │ ├── DollarPolyfills.ts │ ├── FeatureFlags.ts │ ├── FrameState.ts │ ├── IPCPiniaPlugin.ts │ ├── KeeBrowserActionIconConfiguration.ts │ ├── KeeNotification.ts │ ├── KeeURL.ts │ ├── Logger.ts │ ├── PublicSuffixListData.ts │ ├── SaveEntryResult.ts │ ├── SaveState.ts │ ├── SearchFilter.ts │ ├── SearchUtils.ts │ ├── SearcherAll.ts │ ├── SearcherMatchedOnly.ts │ ├── SessionType.ts │ ├── SubmittedData.ts │ ├── TabState.ts │ ├── Timings.ts │ ├── Tokens.ts │ ├── VaultAction.ts │ ├── VaultMessage.ts │ ├── VaultProtocol.ts │ ├── components │ │ └── PasswordGenerator.vue │ ├── config.ts │ ├── copyStringToClipboard.ts │ ├── fonts │ │ ├── MaterialIcons-Regular.woff2 │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ ├── glyphicons-halflings-regular.woff2 │ │ └── materialdesignicons-webfont.woff2 │ ├── i18n.ts │ ├── images │ │ ├── 128.png │ │ ├── 16.png │ │ ├── 24.png │ │ ├── 32.png │ │ ├── 48-kee-vault.png │ │ ├── 48-keepass.png │ │ ├── 48.png │ │ ├── 64.png │ │ ├── 96.png │ │ ├── KeeLock.png │ │ ├── KeeOrange.png │ │ ├── highlight-48.png │ │ ├── menu.png │ │ ├── productHuntCat.jpg │ │ └── productHuntP.png │ ├── model │ │ ├── Database.ts │ │ ├── DatabaseSummary.ts │ │ ├── Entry.ts │ │ ├── EntrySummary.ts │ │ ├── Field.ts │ │ ├── Group.ts │ │ ├── GroupSummary.ts │ │ ├── Icon.ts │ │ ├── KPRPCDTOs.ts │ │ ├── Locator.ts │ │ ├── PasswordProfile.ts │ │ ├── README.md │ │ ├── SearchConfig.ts │ │ └── SessionType.ts │ ├── port.ts │ └── utils.ts ├── components │ └── README.md ├── dialogs │ ├── NetworkAuth.html │ ├── NetworkAuth.ts │ ├── SRP.html │ └── SRP.ts ├── env.ts ├── install-notes │ ├── App.vue │ ├── index.html │ └── main.ts ├── manifest.ts ├── page │ ├── FilledField.ts │ ├── MatchResult.ts │ ├── MatchedField.ts │ ├── PanelStub.ts │ ├── PasswordGenerator.ts │ ├── findMatchesBehaviour.ts │ ├── formFilling.ts │ ├── formSaving.ts │ ├── formsUtils.ts │ ├── keeFieldIcon.ts │ └── page.ts ├── panels │ ├── MatchedLoginsPanel.ts │ ├── Panel.vue │ ├── main.ts │ ├── mainLegacy.ts │ ├── panels.html │ └── panelsLegacy.html ├── popup │ ├── App.vue │ ├── components │ │ ├── Entry.vue │ │ ├── Field.vue │ │ ├── FieldEditor.vue │ │ ├── GroupSelectorTree.vue │ │ ├── Notification.vue │ │ ├── Save1stParty.vue │ │ ├── SaveWhere.vue │ │ ├── SearchInput.vue │ │ ├── SearchResults.vue │ │ └── TreeItem.vue │ ├── favicon.ts │ ├── getAllFrameURLs.ts │ ├── index.html │ ├── main.ts │ ├── reconcileFieldLists.ts │ ├── reconcileURLs.ts │ └── supplementEntryState.ts ├── release-notes │ ├── update-notes.html │ └── update.ts ├── settings │ ├── index.html │ └── main.ts ├── store │ ├── BackgroundStore.ts │ ├── KeeState.ts │ ├── Mutation.ts │ ├── NonReactiveStore.ts │ ├── index.ts │ └── mutation-types.ts ├── styles │ ├── index.ts │ ├── main.css │ └── materialdesignicons.min.css ├── tests │ └── ConfigManager.test.ts ├── typedefs │ ├── global.d.ts │ ├── kee.d.ts │ ├── modules.d.ts │ └── publicsuffixlist.d.ts └── vault │ ├── vault.ts │ └── waitForElementById.ts ├── tsconfig.json ├── unocss.config.ts ├── vite.config.background.ts ├── vite.config.page.ts ├── vite.config.ts ├── vite.config.vault.ts └── vitest.setup.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # top-most EditorConfig file 2 | root = true 3 | 4 | [*] 5 | end_of_line = lf 6 | insert_final_newline = true 7 | 8 | # Matches multiple files with brace expansion notation 9 | # Set default charset 10 | [*.{js,ts,json,html,css,sass,less,vue}] 11 | charset = utf-8 12 | indent_style = space 13 | indent_size = 4 14 | trim_trailing_whitespace = true 15 | 16 | # Tab indentation (no size specified) 17 | [Makefile] 18 | indent_style = tab 19 | 20 | # # Indentation override for all JS under lib directory 21 | # [lib/**.js] 22 | # indent_style = space 23 | # indent_size = 2 24 | 25 | [{package.json,.travis.yml}] 26 | indent_style = space 27 | indent_size = 2 28 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | **/*.d.ts 2 | dist 3 | node_modules 4 | public 5 | src/lib 6 | *.js 7 | .eslintrc.cjs 8 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | const INLINE_ELEMENTS = require('eslint-plugin-vue/lib/utils/inline-non-void-elements.json'); 2 | const htmlElementContentNewlineIgnores = ["v-btn", "pre", "textarea", "v-icon", ...INLINE_ELEMENTS]; 3 | 4 | module.exports = { 5 | root: true, 6 | "extends": [ 7 | "eslint:recommended", 8 | 'plugin:@typescript-eslint/recommended', 9 | 'plugin:vue/recommended', 10 | "plugin:prettier/recommended", 11 | "plugin:vuetify/base" 12 | ], 13 | "env": { 14 | "browser": true, 15 | "webextensions": true 16 | }, 17 | "globals": { 18 | "browser": "readonly", 19 | "chrome": "readonly" 20 | }, 21 | "parser": "vue-eslint-parser", 22 | "parserOptions": { 23 | "parser": "@typescript-eslint/parser", 24 | "project": "tsconfig.json", 25 | "sourceType": "module", 26 | "extraFileExtensions": [".vue"] 27 | }, 28 | "plugins": [ 29 | "@typescript-eslint", 30 | "prettier", 31 | "vue" 32 | ], 33 | "rules": { 34 | "prettier/prettier": "off", 35 | "vue/html-indent": "off", 36 | "vue/max-attributes-per-line": "off", 37 | "vue/html-closing-bracket-newline": "off", 38 | "vue/html-self-closing": "off", 39 | "vue/require-prop-types": "off", 40 | "vue/singleline-html-element-content-newline": ["error", { 41 | "ignoreWhenNoAttributes": true, 42 | "ignoreWhenEmpty": true, 43 | "ignores": htmlElementContentNewlineIgnores 44 | }], 45 | "vue/multiline-html-element-content-newline": ["error", { 46 | "ignoreWhenEmpty": true, 47 | "ignores": htmlElementContentNewlineIgnores, 48 | "allowEmptyLines": false 49 | }], 50 | "vue/attribute-hyphenation": "off", 51 | "vue/multi-word-component-names": "off", 52 | "@typescript-eslint/consistent-type-assertions": "error", 53 | "@typescript-eslint/member-delimiter-style": [ 54 | "error", 55 | { 56 | "multiline": { 57 | "delimiter": "semi", 58 | "requireLast": true 59 | }, 60 | "singleline": { 61 | "delimiter": "semi", 62 | "requireLast": false 63 | } 64 | } 65 | ], 66 | "@typescript-eslint/quotes": [ 67 | "error", 68 | "double", 69 | { 70 | "avoidEscape": true 71 | } 72 | ], 73 | "@typescript-eslint/semi": [ 74 | "error", 75 | "always" 76 | ], 77 | "arrow-body-style": "error", 78 | "arrow-parens": [ 79 | "error", 80 | "as-needed" 81 | ], 82 | "camelcase": "error", 83 | "comma-dangle": "error", 84 | "eol-last": "error", 85 | "id-blacklist": [ 86 | "error", 87 | "any", 88 | "Number", 89 | "number", 90 | "String", 91 | "string", 92 | "Boolean", 93 | "boolean", 94 | ], 95 | "id-match": "error", 96 | "max-len": [ 97 | "error", 98 | { 99 | "code": 250 100 | } 101 | ], 102 | "new-parens": "error", 103 | "no-duplicate-case": "error", 104 | "no-eval": "error", 105 | "no-multiple-empty-lines": [ 106 | "error", 107 | { 108 | "max": 2 109 | } 110 | ], 111 | "no-redeclare": "error", 112 | "no-return-await": "off", 113 | "no-sequences": "off", 114 | "no-shadow": "off", 115 | "@typescript-eslint/no-shadow": "error", 116 | "no-throw-literal": "error", 117 | "no-trailing-spaces": [ 118 | "error", 119 | { 120 | "ignoreComments": true 121 | } 122 | ], 123 | "no-undef-init": "error", 124 | "no-underscore-dangle": "off", 125 | "no-unsafe-finally": "error", 126 | "no-unused-expressions": "off", 127 | "@typescript-eslint/no-unused-expressions": [ 128 | "error", 129 | { 130 | "allowShortCircuit": true 131 | } 132 | ], 133 | "no-var": "error", 134 | "one-var": [ 135 | "error", 136 | "never" 137 | ], 138 | "prefer-const": "error", 139 | "curly": [2, "multi-line"], 140 | "@typescript-eslint/explicit-module-boundary-types": "off", 141 | "@typescript-eslint/no-explicit-any": "off", 142 | "@typescript-eslint/no-unused-vars": "off" 143 | }, 144 | overrides: [ 145 | { 146 | files: [ 147 | "**/*.test.ts" 148 | ], 149 | // env: { 150 | // jest: true 151 | // }, 152 | // "extends": ["plugin:jest/recommended"], 153 | // plugins: ["jest"] 154 | } 155 | ] 156 | }; 157 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text eol=lf 2 | 3 | *.jpg binary 4 | *.png binary 5 | *.gif binary 6 | *.jpeg binary 7 | *.woff binary 8 | *.woff2 binary 9 | *.ttf binary 10 | *.eot binary 11 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Community forum 4 | url: https://forum.kee.pm 5 | about: Please ask and answer questions here. 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/valid-actionable-issue.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Valid, actionable issue 3 | about: All issues go here after discussion on forum.kee.pm 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | Thanks for your interest in helping to improve Kee. 11 | 12 | GitHub issues are for clear and well defined changes to project behaviour, appearance and code. 13 | 14 | Issues may not always be worked on immediately but if there is not a clear plan and need for a change the issue may be closed, at least until the need or specification is more clearly evaluated on the community forum. 15 | 16 | If you have not been asked to create an issue here and are unsure if creating an issue is the best way forward, please use https://forum.kee.pm instead. 17 | 18 | In particular, please note that initial discussion regarding any of the following should begin on the forum: 19 | * Help using Kee 20 | * Documentation 21 | * Bug reports 22 | * Change proposals 23 | * Feature requests 24 | * Questions/comments about security(*) 25 | * Help developing/building Kee 26 | 27 | The full contribution and support guidelines can be found at: https://github.com/kee-org/browser-addon/blob/master/CONTRIBUTING.md 28 | 29 | Thank you for following these guidelines - it will help us to keep each discussion focussed in a single place and improve the project more quickly. 30 | 31 | (*) Note that sensitive issues should always be addressed via a private contact - e.g. using the Security tab on GitHub. 32 | -------------------------------------------------------------------------------- /.github/workflows/master.yaml: -------------------------------------------------------------------------------- 1 | name: Master CI 2 | on: 3 | push: 4 | branches: [ master ] 5 | jobs: 6 | build: 7 | runs-on: ubuntu-22.04 8 | steps: 9 | - name: Prepare system path for running python 10 | run: echo "/home/runner/.local/bin" >> $GITHUB_PATH 11 | 12 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 13 | - uses: actions/checkout@v4 14 | with: 15 | fetch-depth: 0 16 | #TODO: change to 1 and then get all tags seperately to see if that's faster. git fetch origin 'refs/tags/*:refs/tags/*' 17 | 18 | - uses: actions/setup-node@v4 19 | with: 20 | node-version: 18 21 | cache: 'npm' 22 | 23 | # Create a git tag of the new version to use 24 | # If package.json major and minor versions match last tag, then 25 | # increment last tag. Else use package.json major.minor.0. 26 | - name: Create git tag 27 | run: | 28 | git config user.name github-actions 29 | git config user.email github-actions@github.com 30 | KEE_VERSION_MANIFEST=`sed -nE 's/^.*"version": "([0-9]{1,}\\.[0-9]{1,})\\.[0-9x]{1,}"\\,/\\1/p' package.json | tr -d '\\040\\011\\012\\015'`; KEE_VERSION_TAG=`git describe --abbrev=0 --tags | sed -E 's/^([0-9]{1,}\\.[0-9]{1,})\\.([0-9]{1,})$/\\1 \\2/g'`; echo "${KEE_VERSION_MANIFEST} ${KEE_VERSION_TAG}" | awk '{printf($1==$2?""$2"."$3+1:""$1".0")}' | xargs -I {} git tag -a {} -m "{}" 31 | 32 | - name: Update package.json based on the git tag we just created 33 | run: | 34 | NEW_KEE_VERSION=`git describe --abbrev=0 --tags` 35 | echo "NEW_KEE_VERSION=$NEW_KEE_VERSION" >> $GITHUB_ENV 36 | sed -E 's/^(.*"version": ")(.*)("\,.*)/\1'"$NEW_KEE_VERSION"'\3/' package.json > package.json.tmp && mv package.json.tmp package.json 37 | 38 | - name: Setup 39 | run: | 40 | npm ci 41 | mkdir dist 42 | 43 | - name: Build and package beta 44 | run: npm run build:beta && npm run pack:beta 45 | 46 | - name: Build and package production 47 | run: npm run build:prod && npm run pack:prod 48 | 49 | - name: Build and package Chrome beta 50 | run: npm run build-chrome:beta && npm run pack-chrome:beta 51 | 52 | - name: Build and package Chrome production 53 | run: npm run build-chrome:prod && npm run pack-chrome:prod 54 | 55 | # We have to do this type check after running the build 56 | # because Vite creates various type definitions we need 57 | - name: Compile Typescript 58 | run: npm run tsc 59 | 60 | # Disabled until MV3 rewrite 61 | # - name: Test 62 | # run: npm run test 63 | 64 | - name: Lint 65 | run: npm run lint 66 | 67 | # - name: Transifex upload 68 | # run: pip install transifex-client && echo $'[https://www.transifex.com]\nhostname = https://www.transifex.com\nusername = api\ntoken = \npassword = '"$TRANSIFEX_API_TOKEN"$'\n' > .transifexrc && tx -d --traceback push -s; 69 | # env: 70 | # TRANSIFEX_API_TOKEN: ${{ secrets.TRANSIFEX_API_TOKEN }} 71 | 72 | - name: Transifex upload 73 | uses: transifex/cli-action@v2 74 | with: 75 | token: ${{ secrets.TRANSIFEX_API_TOKEN }} 76 | 77 | - name: Push git tag 78 | run: git push --tags 79 | 80 | - name: Release 81 | uses: softprops/action-gh-release@v2 82 | with: 83 | name: ${{ env.NEW_KEE_VERSION }} 84 | tag_name: ${{ env.NEW_KEE_VERSION }} 85 | fail_on_unmatched_files: true 86 | prerelease: true 87 | body: "This is an automatically generated pre-release. Some releases will be thoroughly tested and their derivatives marked as ready for beta and eventually stable release. If the status of this version changes, this message will be replaced. You may want to install the files in this release if you wish to test a specific change that is included within this version. More information can be found at https://forum.kee.pm/t/versioning-and-releases/550" 88 | files: | 89 | dist/* 90 | -------------------------------------------------------------------------------- /.github/workflows/pr-build.yaml: -------------------------------------------------------------------------------- 1 | name: PR CI 2 | on: 3 | pull_request: 4 | branches: [ master ] 5 | 6 | jobs: 7 | build: 8 | runs-on: ubuntu-22.04 9 | steps: 10 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 11 | - uses: actions/checkout@v4 12 | with: 13 | fetch-depth: 0 14 | #TODO: change to 1 and then get all tags seperately to see if that's faster. git fetch origin 'refs/tags/*:refs/tags/*' 15 | 16 | - uses: actions/setup-node@v4 17 | with: 18 | node-version: 18 19 | cache: 'npm' 20 | 21 | - name: Setup 22 | run: | 23 | npm ci 24 | mkdir dist 25 | 26 | - name: Build beta 27 | run: npm run build:beta 28 | 29 | - name: Build production 30 | run: npm run build:prod 31 | 32 | - name: Build Chrome beta 33 | run: npm run build-chrome:beta 34 | 35 | - name: Build Chrome production 36 | run: npm run build-chrome:prod 37 | 38 | # We have to do this type check after running the build 39 | # because Vite creates various type definitions we need 40 | - name: Compile Typescript 41 | run: npm run tsc 42 | 43 | # Disabled until MV3 rewrite 44 | # - name: Test 45 | # run: npm run test 46 | 47 | - name: Lint 48 | run: npm run lint 49 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.user 2 | *.userprefs 3 | *.suo 4 | /node_modules 5 | *.bak 6 | *.orig 7 | /temp 8 | /local 9 | .vs 10 | /dist 11 | /build 12 | *.map 13 | .rpt2_cache/**/* 14 | .DS_Store 15 | .idea/ 16 | .vite-ssg-dist 17 | .vite-ssg-temp 18 | *.crx 19 | *.local 20 | *.log 21 | *.pem 22 | *.xpi 23 | *.zip 24 | dist-ssr 25 | /extension 26 | src/auto-imports.d.ts 27 | src/components.d.ts 28 | src/node_modules/.vitest/results.json 29 | tx 30 | .testing-web-ext-* 31 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | auto-install-peers=true 2 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 100, 3 | "tabWidth": 4, 4 | "trailingComma": "none", 5 | "arrowParens": "avoid", 6 | "endOfLine": "lf" 7 | } 8 | -------------------------------------------------------------------------------- /.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | 4 | [o:keefox:p:keefox:r:kee] 5 | file_filter = _locales//messages.json 6 | source_file = _locales/en/messages.json 7 | source_lang = en 8 | type = CHROME 9 | replace_edited_strings = false 10 | keep_translations = false 11 | 12 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "kolorist", 4 | "pinia", 5 | "Proxified", 6 | "syncable", 7 | "vuetify" 8 | ], 9 | "files.exclude": { 10 | "**/.git": true, 11 | "**/.svn": true, 12 | "**/.hg": true, 13 | "**/.DS_Store": true, 14 | "build/**/*": true 15 | }, 16 | "typescript.tsdk": "node_modules/typescript/lib", 17 | "eslint.enable": true, 18 | "editor.formatOnSave": false, 19 | // "editor.codeActionsOnSave": { 20 | 21 | // "source.fixAll.eslint": true, 22 | // } 23 | } 24 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of experience, 9 | education, socio-economic status, nationality, personal appearance, race, 10 | religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. 50 | 51 | Examples of project spaces include the GitHub kee-org organisation and projects 52 | within, the community forum at forum.kee.pm and the Transifex localisation 53 | project. 54 | 55 | Examples of representing a project or community include using an official project e-mail 56 | address, posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. Representation of a project may be 58 | further defined and clarified by project maintainers. 59 | 60 | ## Enforcement 61 | 62 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 63 | reported by contacting the project team at contact@kee.pm. All 64 | complaints will be reviewed and investigated and will result in a response that 65 | is deemed necessary and appropriate to the circumstances. The project team is 66 | obligated to maintain confidentiality with regard to the reporter of an incident. 67 | Further details of specific enforcement policies may be posted separately. 68 | 69 | Project maintainers who do not follow or enforce the Code of Conduct in good 70 | faith may face temporary or permanent repercussions as determined by other 71 | members of the project's leadership. 72 | 73 | ## Attribution 74 | 75 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 76 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 77 | 78 | [homepage]: https://www.contributor-covenant.org 79 | 80 | -------------------------------------------------------------------------------- /PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Thanks for considering contributing code improvements to Kee! 2 | 3 | To ensure your Pull Request can be approved successfully and quickly, make sure you have read https://github.com/kee-org/browser-addon/blob/master/CONTRIBUTING.md first. If the guidelines within that document have not been followed, you may receive a delayed response and/or find your PR is declined. 4 | -------------------------------------------------------------------------------- /SUPPORT.md: -------------------------------------------------------------------------------- 1 | The [community forum](https://forum.kee.pm) is usually the best place to look for help and support. 2 | 3 | In particular, if you are considering searching or asking for help about any of the following you should go to the [forum](https://forum.kee.pm). 4 | 5 | * Help using Kee 6 | * Documentation 7 | * Bug reports 8 | * Change proposals 9 | * Feature requests 10 | * Questions/comments about security(*) 11 | * Help developing/building Kee 12 | 13 | (*) Note that sensitive issues should always be addressed via a private contact - see https://forum.kee.pm for how to do this. 14 | -------------------------------------------------------------------------------- /lib/copyToClipboard.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /lib/copyToClipboard.js: -------------------------------------------------------------------------------- 1 | // Copyright 2023 Google LLC 2 | // 3 | // Licensed under the Apache License, Version 2.0 (the "License"); 4 | // you may not use this file except in compliance with the License. 5 | // You may obtain a copy of the License at 6 | // 7 | // https://www.apache.org/licenses/LICENSE-2.0 8 | // 9 | // Unless required by applicable law or agreed to in writing, software 10 | // distributed under the License is distributed on an "AS IS" BASIS, 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | // See the License for the specific language governing permissions and 13 | // limitations under the License. 14 | 15 | // Once the message has been posted from the service worker, checks are made to 16 | // confirm the message type and target before proceeding. This is so that the 17 | // module can easily be adapted into existing workflows where secondary uses for 18 | // the document (or alternate offscreen documents) might be implemented. 19 | 20 | // Registering this listener when the script is first executed ensures that the 21 | // offscreen document will be able to receive messages when the promise returned 22 | // by `offscreen.createDocument()` resolves. 23 | chrome.runtime.onMessage.addListener(handleMessages); 24 | 25 | // This function performs basic filtering and error checking on messages before 26 | // dispatching the 27 | // message to a more specific message handler. 28 | async function handleMessages(message) { 29 | // Return early if this message isn't meant for the offscreen document. 30 | if (message.target !== 'offscreen-doc') { 31 | return; 32 | } 33 | 34 | // Dispatch the message to an appropriate handler. 35 | switch (message.type) { 36 | case 'copy-data-to-clipboard': 37 | handleClipboardWrite(message.data); 38 | break; 39 | default: 40 | console.warn(`Unexpected message type received: '${message.type}'.`); 41 | } 42 | } 43 | 44 | // We use a