Compare commits

...

1277 Commits

Author SHA1 Message Date
Leendert de Borst
09d931484a Update GitHub workflows (#722) 2025-03-25 13:29:26 +01:00
Leendert de Borst
1678595c13 Bump version to 0.15.0 (#722) 2025-03-25 13:13:05 +01:00
Leendert de Borst
8945b33705 Add install.sh to release artifacts (#722) 2025-03-25 13:13:05 +01:00
Leendert de Borst
4ee044ffb9 Update faviconextractor HtmlAgilityPack call (#715) 2025-03-25 11:53:04 +01:00
dependabot[bot]
5443e147b1 Bump HtmlAgilityPack from 1.11.74 to 1.12.0
Bumps [HtmlAgilityPack](https://github.com/zzzprojects/html-agility-pack) from 1.11.74 to 1.12.0.
- [Release notes](https://github.com/zzzprojects/html-agility-pack/releases)
- [Commits](https://github.com/zzzprojects/html-agility-pack/compare/v1.11.74...v1.12.0)

---
updated-dependencies:
- dependency-name: HtmlAgilityPack
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-25 11:53:04 +01:00
Leendert de Borst
05edda8b48 Show returning users count in admin dashboard (#720) 2025-03-25 10:48:55 +01:00
Leendert de Borst
179bb62604 Fix bug in search for null credential fields (#718) 2025-03-24 22:21:34 +01:00
Leendert de Borst
1f5863b066 Fix vault dismiss logic when user is not logged in (#718) 2025-03-24 22:21:34 +01:00
Leendert de Borst
ef36a08ef4 Update password autofill to improve compatibility (#718) 2025-03-24 22:21:34 +01:00
dependabot[bot]
4f7212668e Bump Swashbuckle.AspNetCore from 7.3.2 to 8.0.0
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 7.3.2 to 8.0.0.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v7.3.2...v8.0.0)

---
updated-dependencies:
- dependency-name: Swashbuckle.AspNetCore
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-24 17:52:47 +01:00
dependabot[bot]
41bb7ed701 Bump Microsoft.AspNetCore.Components.WebAssembly.DevServer
Bumps [Microsoft.AspNetCore.Components.WebAssembly.DevServer](https://github.com/dotnet/aspnetcore) from 9.0.2 to 9.0.3.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.2...v9.0.3)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Components.WebAssembly.DevServer
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-24 17:51:49 +01:00
dependabot[bot]
78286b1ac1 Bump nokogiri in /docs in the bundler group across 1 directory
Bumps the bundler group with 1 update in the /docs directory: [nokogiri](https://github.com/sparklemotion/nokogiri).


Updates `nokogiri` from 1.18.3 to 1.18.4
- [Release notes](https://github.com/sparklemotion/nokogiri/releases)
- [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.18.3...v1.18.4)

---
updated-dependencies:
- dependency-name: nokogiri
  dependency-type: indirect
  dependency-group: bundler
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-22 10:34:01 +01:00
Leendert de Borst
7bc8bb3fc2 Create FUNDING.yml 2025-03-21 16:36:47 +01:00
Leendert de Borst
c576062025 Fix hyperlinks absolute vs relative address (#711) 2025-03-20 13:55:32 +01:00
Leendert de Borst
1194d54e6f Add E2E test for email claim disable logic (#711) 2025-03-20 13:55:32 +01:00
Leendert de Borst
e782a6a51f Reject emails addressed to disabled email claim (#711) 2025-03-20 13:55:32 +01:00
Leendert de Borst
2071a7c4fe Add email claim enable/disable toggle to admin (#711) 2025-03-20 13:55:32 +01:00
Leendert de Borst
8c1e5a7bf8 Add email claim table disabled boolean (#711) 2025-03-20 13:55:32 +01:00
Leendert de Borst
b8f9e7fa2c Merge pull request #710 from lanedirt/641-add-statistics-graphs-to-admin
Add analytics charts to admin dashboard
2025-03-20 10:04:24 +01:00
Leendert de Borst
a0a541aff9 Update admin tests (#641) 2025-03-19 22:17:59 +01:00
Leendert de Borst
d6932f33ea Update email list page and tweak search fields (#641) 2025-03-19 22:10:13 +01:00
Leendert de Borst
9ea845b497 Add ApexChart service and integrate dark mode (#641) 2025-03-19 19:33:42 +01:00
Leendert de Borst
917d6f6bcc Add charts to admin dashboard (#641) 2025-03-19 17:49:09 +01:00
Leendert de Borst
39a263d157 Update docs (#641) 2025-03-19 15:34:35 +01:00
Leendert de Borst
c7360ee23c Add general log source context to term filter (#705) 2025-03-19 14:23:51 +01:00
Leendert de Borst
d1924f4044 Update header text (#705) 2025-03-19 14:23:51 +01:00
Leendert de Borst
4d86356990 Update users page with credential count column (#705) 2025-03-19 14:23:51 +01:00
Leendert de Borst
505a2445eb Reset page back to 1 when search term changes in admin (#705) 2025-03-19 14:23:51 +01:00
Leendert de Borst
75385c4b5d Remove WASM DevServer package from admin which caused it to not run in debug (#705) 2025-03-19 14:23:51 +01:00
Leendert de Borst
4d4053c7fb Update package-lock.json (#705) 2025-03-19 14:23:51 +01:00
Leendert de Borst
43062d0d93 Update .vscode tasks (#705) 2025-03-19 14:23:51 +01:00
Leendert de Borst
956709da54 Merge pull request #706 from lanedirt/167-allow-customizing-password-generation-options
Make password generation options customizable
2025-03-18 22:15:53 +01:00
Leendert de Borst
496e0ab754 Refactor PasswordGenerator.ts (#167) 2025-03-18 22:04:11 +01:00
Leendert de Borst
ef97aac848 Merge branch 'main' into 167-allow-customizing-password-generation-options 2025-03-18 18:22:09 +01:00
Leendert de Borst
998fa1913f Update dotnet nuget packages to 9.0.3 (#707) 2025-03-18 18:08:32 +01:00
Leendert de Borst
79cd265c3e Add browser extension password settings test (#167) 2025-03-18 17:40:31 +01:00
Leendert de Borst
ed5fd5b861 Disable autofill extension for aliasvault client by default (#167) 2025-03-18 17:12:34 +01:00
Leendert de Borst
5e2dde252d Update tests (#167) 2025-03-18 16:51:49 +01:00
Leendert de Borst
79950ab9fc Add password generator settings awareness to browser extension (#167) 2025-03-18 16:30:41 +01:00
Leendert de Borst
dffa651512 Cleanup (#167) 2025-03-18 14:37:24 +01:00
Leendert de Borst
2dc36cea11 Add password settings to general settings page (#167) 2025-03-18 14:17:49 +01:00
Leendert de Borst
ad4c2c7b41 Add modalwrapper component for keydown detection (#167) 2025-03-18 13:41:43 +01:00
Leendert de Borst
2022cdb58b Improve UX (#167) 2025-03-18 13:08:56 +01:00
Leendert de Borst
5f779ce360 Update UI style (#167) 2025-03-18 12:37:10 +01:00
Leendert de Borst
b9d981f80b Refactor (#167) 2025-03-18 11:30:36 +01:00
Leendert de Borst
65110abf4c Add range binds and sanity checks (#167) 2025-03-18 10:47:06 +01:00
Leendert de Borst
b0e939ef23 Add support for temp or global password settings persist (#167) 2025-03-18 10:19:53 +01:00
Leendert de Borst
607c0da5b4 Make password settings a separate component (#167) 2025-03-18 10:05:10 +01:00
Leendert de Borst
1de7f831b5 Fix recent email refresh duplicate calls (#167) 2025-03-17 22:19:31 +01:00
Leendert de Borst
ef328718cd Refactor password generator and make all use general settings (#167) 2025-03-17 21:28:57 +01:00
Leendert de Borst
465c4cc730 Update username and password button style (#167) 2025-03-17 20:37:26 +01:00
Leendert de Borst
0dceeeffa4 Update docs to include Windows instructions (#703) 2025-03-17 17:56:21 +01:00
Leendert de Borst
af24464a8d Convert install.sh line endings so it works on Windows out of the box (#703) 2025-03-17 17:56:21 +01:00
Leendert de Borst
5aa82d8149 Update username and password edit field GUI (#167) 2025-03-17 15:06:15 +01:00
Leendert de Borst
e848e05cce Cleanup and simplify install.sh (#690) 2025-03-16 15:35:58 +01:00
Leendert de Borst
323be10d03 Tweak password edit component UI (#167) 2025-03-15 18:24:35 +01:00
Leendert de Borst
51b382a739 Add password generation settings GUI scaffolding (#167) 2025-03-15 18:03:45 +01:00
Leendert de Borst
7954104dfc Update README.md 2025-03-14 17:54:51 +01:00
Leendert de Borst
4c7b44c04a Bump version to 0.14.0 (#688) 2025-03-14 14:17:26 +01:00
Leendert de Borst
b41449f892 Remove Microsoft.IdentityModel packages from API which caused method not found bug (#668) 2025-03-14 13:13:36 +01:00
dependabot[bot]
934d0d9e56 Bump Microsoft.IdentityModel.Tokens from 8.6.0 to 8.6.1
Bumps [Microsoft.IdentityModel.Tokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet) from 8.6.0 to 8.6.1.
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.6.0...8.6.1)

---
updated-dependencies:
- dependency-name: Microsoft.IdentityModel.Tokens
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-14 13:13:36 +01:00
Leendert de Borst
99d0da1119 Update docs and README.md (#680) 2025-03-13 15:10:01 +01:00
Leendert de Borst
c74e05d400 Improve create credential popup page title extraction (#686) 2025-03-13 15:09:21 +01:00
dependabot[bot]
844bdab92f Bump MailKit from 4.10.0 to 4.11.0
Bumps [MailKit](https://github.com/jstedfast/MailKit) from 4.10.0 to 4.11.0.
- [Changelog](https://github.com/jstedfast/MailKit/blob/master/ReleaseNotes.md)
- [Commits](https://github.com/jstedfast/MailKit/compare/4.10.0...4.11.0)

---
updated-dependencies:
- dependency-name: MailKit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-13 14:13:02 +01:00
dependabot[bot]
1345e3c657 Bump MimeKit from 4.10.0 to 4.11.0
Bumps [MimeKit](https://github.com/jstedfast/MimeKit) from 4.10.0 to 4.11.0.
- [Changelog](https://github.com/jstedfast/MimeKit/blob/master/ReleaseNotes.md)
- [Commits](https://github.com/jstedfast/MimeKit/compare/4.10.0...4.11.0)

---
updated-dependencies:
- dependency-name: MimeKit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-13 14:12:55 +01:00
Leendert de Borst
4fdf7ce92c Show autofill popup dismiss button when vault is locked (#682) 2025-03-13 14:12:43 +01:00
Leendert de Borst
852d9b5e98 Update tests to wait until all password chars have been entered (#684) 2025-03-13 13:47:39 +01:00
Leendert de Borst
3c72fa3fde Update password autofill mechanism to simulate user typing behavior (#684) 2025-03-13 13:47:39 +01:00
Leendert de Borst
b61b747e4b Add default font-family (#680) 2025-03-13 13:29:57 +01:00
Leendert de Borst
1b4389c7d7 Show manual instructions if opening preferences fails (#680) 2025-03-13 13:29:57 +01:00
Leendert de Borst
499d2759ce Add Safari extension docs (#680) 2025-03-13 13:29:57 +01:00
Leendert de Borst
d0140a8ddb Fix MacOS wrapper app links and content (#680) 2025-03-13 13:29:57 +01:00
Leendert de Borst
76dc465032 Refactor (#678) 2025-03-12 22:02:11 +01:00
Leendert de Borst
84420104ee Iframe and position tweaks (#678) 2025-03-12 22:02:11 +01:00
Leendert de Borst
1109bde521 Refactor all inline styles to separate style.css (#678) 2025-03-12 22:02:11 +01:00
Leendert de Borst
134a173148 Import stylesheet for contentScript (#678) 2025-03-12 22:02:11 +01:00
Leendert de Borst
83be492b3a Refactor injectIcon (#678) 2025-03-12 22:02:11 +01:00
Leendert de Borst
fac72e5a11 Refactor content script to use shadowroot UI (#678) 2025-03-12 22:02:11 +01:00
Leendert de Borst
5eb885da20 Refactor (#661) 2025-03-12 16:07:16 +01:00
Leendert de Borst
da4f286757 Add download links for Firefox, Edge, Safari and Brave (#661) 2025-03-12 16:07:16 +01:00
Leendert de Borst
f6db447ad4 Add Safari extension XCode project scaffolding (#661) 2025-03-12 16:07:16 +01:00
Leendert de Borst
b472ba749c Fix padding issue with search field in Safari (#661) 2025-03-12 16:07:16 +01:00
Leendert de Borst
ef68b3b265 Fix scroll issue for Safari browser (#661) 2025-03-12 16:07:16 +01:00
Leendert de Borst
08d4a8b656 Add light/dark mode toggle to browser extension settings (#661) 2025-03-12 16:07:16 +01:00
Leendert de Borst
93ac131508 Refactor expanded mode check to be called from React (#661) 2025-03-12 16:07:16 +01:00
Leendert de Borst
a7d1536140 Refactor and tweak UI (#672) 2025-03-11 16:59:12 +01:00
Leendert de Borst
4fa3fedea2 Add TotpViewer component (#672) 2025-03-11 16:59:12 +01:00
Leendert de Borst
038e8babb1 Update TotpViewer.razor (#672) 2025-03-11 16:59:12 +01:00
Leendert de Borst
0845477041 Add private vs public email domain documentation (#673) 2025-03-11 11:17:23 +01:00
Leendert de Borst
90156dd1f8 Refactor (#181) 2025-03-11 10:29:25 +01:00
Leendert de Borst
fe4b11cf4d Add TOTP E2E tests (#181) 2025-03-11 10:29:25 +01:00
Leendert de Borst
2cbf234d05 Refactor (#181) 2025-03-11 10:29:25 +01:00
Leendert de Borst
a53575b4bf Add click to copy and form validation (#181) 2025-03-11 10:29:25 +01:00
Leendert de Borst
697abc6828 Refactor TOTP code to work view AddEdit/View mode (#181) 2025-03-11 10:29:25 +01:00
Leendert de Borst
e96cfa3940 Update UX (#181) 2025-03-11 10:29:25 +01:00
Leendert de Borst
61a88e6715 Add credentials TOTP code scaffolding (#181) 2025-03-11 10:29:25 +01:00
Leendert de Borst
e07a35b214 Add firefox addon link to docs (#665) 2025-03-11 09:59:07 +01:00
Leendert de Borst
4a79fafbb9 Update README.md 2025-03-09 21:32:02 +01:00
Leendert de Borst
02b9bff64e Update browser-extension-build.yml (#665) 2025-03-09 20:46:50 +01:00
Leendert de Borst
55e02478b4 Merge pull request #666 from lanedirt/665-prepare-0130-release
Bump version to 0.13.0
2025-03-09 20:25:25 +01:00
Leendert de Borst
a576908ae2 Add edge extension store link (#665) 2025-03-09 19:55:21 +01:00
Leendert de Borst
95510f793b Unzip before uploading files to artifact (#665) 2025-03-09 16:39:53 +01:00
Leendert de Borst
20a4a82b1b Add compression level to prevent re-compressing (#665) 2025-03-09 16:28:50 +01:00
Leendert de Borst
61ba6e1a3c Store less vault revisions to reduce history filesize (#663) 2025-03-08 00:36:37 +00:00
Leendert de Borst
f28f1f07b8 Bump version to 0.13.0 (#665) 2025-03-08 01:23:32 +01:00
Leendert de Borst
7f186f1345 Update browser-extension-build.yml use short git hash (#581) 2025-03-07 22:50:55 +01:00
Leendert de Borst
129b50afba Update browser-extension-build.yml artifact paths (#581) 2025-03-07 22:32:31 +01:00
Leendert de Borst
bad0f485a9 Update browser-extension-build.yml to make all filenames consistent (#581) 2025-03-07 18:35:06 +01:00
Leendert de Borst
5d9ae7d189 Update browser-extension-build.yml firefox glob pattern (#581) 2025-03-07 18:30:58 +01:00
Leendert de Borst
ef8ab63b66 Add full paths to browser-extension-build.yml (#581) 2025-03-07 18:22:01 +01:00
dependabot[bot]
469466995c Bump NUglify from 1.21.12 to 1.21.13
Bumps [NUglify](https://github.com/trullock/NUglify) from 1.21.12 to 1.21.13.
- [Release notes](https://github.com/trullock/NUglify/releases)
- [Changelog](https://github.com/trullock/NUglify/blob/master/changelog.md)
- [Commits](https://github.com/trullock/NUglify/compare/v1.21.12...v1.21.13)

---
updated-dependencies:
- dependency-name: NUglify
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-07 17:16:18 +00:00
dependabot[bot]
62c5edc7dc Bump Swashbuckle.AspNetCore from 7.2.0 to 7.3.1
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 7.2.0 to 7.3.1.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v7.2.0...v7.3.1)

---
updated-dependencies:
- dependency-name: Swashbuckle.AspNetCore
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-07 17:16:08 +00:00
dependabot[bot]
ba625a30ea Bump NUnit3TestAdapter from 4.6.0 to 5.0.0
Bumps [NUnit3TestAdapter](https://github.com/nunit/nunit3-vs-adapter) from 4.6.0 to 5.0.0.
- [Release notes](https://github.com/nunit/nunit3-vs-adapter/releases)
- [Commits](https://github.com/nunit/nunit3-vs-adapter/compare/V4.6.0...V5.0.0)

---
updated-dependencies:
- dependency-name: NUnit3TestAdapter
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-07 17:15:57 +00:00
dependabot[bot]
bcdcbef912 Bump HtmlAgilityPack from 1.11.72 to 1.11.74
Bumps [HtmlAgilityPack](https://github.com/zzzprojects/html-agility-pack) from 1.11.72 to 1.11.74.
- [Release notes](https://github.com/zzzprojects/html-agility-pack/releases)
- [Commits](https://github.com/zzzprojects/html-agility-pack/compare/v1.11.72...v1.11.74)

---
updated-dependencies:
- dependency-name: HtmlAgilityPack
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-07 17:15:49 +00:00
Leendert de Borst
a64ed4817a Add returning users and email aliases cards to admin dashboard (#640) 2025-03-07 17:15:39 +00:00
Leendert de Borst
919a33defb Add total amount of records to admin page lists (#640) 2025-03-07 17:15:39 +00:00
Leendert de Borst
7e08f64175 Update MS edge browser extension docs (#581) 2025-03-07 17:18:38 +01:00
Leendert de Borst
e525bd1c2d Merge pull request #660 from lanedirt/581-feature-request-add-firefox-browser-extension
Add Firefox and Edge browser extension
2025-03-07 16:14:32 +00:00
Leendert de Borst
7298f8914d Add MS Edge as browser extension build target (#581) 2025-03-07 17:00:14 +01:00
Leendert de Borst
c476c53101 Update browser extension dictionaries folder load (#581) 2025-03-07 16:35:56 +01:00
Leendert de Borst
b6c7e88000 Refactor stop words to lang file (#581) 2025-03-07 15:34:24 +01:00
Leendert de Borst
26624e165a Update supported browser extension list in API (#581) 2025-03-07 15:28:07 +01:00
Leendert de Borst
c079b830b5 Add browser specific client name (#581) 2025-03-07 15:16:36 +01:00
Leendert de Borst
165a89e946 Use style.css instead of inline styles (#581) 2025-03-07 15:14:04 +01:00
Leendert de Borst
5042e1b696 Fix lint (#581) 2025-03-07 15:00:52 +01:00
Leendert de Borst
472a79a12b Update npm cache path (#581) 2025-03-07 14:58:23 +01:00
Leendert de Borst
97730cd721 Remove old browser extensions dir (#581) 2025-03-07 14:48:07 +01:00
Leendert de Borst
d5400faf95 Refactor chrome specific API, set font-size to 75% for all browsers (#581) 2025-03-07 14:47:12 +01:00
Leendert de Borst
9b8da64858 Refactor react entrypoint (#581) 2025-03-07 13:30:27 +01:00
Leendert de Borst
9ce776be2b Update docs for firefox browser extension (#581) 2025-03-07 13:05:22 +01:00
Leendert de Borst
d674c77216 Add firefox as browser extension target (#581) 2025-03-07 12:42:29 +01:00
Leendert de Borst
e41c4b3213 Update E2E tests (#581) 2025-03-07 12:18:40 +01:00
Leendert de Borst
f88670787f Update readme (#581) 2025-03-07 12:18:29 +01:00
Leendert de Borst
261be3ab34 Update feature_request.md 2025-03-07 12:01:52 +01:00
Leendert de Borst
0bace49e95 Update browser extension output path (#581) 2025-03-07 11:33:27 +01:00
Leendert de Borst
bb82952c74 Update github browser extension workflow for new path (#581) 2025-03-07 11:22:59 +01:00
Leendert de Borst
fd5244a686 Fix all linting issues (#581) 2025-03-07 01:18:14 +01:00
Leendert de Borst
09bc4286d9 Add linting packages (#581) 2025-03-07 00:49:47 +01:00
Leendert de Borst
4c45047d23 Add identity generator dict loader and test packages (#581) 2025-03-07 00:27:20 +01:00
Leendert de Borst
5251ea53ca Refactor contextmenu to use wxt browser api (#581) 2025-03-06 23:37:45 +01:00
Leendert de Borst
2da9955213 Refactor popup settings to use wxt browser (#581) 2025-03-06 23:29:05 +01:00
Leendert de Borst
fab12daacf Change index.html to popup.html paths (#581) 2025-03-06 19:32:23 +01:00
Leendert de Borst
9ba467479a Refactor messaging to use webext-bridge (#581) 2025-03-06 19:07:12 +01:00
Leendert de Borst
8e698a21fa Add all dependencies, refactor messaging (#581) 2025-03-06 18:47:16 +01:00
Leendert de Borst
28a0c7eb1f Wrap browser extension in wxt for multi-browser compilation (#581) 2025-03-06 16:17:14 +01:00
Leendert de Borst
fcbe8da1e6 Add minimum height to credential table view to not obstruct settings popup (#656) 2025-03-06 13:06:56 +00:00
Leendert de Borst
a0a3a2e14a Hide browser extension autofill injected icon on key press (#653) 2025-03-06 11:27:50 +00:00
Leendert de Borst
4fff14480b Add troubleshooting guide to docs (#655) 2025-03-06 11:11:15 +00:00
Leendert de Borst
c7ad42a63e Update PULL_REQUEST_TEMPLATE.md 2025-03-06 11:32:51 +01:00
Leendert de Borst
6df3c03682 Add less severe log message for email received for orphaned user email claim (#651) 2025-03-06 10:27:49 +00:00
Leendert de Borst
7da5557b98 Refactor favicon fetch to separate method (#649) 2025-03-06 09:41:52 +00:00
Leendert de Borst
38399e00cb Add favicon extract resize and compression (#649) 2025-03-06 09:41:52 +00:00
Leendert de Borst
b30338de37 Add extension version to settings page (#647) 2025-03-06 09:41:41 +00:00
Leendert de Borst
ceaa7731fe Update bottomnav to update selected item on path change (#647) 2025-03-06 09:41:41 +00:00
Leendert de Borst
b66c41e4c9 Add manual merge button, fix db upgrade test revision number (#643) 2025-03-05 19:40:31 +00:00
Leendert de Borst
9e478c94f9 Add browser extension vault outdate check, fix db create wait flow (#643) 2025-03-05 19:40:31 +00:00
Leendert de Borst
b415043b4e Add E2E test for browser extension credential create flow (#643) 2025-03-05 19:40:31 +00:00
dependabot[bot]
10f6525e94 Bump the npm_and_yarn group across 1 directory with 2 updates
Bumps the npm_and_yarn group with 2 updates in the /browser-extensions/chrome directory: [esbuild](https://github.com/evanw/esbuild) and [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite).


Updates `esbuild` from 0.24.2 to 0.25.0
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG-2024.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.24.2...v0.25.0)

Updates `vite` from 6.0.11 to 6.2.0
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/create-vite@6.2.0/packages/vite)

---
updated-dependencies:
- dependency-name: esbuild
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: vite
  dependency-type: direct:development
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-05 19:29:21 +00:00
dependabot[bot]
5fb12f26fe Bump uri in /docs in the bundler group across 1 directory
Bumps the bundler group with 1 update in the /docs directory: [uri](https://github.com/ruby/uri).


Updates `uri` from 1.0.2 to 1.0.3
- [Release notes](https://github.com/ruby/uri/releases)
- [Commits](https://github.com/ruby/uri/compare/v1.0.2...v1.0.3)

---
updated-dependencies:
- dependency-name: uri
  dependency-type: indirect
  dependency-group: bundler
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-05 16:21:51 +00:00
Leendert de Borst
6047c8f80d Update ConversionUtility.tsx (#638) 2025-03-05 12:15:39 +00:00
Leendert de Borst
1b6e220c5a Update TestUtils.ts (#638) 2025-03-05 12:15:39 +00:00
Leendert de Borst
b2093b5892 Refactor birthdate and gender field fill methods (#638) 2025-03-05 12:15:39 +00:00
Leendert de Borst
b81eabc583 Add locale specific formfiller tests and refactor all locale parts (#638) 2025-03-05 12:15:39 +00:00
Leendert de Borst
0c4be1398d Add FormFiller unit tests (#638) 2025-03-05 12:15:39 +00:00
Leendert de Borst
4aa0e5f8a1 Refactor form fill logic to its own class (#638) 2025-03-05 12:15:39 +00:00
Leendert de Borst
63c737b6cc Update tests (#628) 2025-03-04 17:43:06 +00:00
Leendert de Borst
44c2331b42 Refactor (#628) 2025-03-04 17:43:06 +00:00
Leendert de Borst
8f9058e1b8 Tweak tutorial with browser extension dl links (#628) 2025-03-04 17:43:06 +00:00
Leendert de Borst
613fb7db12 Refactor browser extension info to shared constants (#628) 2025-03-04 17:43:06 +00:00
Leendert de Borst
c4738637f1 Upload empty vault directly as part of creation step (#628) 2025-03-04 17:43:06 +00:00
Jack Bayliss
151cb19de8 Update README.md (#634) 2025-03-04 14:33:52 +01:00
Leendert de Borst
b0c53ca7b4 Add screenshots to README.md (#633)
* Update README.md

* Update README.md

* Update README.md
2025-03-03 13:43:27 +01:00
Leendert de Borst
586285c5e8 Update README.md 2025-03-03 12:09:24 +01:00
Leendert de Borst
5ca8fb92c8 Update README.md 2025-03-03 11:50:49 +01:00
Leendert de Borst
206254574a Bump version to 0.12.3 (#626) 2025-02-28 19:01:36 +01:00
Leendert de Borst
9a9fb12d73 Merge pull request #625 from lanedirt/622-make-browser-extension-autofill-popup-more-robust
Make browser extension autofill popup more robust
2025-02-28 18:39:04 +01:00
Leendert de Borst
5d0540ee2b Autofill form directly after creating new credential (#622) 2025-02-28 18:15:37 +01:00
Leendert de Borst
59726d87e8 Add full name form detection test (#622) 2025-02-28 13:30:35 +01:00
Leendert de Borst
7dccb6443a Improve firstname/lastname detection (#624) 2025-02-28 12:41:33 +01:00
Leendert de Borst
451fe98102 Add full name to form detector (#622) 2025-02-28 12:40:17 +01:00
Leendert de Borst
a82b7d7ce5 Update tailwind css (#622) 2025-02-28 12:12:23 +01:00
Leendert de Borst
9cbaf51778 Merge branch 'main' into 622-make-browser-extension-autofill-popup-more-robust 2025-02-28 12:00:04 +01:00
Leendert de Borst
1847293162 Merge pull request #621 from lanedirt/620-add-browser-extension-download-links-to-client
Add browser extension page and download links
2025-02-27 22:22:38 +01:00
Leendert de Borst
e5a174443d Merge branch 'main' into 620-add-browser-extension-download-links-to-client 2025-02-27 22:22:01 +01:00
Leendert de Borst
2382ee6592 Update brave detection and responsive design (#620) 2025-02-27 20:23:13 +01:00
Leendert de Borst
7253d1fee2 Do all logout actions via webapi which calls authcontext too (#622) 2025-02-27 17:53:48 +01:00
Leendert de Borst
bc16167293 Refactor (#622) 2025-02-27 17:53:48 +01:00
Leendert de Borst
eb587e3496 Add webapi logout call to all places (#622) 2025-02-27 17:53:48 +01:00
Leendert de Borst
6d0352923a Simplify main logout flow to use page redirect (#622) 2025-02-27 17:53:48 +01:00
Leendert de Borst
6d33f99d62 Update favicon display in client to handle SVG (#622) 2025-02-27 17:53:48 +01:00
Leendert de Borst
9fbdb2efbb Update form detection and popup icon display (#622) 2025-02-27 17:53:48 +01:00
Leendert de Borst
50817b65d3 Make popup create button more robust (#622) 2025-02-27 17:53:48 +01:00
Leendert de Borst
5750eef248 Add client header to webapi token refresh call (#618) 2025-02-27 17:52:01 +01:00
Leendert de Borst
5cd5efca4a Do all logout actions via webapi which calls authcontext too (#622) 2025-02-27 17:35:28 +01:00
Leendert de Borst
7ce841b4b5 Refactor (#622) 2025-02-27 17:19:33 +01:00
Leendert de Borst
5e1c79610f Add webapi logout call to all places (#622) 2025-02-27 16:54:54 +01:00
Leendert de Borst
a2ccee984b Simplify main logout flow to use page redirect (#622) 2025-02-27 16:39:33 +01:00
Leendert de Borst
f9977fb29e Update favicon display in client to handle SVG (#622) 2025-02-27 16:11:23 +01:00
Leendert de Borst
f8ea8fc7ce Update form detection and popup icon display (#622) 2025-02-27 15:48:56 +01:00
Leendert de Borst
4ab5be17c0 Make popup create button more robust (#622) 2025-02-27 15:24:54 +01:00
Leendert de Borst
ad8f13928e Make browser extension highlight/other dynamic (#620) 2025-02-27 14:12:00 +01:00
Leendert de Borst
29af7c2196 Add browser extension page and download links (#620) 2025-02-27 12:24:51 +01:00
Leendert de Borst
b25f6580cd Update README.md 2025-02-26 17:17:20 +01:00
Leendert de Borst
71ae5d0904 Update browser-extension-tests.yml 2025-02-25 13:50:34 +01:00
Leendert de Borst
5baede08a7 Bump version to 0.12.2 (#616) 2025-02-25 13:41:55 +01:00
Leendert de Borst
34995fe801 Fix cueck if client or api url are empty (#612) 2025-02-25 12:48:53 +01:00
Leendert de Borst
92a2511d9d Fix bug in browser extension emails list if credential has no email address (#612) 2025-02-25 12:48:53 +01:00
Leendert de Borst
41486c940c Update max nginx upload filesize to 25MB (#613) 2025-02-25 12:48:37 +01:00
Leendert de Borst
47c77ade02 Update install.sh to set default ip_logging value (#610) 2025-02-25 12:48:13 +01:00
Leendert de Borst
a51621970d Update browser-extension-tests.yml 2025-02-24 21:46:42 +01:00
Leendert de Borst
39f339b659 Bump version to 0.12.1 (#608) 2025-02-24 21:28:08 +01:00
Leendert de Borst
65d1ca1564 Add try catch for incorrect status login call (#601) 2025-02-24 21:27:57 +01:00
Leendert de Borst
5c010cd873 Add private/public email validation before showing recent emails (#602) 2025-02-24 21:20:21 +01:00
Leendert de Borst
88ba57ce88 Fix chrome extension API URL switching (#600) 2025-02-24 21:20:12 +01:00
Leendert de Borst
4d266beb0d Add anchor tag conversion to open in new tab in email display (#603) 2025-02-24 21:20:02 +01:00
Leendert de Borst
536688d110 Enable manual workflow dispatch for release archive logic 2025-02-24 18:16:10 +01:00
Leendert de Borst
e343b48fe7 Update browser-extension-tests.yml 2025-02-24 18:10:54 +01:00
Leendert de Borst
9d02737516 Reduce credential table margins (#578) 2025-02-24 17:59:27 +01:00
Leendert de Borst
4a1583a7ff Bump version to 0.12.0 (#598) 2025-02-24 16:46:50 +01:00
Leendert de Borst
4f8125ddb0 Ignore BrowserWasmTests as it no longer works in Chrome (#593) 2025-02-24 15:58:19 +01:00
Leendert de Borst
972505c174 Refactor close popup (#578) 2025-02-24 14:10:48 +01:00
Leendert de Borst
d5e83d2319 Update credentials table sort logic (#578) 2025-02-24 14:10:48 +01:00
Leendert de Borst
9daac83768 Add credentials table view and configure asc/desc sort (#578) 2025-02-24 14:10:48 +01:00
Leendert de Borst
bb477e6f91 Bump all Microsoft dependencies to .NET 9.0.2 (#593) 2025-02-24 14:02:50 +01:00
Leendert de Borst
b216a9d2a9 Bump dependencies across projects (#593) 2025-02-24 13:48:25 +01:00
dependabot[bot]
b66bcefdde Bump Microsoft.Extensions.Configuration from 9.0.1 to 9.0.2
Bumps [Microsoft.Extensions.Configuration](https://github.com/dotnet/runtime) from 9.0.1 to 9.0.2.
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/compare/v9.0.1...v9.0.2)

---
updated-dependencies:
- dependency-name: Microsoft.Extensions.Configuration
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-24 13:42:04 +01:00
Leendert de Borst
6fdb9a7c3e Merge pull request #593 from lanedirt/dependabot/nuget/main/Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore-9.0.2
Bump Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore from 9.0.1 to 9.0.2
2025-02-24 13:34:32 +01:00
Leendert de Borst
411b2262e1 Merge branch 'main' into dependabot/nuget/main/Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore-9.0.2 2025-02-24 13:34:23 +01:00
Leendert de Borst
72b82671f9 Merge pull request #591 from lanedirt/dependabot/nuget/main/multi-7c78ffaa07
Bump Microsoft.EntityFrameworkCore and Microsoft.EntityFrameworkCore.Design
2025-02-24 13:33:51 +01:00
Leendert de Borst
713c21b60c Merge branch 'main' into dependabot/nuget/main/multi-7c78ffaa07 2025-02-24 13:33:29 +01:00
dependabot[bot]
84b592df7b Bump Microsoft.AspNetCore.Authorization and Microsoft.AspNetCore.Components.WebAssembly.Authentication
Bumps [Microsoft.AspNetCore.Authorization](https://github.com/dotnet/aspnetcore) and [Microsoft.AspNetCore.Components.WebAssembly.Authentication](https://github.com/dotnet/aspnetcore). These dependencies needed to be updated together.

Updates `Microsoft.AspNetCore.Authorization` from 9.0.1 to 9.0.2
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.1...v9.0.2)

Updates `Microsoft.AspNetCore.Components.WebAssembly.Authentication` from 9.0.1 to 9.0.2
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.1...v9.0.2)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Authorization
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.AspNetCore.Components.WebAssembly.Authentication
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-24 13:20:06 +01:00
dependabot[bot]
8420f2d42e Bump Microsoft.AspNetCore.Authorization and Microsoft.AspNetCore.Components.Web
Bumps [Microsoft.AspNetCore.Authorization](https://github.com/dotnet/aspnetcore) and [Microsoft.AspNetCore.Components.Web](https://github.com/dotnet/aspnetcore). These dependencies needed to be updated together.

Updates `Microsoft.AspNetCore.Authorization` from 9.0.1 to 9.0.2
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.1...v9.0.2)

Updates `Microsoft.AspNetCore.Components.Web` from 9.0.1 to 9.0.2
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.1...v9.0.2)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Authorization
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.AspNetCore.Components.Web
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-24 13:19:58 +01:00
dependabot[bot]
58ed0bbf4a Bump Microsoft.EntityFrameworkCore and Microsoft.EntityFrameworkCore.Proxies
Bumps [Microsoft.EntityFrameworkCore](https://github.com/dotnet/efcore) and [Microsoft.EntityFrameworkCore.Proxies](https://github.com/dotnet/efcore). These dependencies needed to be updated together.

Updates `Microsoft.EntityFrameworkCore` from 9.0.0 to 9.0.2
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v9.0.0...v9.0.2)

Updates `Microsoft.EntityFrameworkCore.Proxies` from 9.0.0 to 9.0.2
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v9.0.0...v9.0.2)

---
updated-dependencies:
- dependency-name: Microsoft.EntityFrameworkCore
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.EntityFrameworkCore.Proxies
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-24 13:19:44 +01:00
dependabot[bot]
153e10fcd0 Bump Microsoft.EntityFrameworkCore.Tools from 9.0.1 to 9.0.2
Bumps [Microsoft.EntityFrameworkCore.Tools](https://github.com/dotnet/efcore) from 9.0.1 to 9.0.2.
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v9.0.1...v9.0.2)

---
updated-dependencies:
- dependency-name: Microsoft.EntityFrameworkCore.Tools
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-24 13:19:36 +01:00
dependabot[bot]
717dec329b Bump NUglify from 1.21.11 to 1.21.12
Bumps [NUglify](https://github.com/trullock/NUglify) from 1.21.11 to 1.21.12.
- [Release notes](https://github.com/trullock/NUglify/releases)
- [Changelog](https://github.com/trullock/NUglify/blob/master/changelog.md)
- [Commits](https://github.com/trullock/NUglify/compare/v1.21.11...v1.21.12)

---
updated-dependencies:
- dependency-name: NUglify
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-24 13:19:28 +01:00
dependabot[bot]
0bd25e70f5 Bump Microsoft.IdentityModel.JsonWebTokens and Microsoft.IdentityModel.Tokens
Bumps [Microsoft.IdentityModel.JsonWebTokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet) and [Microsoft.IdentityModel.Tokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet). These dependencies needed to be updated together.

Updates `Microsoft.IdentityModel.JsonWebTokens` from 8.3.1 to 8.6.0
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.3.1...8.6.0)

Updates `Microsoft.IdentityModel.Tokens` from 8.3.1 to 8.6.0
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.3.1...8.6.0)

---
updated-dependencies:
- dependency-name: Microsoft.IdentityModel.JsonWebTokens
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: Microsoft.IdentityModel.Tokens
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-24 13:19:21 +01:00
dependabot[bot]
920c1bdebe Bump Microsoft.AspNetCore.DataProtection from 9.0.1 to 9.0.2
Bumps [Microsoft.AspNetCore.DataProtection](https://github.com/dotnet/aspnetcore) from 9.0.1 to 9.0.2.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.1...v9.0.2)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.DataProtection
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-24 13:19:13 +01:00
dependabot[bot]
6506b57d9f Bump Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Bumps [Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore](https://github.com/dotnet/aspnetcore) from 9.0.1 to 9.0.2.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.1...v9.0.2)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-24 10:47:56 +00:00
dependabot[bot]
aea98a51a9 Bump Microsoft.EntityFrameworkCore and Microsoft.EntityFrameworkCore.Design
Bumps [Microsoft.EntityFrameworkCore](https://github.com/dotnet/efcore) and [Microsoft.EntityFrameworkCore.Design](https://github.com/dotnet/efcore). These dependencies needed to be updated together.

Updates `Microsoft.EntityFrameworkCore` from 9.0.0 to 9.0.2
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v9.0.0...v9.0.2)

Updates `Microsoft.EntityFrameworkCore.Design` from 9.0.0 to 9.0.2
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v9.0.0...v9.0.2)

---
updated-dependencies:
- dependency-name: Microsoft.EntityFrameworkCore
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.EntityFrameworkCore.Design
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-24 10:43:30 +00:00
Leendert de Borst
7f28001f7e Merge pull request #585 from lanedirt/571-feature-request-make-ip-address-logging-optional
Make ip address logging optional
2025-02-24 10:42:44 +01:00
Leendert de Borst
d1d6bfb957 Add ip logging info to install docs (#571) 2025-02-24 10:42:24 +01:00
Leendert de Borst
a3b1fc0a21 Add E2E tests for ip logging enable/disable (#571) 2025-02-23 17:24:22 +01:00
Leendert de Borst
38ac1f731a Add IP_LOGGING_ENABLED flag (#571) 2025-02-23 16:51:10 +01:00
Leendert de Borst
c7d0013b9f Merge pull request #584 from lanedirt/579-bug-admin-server-settings-page-margins-are-too-wide
Admin and client UI tweaks
2025-02-23 16:04:46 +01:00
Leendert de Borst
1634721474 Update create new identity widget positioning (#579) 2025-02-22 10:08:16 +01:00
Leendert de Borst
f227725778 Do not show trailing dots for short email subjects (#579) 2025-02-22 09:54:25 +01:00
Leendert de Borst
912bdfbe7d Fix margin on credential delete page (#579) 2025-02-22 09:34:15 +01:00
Leendert de Borst
c82e9a9517 Fix margin on admin server settings page (#579) 2025-02-22 09:29:55 +01:00
Leendert de Borst
d765978e63 Add account delete E2E test (#373) 2025-02-21 21:11:47 +01:00
Leendert de Borst
3d819dce2a Add account self-delete option to client (#373) 2025-02-21 21:11:47 +01:00
dependabot[bot]
23bbc7eedb Bump vitest
Bumps the npm_and_yarn group with 1 update in the /browser-extensions/chrome directory: [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).


Updates `vitest` from 3.0.4 to 3.0.5
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Commits](https://github.com/vitest-dev/vitest/commits/v3.0.5/packages/vitest)

---
updated-dependencies:
- dependency-name: vitest
  dependency-type: direct:production
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-21 21:11:19 +01:00
Leendert de Borst
26b9d07e7c Update browser-extension-tests.yml for branch names (#541) 2025-02-21 20:55:06 +01:00
Leendert de Borst
89a24ead1a Update browser-extension-tests.yml for main branch (#541) 2025-02-21 18:10:50 +01:00
dependabot[bot]
10e2787b4f Bump nokogiri in /docs in the bundler group across 1 directory
Bumps the bundler group with 1 update in the /docs directory: [nokogiri](https://github.com/sparklemotion/nokogiri).


Updates `nokogiri` from 1.16.7 to 1.18.3
- [Release notes](https://github.com/sparklemotion/nokogiri/releases)
- [Changelog](https://github.com/sparklemotion/nokogiri/blob/v1.18.3/CHANGELOG.md)
- [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.16.7...v1.18.3)

---
updated-dependencies:
- dependency-name: nokogiri
  dependency-type: indirect
  dependency-group: bundler
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-21 18:06:12 +01:00
dependabot[bot]
d93a6c603d Bump Microsoft.Extensions.Http from 9.0.0 to 9.0.2
Bumps [Microsoft.Extensions.Http](https://github.com/dotnet/runtime) from 9.0.0 to 9.0.2.
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/compare/v9.0.0...v9.0.2)

---
updated-dependencies:
- dependency-name: Microsoft.Extensions.Http
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-21 18:06:06 +01:00
dependabot[bot]
7bc1ccdb7b Bump Microsoft.AspNetCore.Identity.EntityFrameworkCore and Microsoft.EntityFrameworkCore
Bumps [Microsoft.AspNetCore.Identity.EntityFrameworkCore](https://github.com/dotnet/aspnetcore) and [Microsoft.EntityFrameworkCore](https://github.com/dotnet/efcore). These dependencies needed to be updated together.

Updates `Microsoft.AspNetCore.Identity.EntityFrameworkCore` from 9.0.0 to 9.0.2
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.0...v9.0.2)

Updates `Microsoft.EntityFrameworkCore` from 9.0.0 to 9.0.2
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v9.0.0...v9.0.2)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Identity.EntityFrameworkCore
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.EntityFrameworkCore
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-21 18:05:55 +01:00
dependabot[bot]
f30b3895ba Bump Microsoft.AspNetCore.Authentication.JwtBearer, Microsoft.IdentityModel.JsonWebTokens and Microsoft.IdentityModel.Tokens
Bumps [Microsoft.AspNetCore.Authentication.JwtBearer](https://github.com/dotnet/aspnetcore), [Microsoft.IdentityModel.JsonWebTokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet) and [Microsoft.IdentityModel.Tokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet). These dependencies needed to be updated together.

Updates `Microsoft.AspNetCore.Authentication.JwtBearer` from 9.0.1 to 9.0.2
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.1...v9.0.2)

Updates `Microsoft.IdentityModel.JsonWebTokens` from 8.3.1 to 8.0.1
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.3.1...8.0.1)

Updates `Microsoft.IdentityModel.Tokens` from 8.3.1 to 8.0.1
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.3.1...8.0.1)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Authentication.JwtBearer
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.IdentityModel.JsonWebTokens
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: Microsoft.IdentityModel.Tokens
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-21 18:05:49 +01:00
dependabot[bot]
ef8c61c6c9 Bump Microsoft.AspNetCore.Components.WebAssembly.Server
Bumps [Microsoft.AspNetCore.Components.WebAssembly.Server](https://github.com/dotnet/aspnetcore) from 9.0.0 to 9.0.2.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.0...v9.0.2)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Components.WebAssembly.Server
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-21 18:05:37 +01:00
dependabot[bot]
7c65247162 Bump MimeKit from 4.9.0 to 4.10.0
Bumps [MimeKit](https://github.com/jstedfast/MimeKit) from 4.9.0 to 4.10.0.
- [Changelog](https://github.com/jstedfast/MimeKit/blob/master/ReleaseNotes.md)
- [Commits](https://github.com/jstedfast/MimeKit/compare/4.9.0...4.10.0)

---
updated-dependencies:
- dependency-name: MimeKit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-21 18:05:31 +01:00
dependabot[bot]
af166c27fd Bump Microsoft.AspNetCore.Authorization and Microsoft.AspNetCore.Components.WebAssembly
Bumps [Microsoft.AspNetCore.Authorization](https://github.com/dotnet/aspnetcore) and [Microsoft.AspNetCore.Components.WebAssembly](https://github.com/dotnet/aspnetcore). These dependencies needed to be updated together.

Updates `Microsoft.AspNetCore.Authorization` from 9.0.1 to 9.0.1
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.1...v9.0.1)

Updates `Microsoft.AspNetCore.Components.WebAssembly` from 9.0.0 to 9.0.1
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.0...v9.0.1)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Authorization
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.AspNetCore.Components.WebAssembly
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-21 18:05:24 +01:00
dependabot[bot]
90b1d0ae09 Bump Microsoft.EntityFrameworkCore.Tools from 9.0.0 to 9.0.1
Bumps [Microsoft.EntityFrameworkCore.Tools](https://github.com/dotnet/efcore) from 9.0.0 to 9.0.1.
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v9.0.0...v9.0.1)

---
updated-dependencies:
- dependency-name: Microsoft.EntityFrameworkCore.Tools
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-21 18:05:15 +01:00
dependabot[bot]
b4c84d9894 Bump Microsoft.AspNetCore.Authorization and Microsoft.AspNetCore.Components.Web
Bumps [Microsoft.AspNetCore.Authorization](https://github.com/dotnet/aspnetcore) and [Microsoft.AspNetCore.Components.Web](https://github.com/dotnet/aspnetcore). These dependencies needed to be updated together.

Updates `Microsoft.AspNetCore.Authorization` from 9.0.1 to 9.0.1
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.1...v9.0.1)

Updates `Microsoft.AspNetCore.Components.Web` from 9.0.0 to 9.0.1
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.0...v9.0.1)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Authorization
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.AspNetCore.Components.Web
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-21 18:05:09 +01:00
dependabot[bot]
bce4327f2d Bump coverlet.msbuild from 6.0.3 to 6.0.4
Bumps [coverlet.msbuild](https://github.com/coverlet-coverage/coverlet) from 6.0.3 to 6.0.4.
- [Release notes](https://github.com/coverlet-coverage/coverlet/releases)
- [Commits](https://github.com/coverlet-coverage/coverlet/compare/v6.0.3...v6.0.4)

---
updated-dependencies:
- dependency-name: coverlet.msbuild
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-21 18:05:01 +01:00
dependabot[bot]
1fe967624f Bump MailKit from 4.9.0 to 4.10.0
Bumps [MailKit](https://github.com/jstedfast/MailKit) from 4.9.0 to 4.10.0.
- [Changelog](https://github.com/jstedfast/MailKit/blob/master/ReleaseNotes.md)
- [Commits](https://github.com/jstedfast/MailKit/compare/4.9.0...4.10.0)

---
updated-dependencies:
- dependency-name: MailKit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-21 18:04:51 +01:00
Leendert de Borst
1ee02a3d22 Merge pull request #568 from lanedirt/541-add-browser-extensions-with-auto-fill-mechanism
Add Chrome browser extension
2025-02-21 18:04:09 +01:00
Leendert de Borst
ac7b6facd6 Fix bug in base64 encode which didnt work for large icons (#541) 2025-02-21 17:21:47 +01:00
Leendert de Borst
58e294b509 Fix duplicate credential popup issue (#541) 2025-02-21 17:04:39 +01:00
Leendert de Borst
e8314f91dc Update credentials list to properly refresh with new vault (#541) 2025-02-21 16:31:30 +01:00
Leendert de Borst
977acf84c5 Email UI tweaks (#541) 2025-02-21 15:34:08 +01:00
Leendert de Borst
aa9619efad Performance tweaks (#541) 2025-02-21 14:21:09 +01:00
Leendert de Borst
e6ccea1c59 Update README.md (#541) 2025-02-21 13:16:47 +01:00
Leendert de Borst
f691056db6 Update login screen (#541) 2025-02-21 13:07:20 +01:00
Leendert de Borst
08d7013f75 Add browser extension assets to GH release (#541) 2025-02-21 12:54:57 +01:00
Leendert de Borst
067a949c49 Refactor vaultstate to chrome.storage.session (#541) 2025-02-21 12:47:52 +01:00
Leendert de Borst
38ee886be2 Show target API endpoint on login form (#541) 2025-02-21 12:18:16 +01:00
Leendert de Borst
9ae5e994bd Add browser extension docs (#541) 2025-02-21 11:22:20 +01:00
Leendert de Borst
42573bf1fc Fix redirect when opening extension popup externally (#541) 2025-02-20 23:57:23 +01:00
Leendert de Borst
59e99153c3 Update create new release docs (#541) 2025-02-20 23:17:03 +01:00
Leendert de Borst
d2c24792fe Simplify form detector password confirm (#541) 2025-02-20 23:16:49 +01:00
Leendert de Borst
d674563275 Update docs (#541) 2025-02-20 22:13:54 +01:00
Leendert de Borst
e153dc6d2a Refactor (#541) 2025-02-20 17:23:18 +01:00
Leendert de Borst
fdbf3db6bb Refactor formdetector to separate localization params (#541) 2025-02-20 16:58:46 +01:00
Leendert de Borst
a6529d67fa Refactoring (#541) 2025-02-20 16:05:08 +01:00
Leendert de Borst
45f748e247 Add server version check (#541) 2025-02-20 15:22:30 +01:00
Leendert de Borst
57673b5ee0 Update auth login flow (#541) 2025-02-20 13:54:49 +01:00
Leendert de Borst
8ea0273174 Improve credentials list mount logic (#541) 2025-02-20 11:38:35 +01:00
Leendert de Borst
a31c516fa5 Accessibility refactor (#541) 2025-02-20 11:04:28 +01:00
Leendert de Borst
bb9e986874 Add explicit autofill trigger to context menu (#541) 2025-02-19 13:54:30 +01:00
Leendert de Borst
533065c7d3 Add popup show debounce to prevent autofill from spamming popup (#541) 2025-02-19 13:31:38 +01:00
Leendert de Borst
16a22b6fa3 Update .gitignore (#541) 2025-02-19 12:56:20 +01:00
Leendert de Borst
4d42e7b32e Update form detection logic, update tests (#541) 2025-02-19 12:56:11 +01:00
Leendert de Borst
b50205b318 Fix link in docs (#541) 2025-02-19 00:34:22 +01:00
Leendert de Borst
196e19573d Sonarcloud refactoring (#541) 2025-02-19 00:30:05 +01:00
Leendert de Borst
9de7f81053 Refactor math.random (#541) 2025-02-18 21:46:19 +01:00
Leendert de Borst
75cf43aaba Fix extension E2E test (#541) 2025-02-18 21:28:20 +01:00
Leendert de Borst
1d76597ee2 Update light mode style (#541) 2025-02-18 21:28:08 +01:00
Leendert de Borst
887e91f4c6 Refactor (#541) 2025-02-18 12:52:15 +01:00
Leendert de Borst
c4afb9eeb2 Update Settings.tsx (#541) 2025-02-18 11:58:09 +01:00
Leendert de Borst
9151e504bc Fix EmailDetails global loading state hide (#541) 2025-02-17 15:11:08 +01:00
Leendert de Borst
b20d330fdc Add global popup toggle to settings (#541) 2025-02-17 15:06:09 +01:00
Leendert de Borst
9c5f5fa5cd Improve popup visibility (#541) 2025-02-17 14:28:59 +01:00
Leendert de Borst
de85430998 Make extension work with iframes (#541) 2025-02-17 13:41:16 +01:00
Leendert de Borst
6df6bb071a Add search bar to credentials list (#541) 2025-02-17 12:39:12 +01:00
Leendert de Borst
1263639ca2 Update contentscript and inject icon logic (#541) 2025-02-17 11:25:14 +01:00
Leendert de Borst
ad52ec5db1 Improve favicon extraction (#541) 2025-02-16 14:26:13 +01:00
Leendert de Borst
665abcd894 Update popup style (#541) 2025-02-15 20:43:11 +01:00
Leendert de Borst
8b5cd28e4d Fix api date test to ignore rounding issue (#541) 2025-02-15 09:43:42 +01:00
Leendert de Borst
45a5d7fb20 Fix CSS style conflicts (#541) 2025-02-15 09:39:15 +01:00
Leendert de Borst
7fefe9f0bb Improve username field detection (#541) 2025-02-14 23:53:53 +01:00
Leendert de Borst
3fe5fbd981 Update formdetector for name fields (#541) 2025-02-14 22:41:19 +01:00
Leendert de Borst
c13e0571ab Fix date select field detection and fill (#541) 2025-02-14 22:16:37 +01:00
Leendert de Borst
fbf7f5b4e4 Update password field extraction (#541) 2025-02-14 21:31:31 +01:00
Leendert de Borst
8c132f30fb Improve email detection (#541) 2025-02-14 17:00:21 +01:00
Leendert de Borst
7def472df5 Improve form detection for gender fields (#541) 2025-02-14 16:36:11 +01:00
Leendert de Borst
0069b8cfc6 Add date field recognition with slashes (#541) 2025-02-14 16:10:45 +01:00
Leendert de Borst
53246a3d99 Update popup styling to be more explicit (#541) 2025-02-14 15:45:00 +01:00
Leendert de Borst
11a33d5ea7 Refactor formdetector to focus on focused elements parent form (#541) 2025-02-14 15:04:14 +01:00
Leendert de Borst
f5fb69e756 Do not include querystring when copying url for new credential (#541) 2025-02-14 14:29:35 +01:00
Leendert de Borst
519bd0801d Update SearchWidget.razor (#541) 2025-02-14 14:13:37 +01:00
Leendert de Borst
cba4a6d3ec Add email attachment download (#541) 2025-02-14 14:06:29 +01:00
Leendert de Borst
5daa95a876 Reduce size of popup (#541) 2025-02-14 11:44:17 +01:00
Leendert de Borst
b81613b785 Fix popup links (#541) 2025-02-13 17:11:51 +01:00
Leendert de Borst
2013f48ddd Improve logout reset (#541) 2025-02-13 16:27:19 +01:00
Leendert de Borst
867b37ab79 Improve icon inject (#541) 2025-02-13 16:16:46 +01:00
Leendert de Borst
390c77448e Return all credentials on search (#541) 2025-02-13 15:07:48 +01:00
Leendert de Borst
7f23c4820c Update popup style (#541) 2025-02-13 14:56:54 +01:00
Leendert de Borst
d6c3bd5cc1 Update autofill popup UI (#541) 2025-02-13 13:49:43 +01:00
Leendert de Borst
ccdb62762e Fix date handling timezone bug with PostgreSQL (#541) 2025-02-13 13:02:42 +01:00
Leendert de Borst
e5552e80e6 Tweak loading states (#541) 2025-02-13 12:09:36 +01:00
Leendert de Borst
47201b5433 Add status call to unlock page, fix redirect bug (#541) 2025-02-12 11:27:03 +01:00
Leendert de Borst
0862aa64cb Add vault status check before generating new credential (#541) 2025-02-11 17:16:42 +01:00
Leendert de Borst
bd833414ad Improve loading UX (#541) 2025-02-11 15:00:59 +01:00
Leendert de Borst
a3d8242dc4 Add status call to credential list page (#541) 2025-02-11 13:33:33 +01:00
Leendert de Borst
6ea4a9724f Fix redirect issue (#541) 2025-02-11 12:19:21 +01:00
Leendert de Borst
84d3a25304 Add client version check and vault revision number to status endpoint (#541) 2025-02-10 17:17:14 +01:00
Leendert de Borst
a9044e95ca Log client in vault metadata (#541) 2025-02-10 14:22:55 +01:00
Leendert de Borst
9eaf8fb369 Refactor (#541) 2025-02-10 13:01:59 +01:00
Leendert de Borst
c2d035510a Update client name and lint fixes (#541) 2025-02-10 12:35:17 +01:00
Leendert de Borst
117da9dfc8 Fix build issues (#541) 2025-02-10 12:33:24 +01:00
Leendert de Borst
0633bc2943 Add AV and SpamOK client headers (#541) 2025-02-10 11:46:16 +01:00
Leendert de Borst
e153dc6fe7 Add client to auth logs in api and wasm client (#541) 2025-02-10 11:32:39 +01:00
Leendert de Borst
1ed74874e5 Add global state change handler to detect logout (#541) 2025-02-10 10:38:28 +01:00
Leendert de Borst
620aeaf941 Add generic vault validate method (#541) 2025-02-09 22:42:21 +01:00
Leendert de Borst
d298748b10 Add min vault version check (#541) 2025-02-09 19:29:41 +01:00
Leendert de Borst
c46e836c28 Add empty vault check to login (#541) 2025-02-09 19:13:48 +01:00
Leendert de Borst
2bcf0c9914 Update login page (#541) 2025-02-08 18:37:26 +01:00
Leendert de Borst
0e275a3e6f Update settings text (#541) 2025-02-08 15:41:30 +01:00
Leendert de Borst
0d6878e5c7 Tweak bg color (#541) 2025-02-08 15:08:26 +01:00
Leendert de Borst
24d9999fde Linting refactor (#541) 2025-02-07 17:26:26 +01:00
Leendert de Borst
5594c1ad2f Add settings page to control popup enable/disable (#541) 2025-02-07 17:18:12 +01:00
Leendert de Borst
20c44ec737 Keep icon visible after click (#541) 2025-02-07 16:37:47 +01:00
Leendert de Borst
b46637f8a0 Tweak autofill and add animation (#541) 2025-02-07 16:12:38 +01:00
Leendert de Borst
a22dbc59ac Fix inline unlock mode (#541) 2025-02-07 15:24:01 +01:00
Leendert de Borst
06d6693752 Add OOBE text (#541) 2025-02-07 15:08:28 +01:00
Leendert de Borst
c28f6f05b2 Implement 2FA for login flow (#541) 2025-02-07 13:51:34 +01:00
Leendert de Borst
10f9d5e2b1 Refactor email decryption to util method (#541) 2025-02-07 12:57:49 +01:00
Leendert de Borst
f30789f906 Add popout and public email support to credential view (#541) 2025-02-07 12:34:45 +01:00
Leendert de Borst
b66c0580cf Update tests (#541) 2025-02-06 21:51:45 +01:00
Leendert de Borst
5db8c99b74 Update vite.config.js (#541) 2025-02-06 21:44:25 +01:00
Leendert de Borst
92c042450f Add email preview to credential detail page (#541) 2025-02-06 21:40:10 +01:00
Leendert de Borst
4c60a3efa1 Remove paging params from email list (#541) 2025-02-06 20:12:21 +01:00
Leendert de Borst
51af2838d9 Fix contentScript rename capital case folder name (#541) 2025-02-06 19:27:18 +01:00
Leendert de Borst
70cad70766 Add go-edit and go-delete keyboard shortcuts to client (#541) 2025-02-06 19:26:40 +01:00
Leendert de Borst
d78214393a Add database version extraction and update revision number (#541) 2025-02-06 14:44:14 +01:00
Leendert de Borst
e62dcd5327 Add vault version check to webapi to prevent conflicts (#541) 2025-02-06 14:02:31 +01:00
Leendert de Borst
87ec52223a Add settings retrieval from vault (#541) 2025-02-06 13:36:30 +01:00
Leendert de Borst
562abb6641 Remove obsolete vault state params (#541) 2025-02-06 12:39:38 +01:00
Leendert de Borst
f894476e0e Add single credential retrieve query (#541) 2025-02-06 12:15:08 +01:00
Leendert de Borst
826037d499 Refactor db initialize (#541) 2025-02-06 11:57:17 +01:00
Leendert de Borst
b1ef958976 Make index.html be included with npm run watch (#541) 2025-02-06 11:16:16 +01:00
Leendert de Borst
5d03c617c0 Tweak folder structure (#541) 2025-02-06 10:22:02 +01:00
Leendert de Borst
0996375c5e Eslint refactoring (#541) 2025-02-06 09:38:53 +01:00
Leendert de Borst
d927640136 Require jsdoc descriptions to be non-empty (#541) 2025-02-05 17:59:56 +01:00
Leendert de Borst
1d59548df0 Linting fixes (#541) 2025-02-05 17:58:49 +01:00
Leendert de Borst
b8a5233a06 Refactor background.ts to separate files (#541) 2025-02-05 17:22:33 +01:00
Leendert de Borst
908efadcec Refactor code and enforce 2 space indents (#541) 2025-02-05 16:45:21 +01:00
Leendert de Borst
3f5f752a2f Refactor contentscript to individual files (#541) 2025-02-05 16:30:03 +01:00
Leendert de Borst
7fdbe812d3 Refactor contentScript.ts (#541) 2025-02-05 15:46:40 +01:00
Leendert de Borst
df71d7e3f0 Improve icon inject mechanism (#541) 2025-02-05 14:52:27 +01:00
Leendert de Borst
c97b049ed0 Refactor folder structure to prevent having src output dir (#541) 2025-02-05 13:57:49 +01:00
Leendert de Borst
267cd6e9f6 Refactor vite config to fix import conflicts (#541) 2025-02-05 13:44:00 +01:00
Leendert de Borst
ef41018ac1 Add context menu with password generator (#541) 2025-02-05 11:16:53 +01:00
Leendert de Borst
54f891548b Fix search results and UI tweaks (#541) 2025-02-05 10:53:55 +01:00
Leendert de Borst
b92f5a5971 Revert to original search results on removing search term (#541) 2025-02-04 16:34:36 +01:00
Leendert de Borst
8415331eee Show loading animation when creating new alias (#541) 2025-02-04 16:30:33 +01:00
Leendert de Borst
afd686f81b Update credential row UI (#541) 2025-02-04 16:26:30 +01:00
Leendert de Borst
413c300904 Add popout icon for every autofill match (#541) 2025-02-04 15:57:29 +01:00
Leendert de Borst
bc4fb0ad21 Add birthdate format detection (#541) 2025-02-04 15:02:01 +01:00
Leendert de Borst
2193c4d6e3 Attach autofill icon to first element based on dom order (#541) 2025-02-04 14:52:12 +01:00
Leendert de Borst
33fe0b74ae Add email confirm field detect (#541) 2025-02-04 14:38:47 +01:00
Leendert de Borst
738f93b882 Update formdetector to detect more variations (#541) 2025-02-04 14:01:06 +01:00
Leendert de Borst
b875fcad4e Add additional formdetector test (#541) 2025-02-04 13:35:44 +01:00
Leendert de Borst
c56dbba687 Simulate proper input events for birthdate and gender fields (#541) 2025-02-04 10:42:19 +01:00
Leendert de Borst
44783bbeb0 Add birthdate and gender form field detection (#541) 2025-02-04 10:29:22 +01:00
Leendert de Borst
3428291c54 Add second form detector test (#541) 2025-02-04 10:02:30 +01:00
Leendert de Borst
fa221e3ae5 Refactor formdetector and make it testable (#541) 2025-02-04 09:51:58 +01:00
Leendert de Borst
cc23f50edf Add UX improvements (#541) 2025-02-04 09:21:25 +01:00
Leendert de Borst
f811a028cd Show newest credentials on top (#541) 2025-02-03 19:46:45 +01:00
Leendert de Borst
ff0d2cf390 Add vault upload mechanism (#541) 2025-02-03 19:25:38 +01:00
Leendert de Borst
c47aa4e182 Add loading indicator to contentscript (#541) 2025-02-03 17:30:33 +01:00
Leendert de Borst
1d119aad62 Add favicon extraction (#541) 2025-02-03 17:06:40 +01:00
Leendert de Borst
254b9c0a49 Add credential create scaffolding (#541) 2025-02-03 16:15:05 +01:00
Leendert de Borst
e760c236bc Add public/private email domain persist from API (#541) 2025-02-03 15:21:17 +01:00
Leendert de Borst
01f32af6a1 Update client vault model with new optional values (#541)
Save public and private email domains locally in vault (#541)

Update dockerfile for private email domains (#541)

Update tests (#541)

Revert "Update dockerfile for private email domains (#541)"

This reverts commit 016200c4f413502634925183db3a6df421219a8f.

Revert "Save public and private email domains locally in vault (#541)"

This reverts commit 549c3cce83fe7d051f828008917c6b320e9058ab.
2025-02-02 15:44:58 +01:00
Leendert de Borst
66b59ce94b Add private and public email to vault response in API (#541) 2025-02-02 13:51:41 +01:00
Leendert de Borst
69c9a4bdd0 Move identity generator dictionaries to root for reuse (#541) 2025-02-01 19:58:21 +01:00
Leendert de Borst
e5ead966e9 Add dictionary loader vite plugin to inject identity generator dict content (#541) 2025-02-01 13:03:22 +01:00
Leendert de Borst
40b7ecd2fe Refactor tests (#541) 2025-02-01 12:20:16 +01:00
Leendert de Borst
f6c66a9964 Separate build and lint for better insight in status (#541) 2025-02-01 12:10:22 +01:00
Leendert de Borst
698d96780a Add github workflow for testing browser extensions (#541) 2025-02-01 12:07:42 +01:00
Leendert de Borst
b250bc0795 Add identity generator implementations and dicts (#541) 2025-02-01 12:07:14 +01:00
Leendert de Borst
b229740315 Port .NET identity generation to Typescript (#541) 2025-02-01 11:51:34 +01:00
Leendert de Borst
a1ecc49065 Show aliasvault icon inline with form autofill (#541) 2025-02-01 11:09:09 +01:00
Leendert de Borst
bc96d30bf4 Add email details page (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
48b6acb174 Add popout button to credential details page (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
d6651001fc Add all fields to credential detail page (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
4c9376612e Add copy to clipboard for credential details (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
c89f0e6fae Fix client open in new tab URL (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
d3caa2d0a9 Add reload button to credential and email pages (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
c05a47587b Add email to credential details (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
10651d1d0f Refactor WIP to use react router (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
4e7aee0634 Update EmailsList.tsx (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
1065c687bc Implement email decryption (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
0a39857d12 Add email retrieval logic (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
72a3975a58 Add bottom navigation bar (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
06d35aac0f Add contentscript autofill filter (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
ebc671f32f Add open client button and url setting (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
ea7cb5e323 Add inline unlock page mode with confirm message (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
b1ab983333 Open popup from locked vault notice (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
57cbedf701 Add notice when vault is locked (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
6298cff1a3 Make content script use the width of the input field (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
a975c4d2c5 Revoke token on logout (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
7c3f360a34 Close autofill on mouseclick outside (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
2a76fbc5a3 Add vault reload button (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
0f58424c73 Add user and settings menu button (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
aa1df77400 Refactor (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
acd26ee67b Add generic loading spinner context (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
11cacf9c0b Add loading animation when opening popup (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
351548df7c Update todos (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
322b5da793 Add common credentials query (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
d6c1f38ce4 Replace base64encode with buffer (#541) 2025-02-01 11:09:08 +01:00
Leendert de Borst
f8194708a0 Add E2E test in .NET that tests the chrome extension (#541)
Remove github action as headless = true is not supported for chrome extensions (#541)

Remove default watch from vite.config.js (#541)

Add GitHub action for extension tests (#541)
2025-02-01 11:09:08 +01:00
Leendert de Borst
c1ec6cb95d Update WebApiService.ts (#541) 2025-02-01 11:08:58 +01:00
Leendert de Borst
59627ebe32 Remove console.log (#541) 2025-02-01 11:08:58 +01:00
Leendert de Borst
e5641108ea Add more eslint checks and refactoring (#541) 2025-02-01 11:08:58 +01:00
Leendert de Borst
636e996a17 Fix all eslint issues (#541) 2025-02-01 11:08:58 +01:00
Leendert de Borst
bfbde5cdf4 Add eslint (#541) 2025-02-01 11:08:58 +01:00
Leendert de Borst
c9aa79abaf Refactor (#541) 2025-02-01 11:08:58 +01:00
Leendert de Borst
cd8ad64a6d Fix update refresh token (#541) 2025-02-01 11:08:58 +01:00
Leendert de Borst
00e37c2b25 Only show settings when logged out (#541) 2025-02-01 11:08:58 +01:00
Leendert de Borst
3263a77f97 Rename popup to index (#541) 2025-02-01 11:08:58 +01:00
Leendert de Borst
67bb96e245 Refactor project structure (#541) 2025-02-01 11:08:58 +01:00
Leendert de Borst
eeff14597e Move credential list to separate component (#541) 2025-02-01 11:08:58 +01:00
Leendert de Borst
86a65d7344 Add settings page to configure API (#541) 2025-02-01 11:08:58 +01:00
Leendert de Borst
4f48005a49 Add WebApiService to handle generic access and refresh token logic (#541) 2025-02-01 11:08:58 +01:00
Leendert de Borst
f6d7ce4356 Fix image loading in contentscript, fix password fill (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
4c5517ae94 Add contentscript for autofill popup (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
51fb01aaf9 Add chrome background service worker and vault persist (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
7ea60a1fa6 Add vault unlock flow and credential print (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
31409d6e5b Add global auth context (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
483792ebb0 Add sqlite client (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
699b09c6c0 Add crypto methods (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
6bd2ec4a44 Refactor structure (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
6c0a0b463f Make full flow work when running in Chrome extension context (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
4e869bf2b0 Make argon2id and srp flow work in browser dev (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
3abc245751 Refactor (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
b156f72783 Fix Argon2id key derivation (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
6e8ff0104f Add basic argon2id flow (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
f2f8fbbfb6 Add argon2id and SRP modules (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
33d0b24260 Add sample button component (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
cb66bcd665 Add tailwind boilerplate (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
5a1db38eed Add react and vite boilerplate (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
0a565c67dd Add boilerplate chrome extension hello world (#541) 2025-02-01 11:08:57 +01:00
Leendert de Borst
b047ce3019 Bump upload-artifact to v4 (#569) 2025-01-31 17:32:35 +01:00
Leendert de Borst
acfed81e10 Update roadmap 2025-01-24 11:12:47 +01:00
Leendert de Borst
581d1dac5a Merge pull request #558 from lanedirt/557-prepare-0111-release
Bump version to 0.11.1
2025-01-22 12:18:20 +01:00
Leendert de Borst
50b3872ae0 Bump version to 0.11.1 (#557) 2025-01-22 12:17:29 +01:00
Leendert de Borst
2ea2526858 Merge pull request #554 from lanedirt/553-bug-menu-dropdown-does-not-align-correctly-on-very-wide-screens
Update mobile menu position in client and admin
2025-01-22 12:13:28 +01:00
Leendert de Borst
2d9b6f38b0 Merge pull request #556 from lanedirt/555-use-relative-url-to-access-api-instead-of-requiring-hostname-in-env
Simplify installation by using relative url for API instead of requiring hostname in env file
2025-01-22 12:13:11 +01:00
Leendert de Borst
a941ffa837 Update install.sh (#555) 2025-01-22 12:06:15 +01:00
Leendert de Borst
e2da05ac2c Update manual setup docs (#555) 2025-01-22 11:26:03 +01:00
Leendert de Borst
dd8108c974 Update install to only require hostname for SSL configuration (#555) 2025-01-22 11:19:09 +01:00
Leendert de Borst
206f8fc2b1 Remove explicit API URL for Docker environments (#555) 2025-01-22 11:01:54 +01:00
Leendert de Borst
5a432e4ab5 Update client to make API URL optional (#555) 2025-01-22 11:01:27 +01:00
Leendert de Borst
83ba9222bd Update mobile menu position in client and admin (#553) 2025-01-21 11:09:53 +01:00
Leendert de Borst
7e7a8b04ef Update README.md 2025-01-20 18:30:23 +01:00
dependabot[bot]
a28b5012d6 Bump Microsoft.AspNetCore.Components.WebAssembly.DevServer
Bumps [Microsoft.AspNetCore.Components.WebAssembly.DevServer](https://github.com/dotnet/aspnetcore) from 9.0.0 to 9.0.1.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.0...v9.0.1)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Components.WebAssembly.DevServer
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-20 12:14:17 +01:00
dependabot[bot]
85218a8fd1 Bump Microsoft.IdentityModel.JsonWebTokens and Microsoft.IdentityModel.Tokens
Bumps [Microsoft.IdentityModel.JsonWebTokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet) and [Microsoft.IdentityModel.Tokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet). These dependencies needed to be updated together.

Updates `Microsoft.IdentityModel.JsonWebTokens` from 8.3.0 to 8.3.1
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/8.3.1/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.3.0...8.3.1)

Updates `Microsoft.IdentityModel.Tokens` from 8.3.0 to 8.3.1
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/8.3.1/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.3.0...8.3.1)

---
updated-dependencies:
- dependency-name: Microsoft.IdentityModel.JsonWebTokens
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.IdentityModel.Tokens
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-20 12:14:09 +01:00
dependabot[bot]
590454b69e Bump Microsoft.AspNetCore.Mvc.Testing from 9.0.0 to 9.0.1
Bumps [Microsoft.AspNetCore.Mvc.Testing](https://github.com/dotnet/aspnetcore) from 9.0.0 to 9.0.1.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.0...v9.0.1)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Mvc.Testing
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-20 11:49:43 +01:00
dependabot[bot]
d81d48ee16 Bump Microsoft.Extensions.Configuration and Microsoft.Extensions.Configuration.FileExtensions
Bumps [Microsoft.Extensions.Configuration](https://github.com/dotnet/runtime) and [Microsoft.Extensions.Configuration.FileExtensions](https://github.com/dotnet/runtime). These dependencies needed to be updated together.

Updates `Microsoft.Extensions.Configuration` from 9.0.0 to 9.0.1
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/compare/v9.0.0...v9.0.1)

Updates `Microsoft.Extensions.Configuration.FileExtensions` from 9.0.0 to 9.0.1
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/compare/v9.0.0...v9.0.1)

---
updated-dependencies:
- dependency-name: Microsoft.Extensions.Configuration
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.Extensions.Configuration.FileExtensions
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-20 11:40:02 +01:00
dependabot[bot]
b72217eb04 Bump coverlet.collector from 6.0.3 to 6.0.4
Bumps [coverlet.collector](https://github.com/coverlet-coverage/coverlet) from 6.0.3 to 6.0.4.
- [Release notes](https://github.com/coverlet-coverage/coverlet/releases)
- [Commits](https://github.com/coverlet-coverage/coverlet/compare/v6.0.3...v6.0.4)

---
updated-dependencies:
- dependency-name: coverlet.collector
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-20 11:39:53 +01:00
dependabot[bot]
8942795e76 Bump Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Bumps [Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore](https://github.com/dotnet/aspnetcore) from 9.0.0 to 9.0.1.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.0...v9.0.1)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-20 11:39:46 +01:00
dependabot[bot]
08290e1fa5 Bump Microsoft.AspNetCore.Authorization and Microsoft.AspNetCore.Components.WebAssembly.Authentication
Bumps [Microsoft.AspNetCore.Authorization](https://github.com/dotnet/aspnetcore) and [Microsoft.AspNetCore.Components.WebAssembly.Authentication](https://github.com/dotnet/aspnetcore). These dependencies needed to be updated together.

Updates `Microsoft.AspNetCore.Authorization` from 9.0.0 to 9.0.1
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.0...v9.0.1)

Updates `Microsoft.AspNetCore.Components.WebAssembly.Authentication` from 9.0.0 to 9.0.1
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.0...v9.0.1)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Authorization
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.AspNetCore.Components.WebAssembly.Authentication
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-20 11:39:38 +01:00
dependabot[bot]
7b45b44735 Bump Microsoft.AspNetCore.DataProtection from 9.0.0 to 9.0.1
Bumps [Microsoft.AspNetCore.DataProtection](https://github.com/dotnet/aspnetcore) from 9.0.0 to 9.0.1.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.0...v9.0.1)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.DataProtection
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-20 11:39:30 +01:00
dependabot[bot]
ae6913a8e0 Bump Microsoft.AspNetCore.Authentication.JwtBearer, Microsoft.IdentityModel.JsonWebTokens and Microsoft.IdentityModel.Tokens
Bumps [Microsoft.AspNetCore.Authentication.JwtBearer](https://github.com/dotnet/aspnetcore), [Microsoft.IdentityModel.JsonWebTokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet) and [Microsoft.IdentityModel.Tokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet). These dependencies needed to be updated together.

Updates `Microsoft.AspNetCore.Authentication.JwtBearer` from 9.0.0 to 9.0.1
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v9.0.0...v9.0.1)

Updates `Microsoft.IdentityModel.JsonWebTokens` from 8.3.0 to 8.0.1
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.3.0...8.0.1)

Updates `Microsoft.IdentityModel.Tokens` from 8.3.0 to 8.0.1
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.3.0...8.0.1)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Authentication.JwtBearer
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.IdentityModel.JsonWebTokens
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: Microsoft.IdentityModel.Tokens
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-20 11:39:24 +01:00
Leendert de Borst
7470ac9e16 Update README.md tech stack 2025-01-16 13:45:54 +01:00
Leendert de Borst
521d10da19 Update roadmap 2025-01-15 18:40:15 +01:00
Leendert de Borst
98aee7bb35 Delete .github/ISSUE_TEMPLATE/security_issue.md 2025-01-15 18:28:53 +01:00
Leendert de Borst
d62f2c4450 Merge pull request #540 from lanedirt/539-add-github-issue-templates
Add GitHub issue templates
2025-01-15 17:27:50 +00:00
Leendert de Borst
95edcc3042 Add GitHub issue templates (#539) 2025-01-15 18:27:14 +01:00
Leendert de Borst
1bce686121 Create CODE_OF_CONDUCT.md 2025-01-15 18:19:18 +01:00
Leendert de Borst
742417d405 Update README.md 2025-01-15 18:00:22 +01:00
Leendert de Borst
2cfc8d528d Merge pull request #538 from lanedirt/537-prepare-0110-release
Bump version to 0.11.0
2025-01-14 13:51:15 +00:00
Leendert de Borst
7a4e1721c8 Bump version to 0.11.0 (#537) 2025-01-14 14:42:56 +01:00
Leendert de Borst
11d79c4874 Merge pull request #536 from lanedirt/535-make-application-warning-logs-more-readable
Make duplicate email warning log more readable
2025-01-14 13:32:16 +00:00
Leendert de Borst
7cd35b0a92 Make duplicate email warning log more readable (#535) 2025-01-14 12:30:36 +01:00
Leendert de Borst
d0f62a26c0 Merge pull request #534 from lanedirt/530-update-sonarcloud-github-action-to-work-with-pr-from-forks
Update sonarcloud-code-analysis so it works for main and PRs (#530)
2025-01-14 11:20:41 +00:00
Leendert de Borst
01198502a3 Update sonarcloud-code-analysis so it works for main and PRs (#530) 2025-01-14 12:20:14 +01:00
Leendert de Borst
229ad109a7 Merge pull request #533 from lanedirt/530-update-sonarcloud-github-action-to-work-with-pr-from-forks
Add pullrequest key to sonarcloud analysis
2025-01-14 10:49:48 +00:00
Leendert de Borst
837b16d971 Add pullrequest key to sonarcloud analysis (#530) 2025-01-14 11:49:04 +01:00
Leendert de Borst
4010d1b93f Merge pull request #531 from lanedirt/530-update-sonarcloud-github-action-to-work-with-pr-from-forks
Update sonarcloud-code-analysis.yml to work with PR's from forks
2025-01-14 10:28:48 +00:00
Leendert de Borst
f7ce60ae68 Update sonarcloud-code-analysis.yml to work with PR's from forks (#530) 2025-01-14 11:26:37 +01:00
Leendert de Borst
5e61bd5db2 Merge pull request #527 from lanedirt/525-prevent-email-address-collision-from-occuring
Prevent email address collision from occurring during identity generation
2025-01-13 14:09:54 +00:00
dependabot[bot]
a2e8a438de Bump NUnit.Analyzers from 4.5.0 to 4.6.0
Bumps [NUnit.Analyzers](https://github.com/nunit/nunit.analyzers) from 4.5.0 to 4.6.0.
- [Release notes](https://github.com/nunit/nunit.analyzers/releases)
- [Changelog](https://github.com/nunit/nunit.analyzers/blob/master/CHANGES.md)
- [Commits](https://github.com/nunit/nunit.analyzers/compare/4.5.0...4.6.0)

---
updated-dependencies:
- dependency-name: NUnit.Analyzers
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-13 14:09:38 +00:00
Leendert de Borst
92904dcf55 Refactor email prefix exists check (#525) 2025-01-12 15:29:15 +00:00
Leendert de Borst
e4f2ca630b Add server side email prefix generation method (#525) 2025-01-12 14:01:48 +00:00
Leendert de Borst
ed80ad24c1 Add more names to identity generator dictionary to prevent collisions (#525) 2025-01-12 13:02:22 +00:00
Leendert de Borst
0c368ab84b Merge pull request #524 from lanedirt/151-make-email-attachments-visible-in-ui-and-allow-for-downloading-attachments-through-client
Add email attachment support
2025-01-11 16:15:49 +00:00
Leendert de Borst
dee2044ed6 Refactor (#151) 2025-01-11 16:05:32 +00:00
dependabot[bot]
f6f6072b3f Bump coverlet.msbuild from 6.0.2 to 6.0.3
Bumps [coverlet.msbuild](https://github.com/coverlet-coverage/coverlet) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/coverlet-coverage/coverlet/releases)
- [Commits](https://github.com/coverlet-coverage/coverlet/compare/v6.0.2...v6.0.3)

---
updated-dependencies:
- dependency-name: coverlet.msbuild
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-11 15:57:26 +00:00
dependabot[bot]
4bfe72d750 Bump coverlet.collector from 6.0.2 to 6.0.3
Bumps [coverlet.collector](https://github.com/coverlet-coverage/coverlet) from 6.0.2 to 6.0.3.
- [Release notes](https://github.com/coverlet-coverage/coverlet/releases)
- [Commits](https://github.com/coverlet-coverage/coverlet/compare/v6.0.2...v6.0.3)

---
updated-dependencies:
- dependency-name: coverlet.collector
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-01-11 15:56:56 +00:00
Leendert de Borst
330f59dc10 Add email decryption test with and without attachments (#151) 2025-01-11 15:45:54 +00:00
Leendert de Borst
a20d981427 Add full attachment download flow to email decryption test (#151) 2025-01-11 13:10:26 +00:00
Leendert de Borst
bd2274db75 Add support for download attachments from SpamOK (#151) 2025-01-11 12:58:40 +00:00
Leendert de Borst
6cfa6f4ef5 Add email attachment retrieval and decryption to client (#151) 2025-01-11 12:49:35 +00:00
Leendert de Borst
8a40d2b1b9 Add attachment encryption assert to test (#151) 2025-01-10 21:35:22 +00:00
Leendert de Borst
237958ba0f Show attachment metadata in email modal popup (#151) 2025-01-10 19:13:18 +00:00
Leendert de Borst
79db3a54c7 Tweak client z-index to show emailmodal on top (#151) 2025-01-10 19:12:45 +00:00
Leendert de Borst
2029745f8b Fix tablet view for credential view page width (#151) 2025-01-10 18:54:51 +00:00
Leendert de Borst
ea4d498502 Update sendEmailCLI.sh to support sending attachments (#151) 2025-01-10 15:05:17 +00:00
Leendert de Borst
05838f5dca Add attachment indicator E2E test on email page (#151) 2025-01-10 14:55:45 +00:00
Leendert de Borst
79872163e2 Add attachment indicator to email page (#151) 2025-01-10 14:55:27 +00:00
Leendert de Borst
35d0f77dd6 Add HasAttachments to mailbox api model (#151) 2025-01-10 14:29:17 +00:00
Leendert de Borst
6660cd20bd Update docker-compose-pull.yml (#522) 2025-01-08 14:28:34 +00:00
Ikko Eltociear Ashimine
e236ba454f chore: update UserEmailClaim.cs (#521)
adress -> address
2025-01-08 14:13:14 +00:00
Leendert de Borst
6ec66e4d64 Merge pull request #517 from lanedirt/516-optimize-local-build-for-arm-devices
Add support for arm64 to docker images and install.sh local build
2025-01-04 09:37:00 +01:00
Leendert de Borst
14898c0c83 Refactor Dockerfile for readability (#516) 2025-01-04 09:24:05 +01:00
Leendert de Borst
d08bec9df7 Bump version to 0.10.3 (#516) 2025-01-04 01:31:07 +01:00
Leendert de Borst
9107dfa789 Update Docker images to also build for linux/arm64 (#516) 2025-01-04 01:04:57 +01:00
Leendert de Borst
351f6f4d16 Update install.sh (#516) 2025-01-03 23:55:51 +01:00
Leendert de Borst
aca607e579 Merge pull request #515 from lanedirt/514-prepare-0102-release
Bump version to 0.10.2
2025-01-03 22:30:47 +01:00
Leendert de Borst
ed053422ba Update StatusHostedService.cs (#512) 2025-01-03 22:15:27 +01:00
Leendert de Borst
955b8638ce Bump version (#514) 2025-01-03 21:50:14 +01:00
Leendert de Borst
1d8883cc94 Merge pull request #513 from lanedirt/512-task-runner-cleanup-jobs-do-not-run
Maintenance tasks do not run after migration to PostgreSQL
2025-01-03 21:45:04 +01:00
Leendert de Borst
48281f92e6 Refactor to reduce complexity (#512) 2025-01-03 21:29:42 +01:00
Leendert de Borst
f19db2c010 Refactor StatusWorker to prevent race conditions and improve stability (#512) 2025-01-03 20:38:13 +01:00
Leendert de Borst
f0d397c8af Add cancellation token check to worker start and stop wait (#512) 2025-01-03 16:18:37 +01:00
Leendert de Borst
fafa51d787 Update integration tests (#512) 2025-01-03 16:08:09 +01:00
Leendert de Borst
202151e4f1 Update SmtpServer TestHostBuilder to be compatible with integration and E2E tests (#512) 2025-01-03 15:36:09 +01:00
Leendert de Borst
c123edccd4 Refactor integration test TestHostBuilder setup to shared abstract class (#512) 2025-01-03 15:22:47 +01:00
Leendert de Borst
50cab3a2f3 Show full error when maintenance task fails to start (#512) 2025-01-03 12:44:55 +01:00
Leendert de Borst
0184e32e6d Update migration to reset task runner job sequence (#512) 2025-01-03 12:44:40 +01:00
Leendert de Borst
d73d4e90e0 Make admin password for dev always override existing password (#512) 2025-01-03 11:58:33 +01:00
Leendert de Borst
06d38842f5 Add dev database import/export support (#512) 2025-01-03 11:56:55 +01:00
Leendert de Borst
b0748316ff Merge pull request #511 from lanedirt/510-admin-password-hash-method-in-installcli-does-not-pass-required-arguments
Admin password hash method in installcli does not pass required arguments
2025-01-01 16:18:36 +01:00
Leendert de Borst
8f8b4af3c9 Update install.sh (#510) 2025-01-01 16:18:15 +01:00
Leendert de Borst
11bf183cbb Update install.sh (#510) 2025-01-01 16:17:41 +01:00
Leendert de Borst
ac64dba715 Merge pull request #509 from lanedirt/508-prepare-0100-release
Prepare 0.10.0 release
2025-01-01 15:43:28 +01:00
Leendert de Borst
d2f9b225d0 Start services again after db migration (#508) 2025-01-01 15:01:13 +01:00
Leendert de Borst
d7f1df3252 Update AppInfo bump version (#508) 2025-01-01 14:56:28 +01:00
Leendert de Borst
fdce8bddd1 Bump install.sh version (#508) 2025-01-01 14:56:15 +01:00
Leendert de Borst
be4a105709 Update docs (#508) 2025-01-01 14:56:02 +01:00
Leendert de Borst
dfa2f84570 Merge pull request #507 from lanedirt/506-add-postgresql-database-import-and-export-commands-to-installsh
Add postgresql database import and export commands to install.sh
2024-12-31 21:40:49 +01:00
Leendert de Borst
450ca6a6f4 Update db-import command (#506) 2024-12-31 21:34:23 +01:00
Leendert de Borst
4c31912d73 Add db import and export commands to install.sh (#506) 2024-12-31 21:18:44 +01:00
dependabot[bot]
367be5a409 Bump NUnit from 4.3.1 to 4.3.2
Bumps [NUnit](https://github.com/nunit/nunit) from 4.3.1 to 4.3.2.
- [Release notes](https://github.com/nunit/nunit/releases)
- [Changelog](https://github.com/nunit/nunit/blob/main/CHANGES.md)
- [Commits](https://github.com/nunit/nunit/compare/4.3.1...4.3.2)

---
updated-dependencies:
- dependency-name: NUnit
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-31 17:57:22 +01:00
dependabot[bot]
b6cf46ab91 Bump HtmlAgilityPack from 1.11.71 to 1.11.72
Bumps [HtmlAgilityPack](https://github.com/zzzprojects/html-agility-pack) from 1.11.71 to 1.11.72.
- [Release notes](https://github.com/zzzprojects/html-agility-pack/releases)
- [Commits](https://github.com/zzzprojects/html-agility-pack/compare/v1.11.71...v1.11.72)

---
updated-dependencies:
- dependency-name: HtmlAgilityPack
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-31 17:57:14 +01:00
Leendert de Borst
0da0bd0b17 Merge pull request #505 from lanedirt/503-searching-in-admin-table-pages-defocuses-search-field-after-every-character-typed
Do not show loading indicator when refreshing in admin
2024-12-31 17:56:01 +01:00
Leendert de Borst
d8ccaad806 Merge pull request #504 from lanedirt/493-fix-dataprotection-api-errors-when-running-a-clean-docker-install
Do not log dataprotection warnings to database log
2024-12-31 17:50:07 +01:00
Leendert de Borst
656210e4f6 Do not show loading indicator when refreshing in admin (#503) 2024-12-31 17:48:29 +01:00
Leendert de Borst
c3c85bc10e Do not log dataprotection warnings to database log but keep for filelog (#493) 2024-12-31 17:37:17 +01:00
Leendert de Borst
693ad0b581 Update CONTRIBUTING.md 2024-12-31 15:29:32 +01:00
Leendert de Borst
94ad51059e Merge pull request #500 from lanedirt/491-link-from-contributindmd-to-the-official-docs-page
Update contributing documentation
2024-12-30 11:51:12 +01:00
Leendert de Borst
9374780a5b Update CONTRIBUTING.md (#491) 2024-12-29 12:30:34 +01:00
Leendert de Borst
3263360be5 Merge pull request #492 from lanedirt/190-add-postgresql-as-database-option-to-prevent-concurrency-locking-due-to-sqlite-limitations
Switch SQLite to PostgreSQL database engine
2024-12-29 12:15:32 +01:00
Leendert de Borst
1151089d59 Fix merge conflict (#190) 2024-12-28 17:06:50 +01:00
Leendert de Borst
d39ecf69e8 Merge pull request #499 from lanedirt/498-make-user-refreshtoken-lifetime-configurable-via-server-settings
Make UserRefreshToken lifetime configurable via admin
2024-12-28 16:58:29 +01:00
Leendert de Borst
9caea03460 Update AuthTests.cs (#498) 2024-12-28 16:45:06 +01:00
Leendert de Borst
32879e09a8 Make UserRefreshToken lifetime configurable via admin (#498) 2024-12-28 16:35:21 +01:00
Leendert de Borst
d3518eca6c Update install.sh add install.sh version check to install command itself (#190) 2024-12-28 15:52:33 +01:00
Leendert de Borst
329ae185ad Update docs (#190) 2024-12-28 14:28:09 +01:00
dependabot[bot]
888054e8ed Bump NUnit.Analyzers from 4.4.0 to 4.5.0
Bumps [NUnit.Analyzers](https://github.com/nunit/nunit.analyzers) from 4.4.0 to 4.5.0.
- [Release notes](https://github.com/nunit/nunit.analyzers/releases)
- [Changelog](https://github.com/nunit/nunit.analyzers/blob/master/CHANGES.md)
- [Commits](https://github.com/nunit/nunit.analyzers/compare/4.4.0...4.5.0)

---
updated-dependencies:
- dependency-name: NUnit.Analyzers
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-27 17:46:07 +01:00
dependabot[bot]
0d141e2c7c Bump NUnit from 4.3.0 to 4.3.1
Bumps [NUnit](https://github.com/nunit/nunit) from 4.3.0 to 4.3.1.
- [Release notes](https://github.com/nunit/nunit/releases)
- [Changelog](https://github.com/nunit/nunit/blob/main/CHANGES.md)
- [Commits](https://github.com/nunit/nunit/compare/4.3.0...4.3.1)

---
updated-dependencies:
- dependency-name: NUnit
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-27 17:29:08 +01:00
Leendert de Borst
33b930b58a Merge pull request #497 from lanedirt/495-improve-2fa-login-flow-to-automatically-submit-when-6-digits-have-been-entered
Auto submit login form when 2fa code is entered
2024-12-27 17:26:39 +01:00
Leendert de Borst
ad9eb79e9e Update CodeLockoutTests.cs (#495) 2024-12-27 16:56:20 +01:00
Leendert de Borst
cd46578576 Auto submit login form when 2fa code is entered (#495) 2024-12-27 10:43:04 +01:00
Leendert de Borst
e577d6fee4 Print warnring but do not exit on image pull fail (#190) 2024-12-26 01:30:32 +01:00
Leendert de Borst
9d1923d3ea Refactor dev db start (#190) 2024-12-26 01:26:43 +01:00
Leendert de Borst
d77c28184c Refactor (#190) 2024-12-26 01:13:40 +01:00
Leendert de Borst
180de219c8 Update installer to look at latest release instead of main (#190) 2024-12-26 00:41:58 +01:00
Leendert de Borst
17e4f614d8 Refactor postgres docker setup and update docs (#190) 2024-12-26 00:39:19 +01:00
Leendert de Borst
747e0910cb Update SQLite ef model (#190) 2024-12-25 23:10:24 +01:00
Leendert de Borst
fc85f34218 Update useremailclaims setnull to be compatible with PostgreSQL (#190) 2024-12-25 23:01:54 +01:00
Leendert de Borst
f0e0e9c03e Add TaskRunnerJobs to migration (#190) 2024-12-25 22:55:10 +01:00
Leendert de Borst
2631a1f0b1 Update migration (#190) 2024-12-25 22:47:44 +01:00
Leendert de Borst
254104e12d Update migration logging (#190) 2024-12-25 22:46:08 +01:00
Leendert de Borst
a75d5c7a34 Update migration add data truncation if source data exceeds length (#190) 2024-12-25 22:41:56 +01:00
Leendert de Borst
bf40539e92 Update dockerignore to ignore data directories during build (#190) 2024-12-25 22:41:40 +01:00
Leendert de Borst
cb330219ab Refactor postgres db folder creation (#190) 2024-12-25 22:26:58 +01:00
Leendert de Borst
4f5e822722 Include postgres empty dir in git to ensure correct permissions (#190) 2024-12-25 22:23:43 +01:00
Leendert de Borst
96997c7d8d Update docs (#190) 2024-12-25 22:21:19 +01:00
Leendert de Borst
f959b7dc91 Update install.sh (#190) 2024-12-25 22:21:13 +01:00
Leendert de Borst
59599f43a3 Update docs (#190) 2024-12-25 16:53:30 +01:00
Leendert de Borst
b5e575051c Update migration logic to reset auto increment id (#190) 2024-12-25 16:45:17 +01:00
Leendert de Borst
433664d85d Fix admin redirect absolute URL bug (#190) 2024-12-25 14:40:44 +01:00
Leendert de Borst
82b2b75127 Update docs with new update instructions (#190) 2024-12-25 14:24:31 +01:00
Leendert de Borst
577e02d761 Update install script (#190) 2024-12-25 14:24:16 +01:00
Leendert de Borst
26b1c4e044 Load security page components async (#190) 2024-12-25 12:11:17 +01:00
Leendert de Borst
3872678039 Sanitize email when retrieving emails for emailbox (#190) 2024-12-24 22:20:44 +01:00
Leendert de Borst
80cc72eb22 Fix RecentEmails.razor dispose bug (#190) 2024-12-24 22:20:12 +01:00
Leendert de Borst
141a291ace Fix bug in db sync tests (#190) 2024-12-24 20:49:38 +01:00
Leendert de Borst
3b5e944417 Refactor (#190) 2024-12-24 15:48:34 +01:00
Leendert de Borst
65553e0918 Update postgresql date column types to improve compatiblity (#190) 2024-12-24 15:27:04 +01:00
Leendert de Borst
a7502d42e4 Fix migration tool params called from install.sh (#190) 2024-12-24 14:56:37 +01:00
Leendert de Borst
4d43acb53f Add build container start/stop/restart commands (#190) 2024-12-24 13:50:49 +01:00
Leendert de Borst
14ac94b78a Add migrate-db command to install.sh (#190) 2024-12-24 13:08:48 +01:00
Leendert de Borst
361f4b8817 Added migration logic from sqlite to postgresql (#190) 2024-12-24 12:53:22 +01:00
Leendert de Borst
7a62ddcf6a Enable postgresql legacy timestamp behavior (#190) 2024-12-24 12:39:57 +01:00
Leendert de Borst
6b59200df2 Fix migrations (#190) 2024-12-24 11:59:37 +01:00
Leendert de Borst
6a0699318c Add sqlite migrations to be in sync with postgresql model (#190) 2024-12-23 21:41:25 +01:00
Leendert de Borst
f6e2648a53 Update GitHub actions for postgresql (#190) 2024-12-23 20:52:39 +01:00
Leendert de Borst
4b8e4c907e Refactor WebApplicationFactoryFixture (#190) 2024-12-23 20:10:47 +01:00
Leendert de Borst
30804cc973 Update DataProtectionExtensions.cs (#190) 2024-12-23 18:00:47 +01:00
Leendert de Borst
8edfc3d0d6 Update Logout.razor (#190) 2024-12-23 17:11:30 +01:00
Leendert de Borst
4fb5087c82 Add local postgresql dev database (#190) 2024-12-23 16:31:02 +01:00
Leendert de Borst
cf454d2bb8 Add postgres healthcheck to docker-compose.yml (#190) 2024-12-23 16:03:59 +01:00
Leendert de Borst
0a577873ee Update install.sh to create postgres credentials (#190) 2024-12-23 15:40:00 +01:00
Leendert de Borst
32c8e48d45 Update Dockerfile (#190) 2024-12-23 15:25:18 +01:00
Leendert de Borst
564ae54de8 Update postgresql factory to support env vars if available (#190) 2024-12-23 15:11:34 +01:00
Leendert de Borst
d9f4f8d121 Update Dockerfile (#190) 2024-12-23 14:38:07 +01:00
Leendert de Borst
728b20b489 Update install.sh (#190) 2024-12-23 14:18:47 +01:00
Leendert de Borst
219f0bc9cc Update db configuration (#190) 2024-12-23 14:17:17 +01:00
Leendert de Borst
9735df0436 Update install.sh to generate postgresql credentials (#190) 2024-12-23 13:57:01 +01:00
Leendert de Borst
78a872a67d Refactor smtpserver and taskrunner so all tests pass (#190) 2024-12-23 12:58:07 +01:00
Leendert de Borst
77a48ea4e9 Refactor admin so all tests pass (#190) 2024-12-23 12:16:05 +01:00
Leendert de Borst
22538ae000 Refactor datetime to always use UTC (#190) 2024-12-22 21:36:01 +01:00
Leendert de Borst
db632c3edb Refactor SmtpService to use new dbcontextfactory (#190) 2024-12-22 20:05:05 +01:00
Leendert de Borst
1c53addcaa Refactor WebApi to use new dbcontextfactory (#190) 2024-12-22 18:58:24 +01:00
Leendert de Borst
817404cd08 Refactor UserService delete unused methods causing concurrency issues (#190) 2024-12-22 14:10:30 +01:00
Leendert de Borst
9062cdc701 Refactor admin project to use dbcontextfactory (#190) 2024-12-22 11:53:22 +01:00
Leendert de Borst
e45866fa67 Update EF models to not use driver specific fields (#190) 2024-12-22 11:26:16 +01:00
Leendert de Borst
8fbd10caaa Update admin project to use new IAliasServerDbContextFactory (#190) 2024-12-22 00:37:13 +01:00
Leendert de Borst
54d54f28b4 Move migrations for db engines to their respective folders (#190) 2024-12-22 00:07:31 +01:00
Leendert de Borst
3116aa5a1f Update postgresql.conf (#190) 2024-12-21 12:17:17 +01:00
Leendert de Borst
eb45358532 Update gitignore for db files (#190) 2024-12-21 12:09:43 +01:00
Leendert de Borst
03fd047cb4 Add postgresql docker container scaffolding (#190) 2024-12-21 11:56:08 +01:00
Leendert de Borst
6a7fc9c5ba Merge pull request #488 from lanedirt/343-add-option-to-disable-new-user-registration-via-installsh
Update install.sh
2024-12-20 20:23:06 +01:00
Leendert de Borst
62700de9ad Update install.sh (#343) 2024-12-20 20:22:43 +01:00
Leendert de Borst
edeaa77299 Merge pull request #487 from lanedirt/342-add-option-to-block-existing-user-in-admin
Add option to block existing user in admin
2024-12-20 19:57:39 +01:00
Leendert de Borst
84b93924f5 Add user block checks to api and add tests (#342) 2024-12-20 19:47:12 +01:00
Leendert de Borst
400e702753 Add user blocked status toggle to admin (#342) 2024-12-20 18:53:28 +01:00
Leendert de Borst
147f8db5d1 Add Blocked column to users table (#342) 2024-12-20 18:53:01 +01:00
Leendert de Borst
8e1470bc1b Merge pull request #486 from lanedirt/343-add-option-to-disable-new-user-registration-via-installsh
Add option to disable new user registration via install.sh
2024-12-20 18:24:50 +01:00
Leendert de Borst
50853bf011 Update tests (#343) 2024-12-20 17:30:28 +01:00
Leendert de Borst
07dd90a705 Add public registration enabled check to client (#343) 2024-12-20 16:52:05 +01:00
Leendert de Borst
a7a7d6d82b Rename public registration enabled flag (#343) 2024-12-20 16:51:51 +01:00
Leendert de Borst
249efe54b0 Add public registration env flag check to api (#343) 2024-12-20 16:06:15 +01:00
Leendert de Borst
20eb3e5ff4 Add public registration setting to install.sh (#343) 2024-12-20 15:56:30 +01:00
Leendert de Borst
ba15c446d9 Merge pull request #484 from lanedirt/483-dark-mode-text-readability-tweaks
Dark mode text readability tweaks
2024-12-19 15:54:55 +01:00
Leendert de Borst
5ea9f4ee08 Merge pull request #482 from lanedirt/481-add-username-sanity-check-on-vault-save-to-prevent-db-corruption-between-user-sessions
Add username sanity check to vault save to prevent potential vault collision/corruption
2024-12-19 15:54:47 +01:00
Leendert de Borst
1e7b7b172a Update tests to work with changed notifications (#481) 2024-12-19 15:39:22 +01:00
Leendert de Borst
35f6565c8b Update DbService.cs to fix merge return status (#481) 2024-12-19 15:16:28 +01:00
Leendert de Borst
8cb99c997d Update Logo.razor (#483) 2024-12-19 15:03:48 +01:00
Leendert de Borst
16cf528b7f Add dark mode tweaks to admin error page (#483) 2024-12-19 14:55:25 +01:00
Leendert de Borst
8ad3eb9bd5 Add dark mode tweaks to client two factor code page (#483) 2024-12-19 14:55:14 +01:00
Leendert de Borst
2d59c40e24 Refactor username sanity check to associate with vault load instead of login (#481) 2024-12-19 14:39:05 +01:00
Leendert de Borst
33283e07be Set username on unlock (#481) 2024-12-19 13:34:14 +01:00
Leendert de Borst
fbf5880370 Add username sanity check to vault save (#481) 2024-12-19 12:14:06 +01:00
Leendert de Borst
be4a74ef3c Update README.md 2024-12-18 10:54:09 +01:00
Leendert de Borst
a759091755 Update AppInfo.cs (#479) 2024-12-16 16:55:58 +01:00
dependabot[bot]
8dc99c09a8 Bump Swashbuckle.AspNetCore from 7.1.0 to 7.2.0
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 7.1.0 to 7.2.0.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v7.1.0...v7.2.0)

---
updated-dependencies:
- dependency-name: Swashbuckle.AspNetCore
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-16 12:19:17 +01:00
dependabot[bot]
b9ec4baf66 Bump NUglify from 1.21.10 to 1.21.11
Bumps [NUglify](https://github.com/trullock/NUglify) from 1.21.10 to 1.21.11.
- [Release notes](https://github.com/trullock/NUglify/releases)
- [Changelog](https://github.com/trullock/NUglify/blob/master/changelog.md)
- [Commits](https://github.com/trullock/NUglify/compare/v1.21.10...v1.21.11)

---
updated-dependencies:
- dependency-name: NUglify
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-16 12:19:10 +01:00
Leendert de Borst
71ed62cdcb Merge pull request #478 from lanedirt/469-webassembly-required-error-not-visible-in-client-app
Add E2E test for browser with WASM disabled
2024-12-16 12:19:00 +01:00
dependabot[bot]
2bbad8c75c Bump NUnit from 4.2.2 to 4.3.0
Bumps [NUnit](https://github.com/nunit/nunit) from 4.2.2 to 4.3.0.
- [Release notes](https://github.com/nunit/nunit/releases)
- [Changelog](https://github.com/nunit/nunit/blob/main/CHANGES.md)
- [Commits](https://github.com/nunit/nunit/compare/4.2.2...4.3.0)

---
updated-dependencies:
- dependency-name: NUnit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-16 11:24:59 +01:00
dependabot[bot]
f02b841eea Bump Serilog and Serilog.Settings.Configuration
Bumps [Serilog](https://github.com/serilog/serilog) and [Serilog.Settings.Configuration](https://github.com/serilog/serilog-settings-configuration). These dependencies needed to be updated together.

Updates `Serilog` from 4.2.0 to 4.2.0
- [Release notes](https://github.com/serilog/serilog/releases)
- [Commits](https://github.com/serilog/serilog/compare/v4.2.0...v4.2.0)

Updates `Serilog.Settings.Configuration` from 8.0.4 to 9.0.0
- [Release notes](https://github.com/serilog/serilog-settings-configuration/releases)
- [Changelog](https://github.com/serilog/serilog-settings-configuration/blob/dev/CHANGES.md)
- [Commits](https://github.com/serilog/serilog-settings-configuration/compare/v8.0.4...v9.0.0)

---
updated-dependencies:
- dependency-name: Serilog
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Serilog.Settings.Configuration
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-16 11:24:36 +01:00
dependabot[bot]
f6fc5af8ac Bump MailKit from 4.8.0 to 4.9.0
Bumps [MailKit](https://github.com/jstedfast/MailKit) from 4.8.0 to 4.9.0.
- [Changelog](https://github.com/jstedfast/MailKit/blob/master/ReleaseNotes.md)
- [Commits](https://github.com/jstedfast/MailKit/compare/4.8.0...4.9.0)

---
updated-dependencies:
- dependency-name: MailKit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-16 11:24:30 +01:00
dependabot[bot]
1d1155bf0e Bump MimeKit from 4.8.0 to 4.9.0
Bumps [MimeKit](https://github.com/jstedfast/MimeKit) from 4.8.0 to 4.9.0.
- [Changelog](https://github.com/jstedfast/MimeKit/blob/master/ReleaseNotes.md)
- [Commits](https://github.com/jstedfast/MimeKit/compare/4.8.0...4.9.0)

---
updated-dependencies:
- dependency-name: MimeKit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-16 11:24:24 +01:00
Leendert de Borst
2632211af6 Merge pull request #470 from lanedirt/469-webassembly-required-error-not-visible-in-client-app
Show error if client does not support WebAssembly
2024-12-16 10:34:20 +01:00
Leendert de Borst
05cca6998e Merge pull request #468 from lanedirt/467-task-runner-jobs-do-not-always-run-at-configured-time
Add task runner job table for tracking task runner historic runs
2024-12-16 10:18:13 +01:00
Leendert de Borst
c4a8a20a62 Add E2E test for browser with WASM disabled (#469) 2024-12-15 17:05:31 +01:00
Leendert de Borst
f2c6af9ccb Update install.sh URL comment (#469) 2024-12-15 16:43:48 +01:00
Leendert de Borst
e94201acda Tweak logo on mobile view auth area (#469) 2024-12-15 16:28:57 +01:00
Leendert de Borst
9e03473208 Show error message when client does not support WebAssembly (#469) 2024-12-15 16:28:41 +01:00
Leendert de Borst
0c5b2fb1da Add task runner job table and manual start button (#467) 2024-12-15 15:59:51 +01:00
Leendert de Borst
a5c4a7618d Update AliasServerDbContext.cs so pragma settings are applied correctly (#467) 2024-12-15 14:53:33 +01:00
Leendert de Borst
70220cecbb Merge pull request #466 from lanedirt/465-prepare-093-release
Update version to 0.9.3
2024-12-13 13:09:33 +01:00
Leendert de Borst
c63faa352f Update version to 0.9.3 (#465) 2024-12-13 13:09:14 +01:00
Leendert de Borst
7e261a05c9 Merge pull request #464 from lanedirt/463-bump-spamokpasswordgenerator-library-to-110
Bump SpamOK.PasswordGenerator version to 1.1.0
2024-12-13 13:01:45 +01:00
Leendert de Borst
545ec5576e Bump SpamOK.PasswordGenerator version to 1.1.0 (#463) 2024-12-13 12:45:05 +01:00
dependabot[bot]
73dcbe5860 Bump the npm_and_yarn group across 2 directories with 1 update
Bumps the npm_and_yarn group with 1 update in the /src/AliasVault.Admin directory: [nanoid](https://github.com/ai/nanoid).
Bumps the npm_and_yarn group with 1 update in the /src/AliasVault.Client directory: [nanoid](https://github.com/ai/nanoid).


Updates `nanoid` from 3.3.7 to 3.3.8
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.7...3.3.8)

Updates `nanoid` from 3.3.7 to 3.3.8
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.7...3.3.8)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: nanoid
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-13 12:15:20 +01:00
Leendert de Borst
13917444b9 Merge pull request #461 from lanedirt/460-password-not-correct
Fix account registration username capitalization login bug
2024-12-13 12:15:08 +01:00
dependabot[bot]
119e13a9dd Bump Serilog from 4.1.0 to 4.2.0
Bumps [Serilog](https://github.com/serilog/serilog) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/serilog/serilog/releases)
- [Commits](https://github.com/serilog/serilog/compare/v4.1.0...v4.2.0)

---
updated-dependencies:
- dependency-name: Serilog
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-13 11:50:58 +01:00
dependabot[bot]
7d656e9a9a Bump Microsoft.IdentityModel.JsonWebTokens and Microsoft.IdentityModel.Tokens
Bumps [Microsoft.IdentityModel.JsonWebTokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet) and [Microsoft.IdentityModel.Tokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet). These dependencies needed to be updated together.

Updates `Microsoft.IdentityModel.JsonWebTokens` from 8.2.1 to 8.3.0
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.2.1...8.3.0)

Updates `Microsoft.IdentityModel.Tokens` from 8.2.1 to 8.3.0
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.2.1...8.3.0)

---
updated-dependencies:
- dependency-name: Microsoft.IdentityModel.JsonWebTokens
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: Microsoft.IdentityModel.Tokens
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-13 11:50:50 +01:00
Leendert de Borst
8bd05b5c2e Fix account registration username capitalization login bug (#460) 2024-12-13 11:50:18 +01:00
Leendert de Borst
1e65f14323 Update README.md 2024-12-11 23:30:41 +01:00
Leendert de Borst
2c7543889d Update README.md 2024-12-11 18:24:10 +01:00
Leendert de Borst
63c5483208 Merge pull request #455 from lanedirt/454-update-default-server-settings
Update default server settings
2024-12-05 10:07:07 +01:00
Leendert de Borst
2586d61651 Merge pull request #457 from lanedirt/456-add-task-runner-to-installsh-pull-list
Update install.sh to include task runner to image pull list
2024-12-05 10:07:00 +01:00
Leendert de Borst
c7a32cf0e9 Update install.sh (#456) 2024-12-04 21:32:13 +01:00
Leendert de Borst
46cc6527aa Update default server settings (#454) 2024-12-04 19:17:56 +01:00
Leendert de Borst
ef291bffc1 Merge pull request #452 from lanedirt/451-task-runner-cannot-access-database
Task runner cannot access database
2024-12-04 18:55:42 +01:00
Leendert de Borst
94f6199e27 Update AppInfo.cs (#451) 2024-12-04 18:55:05 +01:00
Leendert de Borst
5ababf3bf3 Update docker-compose.yml (#451) 2024-12-04 18:54:23 +01:00
Leendert de Borst
b47e735e8f Merge pull request #450 from lanedirt/449-publish-new-task-runner-image-to-ghcrio
Publish task runner docker container image
2024-12-04 18:39:34 +01:00
Leendert de Borst
de17303085 Publish task runner docker container image (#449) 2024-12-04 18:39:15 +01:00
Leendert de Borst
635136d257 Merge pull request #448 from lanedirt/447-prepare-090-release
Update version to 0.9.0
2024-12-04 18:31:13 +01:00
Leendert de Borst
832e340b1b Update version to 0.9.0 (#447) 2024-12-04 18:30:48 +01:00
Leendert de Borst
4e0b6b5adf Merge pull request #444 from lanedirt/221-add-aliasvaulttaskservice-for-running-scheduled-background-tasks-such-as-log-cleanups
Add TaskRunner for running scheduled background tasks such as log cleanups
2024-12-04 18:28:26 +01:00
Leendert de Borst
18be105350 Merge pull request #446 from lanedirt/442-update-docker-composeyml-when-running-installsh-update
Always download latest docker compose files on install or update
2024-12-04 18:28:16 +01:00
Leendert de Borst
9bea01fbf8 Update install.sh to always download latest docker compose files on install (#442) 2024-12-04 18:18:28 +01:00
Leendert de Borst
a33fd08cb4 Add TaskRunner to docker compose stack (#221) 2024-12-04 17:57:46 +01:00
Leendert de Borst
25f5660f81 Refactor (#221) 2024-12-04 17:57:46 +01:00
Leendert de Borst
0923936f7c Add TaskRunner maintenance time tests (#221) 2024-12-04 17:57:46 +01:00
Leendert de Borst
3c0905d0b0 Add integration tests for TaskRunner (#221) 2024-12-04 17:57:46 +01:00
Leendert de Borst
97fd3beeaa Add E2E test for server settings admin page (#221) 2024-12-04 17:57:45 +01:00
Leendert de Borst
3195ad86ce Add email cleanup tasks (#221) 2024-12-04 17:57:45 +01:00
Leendert de Borst
d147639a83 Add task runner implementation (#221) 2024-12-04 17:57:45 +01:00
Leendert de Borst
9e0716d32e Add using to db connections (#221) 2024-12-04 17:57:45 +01:00
Leendert de Borst
3a05b1e5c3 Refactor admin to use shared server project (#221) 2024-12-04 17:57:45 +01:00
Leendert de Borst
9628861186 Add AliasVault.Shared.Server project (#221) 2024-12-04 17:57:45 +01:00
Leendert de Borst
2b541dc28d Make TaskRunner compile (#221) 2024-12-04 17:57:45 +01:00
Leendert de Borst
e655dcedb0 Refactor service control in admin, add TaskRunner (#221) 2024-12-04 17:57:45 +01:00
Leendert de Borst
9b8bbebb44 Add server settings page to admin (#221) 2024-12-04 17:57:45 +01:00
Leendert de Borst
bbc99ebf16 Add AliasVault.TaskRunner boilerplate (#221) 2024-12-04 17:57:45 +01:00
Leendert de Borst
23690f4e9b Merge pull request #445 from lanedirt/441-move-custom-port-config-from-docker-composeyml-to-env
Move custom port settings to .env file
2024-12-04 17:57:04 +01:00
Leendert de Borst
6286034a9d Move custom ports to .env (#441) 2024-12-04 17:56:44 +01:00
Leendert de Borst
2ea684061e Merge pull request #440 from lanedirt/349-add-statistics-to-admin
Add statistics to admin
2024-12-04 10:53:23 +01:00
Leendert de Borst
973abc8917 Update sqlite connection string to include WAL mode directly (#349) 2024-12-04 10:00:49 +01:00
Leendert de Borst
65304b0f84 Refactor admin dashboard into separate components (#349) 2024-12-03 22:56:22 +01:00
Leendert de Borst
ca4dd89e89 Update AdminPlaywrightTest.cs (#349) 2024-12-02 17:10:15 +01:00
Leendert de Borst
fccf10dc82 Tweak UI of admin account settings (#349) 2024-12-02 17:08:09 +01:00
Leendert de Borst
b845245728 Show amount of emails received in user email claim page (#349) 2024-12-02 16:59:21 +01:00
Leendert de Borst
e46357d603 Add statistics to admin home dashboard page (#349) 2024-12-02 16:54:07 +01:00
Leendert de Borst
6568ed8059 Merge pull request #439 from lanedirt/438-prepare-083-release
Prepare 0.8.3 release
2024-12-02 14:43:15 +01:00
Leendert de Borst
236718c76e Update version to 0.8.3 (#438) 2024-12-02 14:42:54 +01:00
Leendert de Borst
17ef816fa3 Update install docs (#438) 2024-12-02 14:42:45 +01:00
Leendert de Borst
db33a0a1da Merge pull request #437 from lanedirt/436-make-miscrelease-articles-show-up-in-docs
Add gitignore for /docs to include misc/release articles
2024-12-02 14:36:39 +01:00
Leendert de Borst
7a97bbf716 Add gitignore for /docs to include misc/release articles (#436) 2024-12-02 14:36:20 +01:00
Leendert de Borst
0c4ab8c1b6 Merge pull request #435 from lanedirt/434-update-installsh-to-pull-correct-docker-image-version
Update install.sh to pull correct docker image version
2024-12-02 14:32:08 +01:00
Leendert de Borst
6ee19d57bf Merge pull request #433 from lanedirt/dependabot/nuget/main/Swashbuckle.AspNetCore-7.1.0
Bump Swashbuckle.AspNetCore from 7.0.0 to 7.1.0
2024-12-02 13:51:51 +01:00
Leendert de Borst
dcb92c8dad Add update-installer command to install.sh for CI/CD (#434) 2024-12-02 13:41:09 +01:00
Leendert de Borst
968d3cfcf1 Update install.sh to write version to docker-compose to ensure we pull and run the right containers (#434) 2024-12-02 13:32:19 +01:00
Leendert de Borst
8e9c12f6e7 Wait 15 seconds for containers to start during test (#434) 2024-12-02 13:30:15 +01:00
dependabot[bot]
3c8f32e67a Bump Swashbuckle.AspNetCore from 7.0.0 to 7.1.0
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 7.0.0 to 7.1.0.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v7.0.0...v7.1.0)

---
updated-dependencies:
- dependency-name: Swashbuckle.AspNetCore
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-12-02 10:52:44 +00:00
Leendert de Borst
86d7ee3e9b Merge pull request #431 from lanedirt/430-prepare-082-hotfix-release
Update version to 0.8.2
2024-11-27 16:31:44 +01:00
Leendert de Borst
a39ed8c0a7 Update version to 0.8.2 (#430) 2024-11-27 16:31:28 +01:00
Leendert de Borst
e772e722b5 Merge pull request #429 from lanedirt/428-update-email-installation-documentation
Update email installation documentation
2024-11-27 13:22:11 +01:00
Leendert de Borst
b6bf431062 Only test favicon extraction for known stable website (#428) 2024-11-27 12:55:28 +01:00
Leendert de Borst
aa41cceff3 Update email installation documentation (#428) 2024-11-27 12:51:25 +01:00
Leendert de Borst
1baea180aa Merge pull request #427 from lanedirt/426-client-logs-out-unexpectedly-when-kept-open-in-background-tab 2024-11-26 20:32:12 +01:00
Leendert de Borst
0d8143c62e Fix refresh token expired check (#426) 2024-11-26 19:08:41 +01:00
Leendert de Borst
4ae84052e8 Refactor RecentEmails.razor (#426) 2024-11-26 19:03:03 +01:00
Leendert de Borst
c73c41ca06 Refactor RecentEmails component to only load emails when app is visible (#426) 2024-11-26 18:33:35 +01:00
Leendert de Borst
5b58418e57 Fix refresh token grace period check (#426) 2024-11-26 18:24:33 +01:00
Leendert de Borst
7c7f7549c5 Merge pull request #423 from lanedirt/422-add-email-server-documentation
Add email server documentation
2024-11-25 23:26:26 +01:00
Leendert de Borst
38203fd767 Merge pull request #425 from lanedirt/424-make-installsh-be-able-to-update-itself
Update install.sh with self-update support
2024-11-25 23:18:42 +01:00
Leendert de Borst
a7b8484a84 Set email server to disabled by default (#422) 2024-11-25 23:18:27 +01:00
Leendert de Borst
a091a94737 Update docker-compose-build.yml for better resilience (#422) 2024-11-25 23:07:43 +01:00
Leendert de Borst
2c299a82b8 Update install.sh with self-update support (#424) 2024-11-25 23:03:13 +01:00
Leendert de Borst
5ee710750e Merge pull request #421 from lanedirt/420-limit-max-username-length
Add max username length restriction of 40 chars
2024-11-25 22:49:58 +01:00
Leendert de Borst
ed5ea31ca8 Add email server docs (#422) 2024-11-25 22:49:38 +01:00
Leendert de Borst
ffdb427184 Add email server setup command (#422) 2024-11-25 22:49:24 +01:00
Leendert de Borst
4cef3efa1f Refactor all tests to use shorter username (#420) 2024-11-25 21:40:15 +01:00
Leendert de Borst
a5c8908c6b Add max username length restriction of 40 chars (#420) 2024-11-25 19:40:27 +01:00
Leendert de Borst
88c10b5a9c Merge pull request #419 from lanedirt/418-improve-docker-compose-build-test-workflow
Update workflow test to show error if HTTP check fails
2024-11-25 15:50:59 +01:00
Leendert de Borst
48d3d26be5 Merge pull request #416 from lanedirt/414-grep-env-no-such-file-or-directory-on-clean-install
Fix bug in install.sh
2024-11-25 15:41:43 +01:00
Leendert de Borst
5caa583240 Update workflow test to show error if HTTP check fails (#418) 2024-11-25 15:41:21 +01:00
Leendert de Borst
79f4749869 Add extra .env exist check to install.sh (#414) 2024-11-25 15:35:42 +01:00
Leendert de Borst
4de42e4a33 Merge pull request #417 from lanedirt/415-update-version-number-to-081
Prepare 0.8.1 version
2024-11-25 15:31:46 +01:00
Leendert de Borst
af9fba39f3 Update AppInfo.cs (#415) 2024-11-25 15:30:59 +01:00
Leendert de Borst
91b27c1bec Update install.sh (#414) 2024-11-25 15:29:22 +01:00
Leendert de Borst
0fb5327f04 Merge pull request #413 from lanedirt/412-add-update-option-to-install-script
Add update option to install script
2024-11-25 14:41:17 +01:00
Leendert de Borst
57f6b0961c Update docs (#412) 2024-11-25 14:40:38 +01:00
Leendert de Borst
c1d70fe504 Add support for installing specific version (#412) 2024-11-25 14:39:04 +01:00
Leendert de Borst
4c379802fc Update docker compose build workflow (#412) 2024-11-25 14:38:45 +01:00
dependabot[bot]
6a9a98b7bf Bump Microsoft.IdentityModel.JsonWebTokens and Microsoft.IdentityModel.Tokens
Bumps [Microsoft.IdentityModel.JsonWebTokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet) and [Microsoft.IdentityModel.Tokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet). These dependencies needed to be updated together.

Updates `Microsoft.IdentityModel.JsonWebTokens` from 8.2.0 to 8.2.1
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.2.0...8.2.1)

Updates `Microsoft.IdentityModel.Tokens` from 8.2.1 to 8.2.1
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.2.1...8.2.1)

---
updated-dependencies:
- dependency-name: Microsoft.IdentityModel.JsonWebTokens
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.IdentityModel.Tokens
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-25 14:27:22 +01:00
dependabot[bot]
d2705d0b92 Bump Microsoft.NET.Test.Sdk from 17.11.1 to 17.12.0
Bumps [Microsoft.NET.Test.Sdk](https://github.com/microsoft/vstest) from 17.11.1 to 17.12.0.
- [Release notes](https://github.com/microsoft/vstest/releases)
- [Changelog](https://github.com/microsoft/vstest/blob/main/docs/releases.md)
- [Commits](https://github.com/microsoft/vstest/compare/v17.11.1...v17.12.0)

---
updated-dependencies:
- dependency-name: Microsoft.NET.Test.Sdk
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-25 14:27:09 +01:00
dependabot[bot]
fcd0397184 Bump Microsoft.Playwright.NUnit and NUnit
Bumps [Microsoft.Playwright.NUnit](https://github.com/microsoft/playwright-dotnet) and [NUnit](https://github.com/nunit/nunit). These dependencies needed to be updated together.

Updates `Microsoft.Playwright.NUnit` from 1.48.0 to 1.49.0
- [Release notes](https://github.com/microsoft/playwright-dotnet/releases)
- [Commits](https://github.com/microsoft/playwright-dotnet/compare/v1.48.0...v1.49.0)

Updates `NUnit` from 4.2.2 to 3.13.2
- [Release notes](https://github.com/nunit/nunit/releases)
- [Changelog](https://github.com/nunit/nunit/blob/main/CHANGES.md)
- [Commits](https://github.com/nunit/nunit/compare/4.2.2...v3.13.2)

---
updated-dependencies:
- dependency-name: Microsoft.Playwright.NUnit
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: NUnit
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-25 14:27:02 +01:00
Leendert de Borst
a8e35d5e1d Update install script with explicit update option (#412) 2024-11-25 14:26:25 +01:00
Leendert de Borst
cf459f748f Merge pull request #411 from lanedirt/407-reduce-unnecessary-warnings-in-logs
Fix various warnings in logs
2024-11-25 13:48:33 +01:00
Leendert de Borst
65a2bebd51 Update SQLite connection config (#407) 2024-11-25 13:34:28 +01:00
Leendert de Borst
22e29c6cf5 Move DataProtection to top of program.cs to prevent decryption errors (#407) 2024-11-25 13:34:13 +01:00
Leendert de Borst
6fd4f7d607 Log Smtp messages to information instead of warning (#407) 2024-11-25 11:30:10 +01:00
Leendert de Borst
dab4762e94 Always force recreate docker containers after install (#407) 2024-11-25 11:29:44 +01:00
Leendert de Borst
bb3d38f50e Consolidate docker build/publish (#407) 2024-11-25 11:29:28 +01:00
Leendert de Borst
c7f6375fbb Return bad request if no refresh token is provided (#407) 2024-11-22 23:01:36 +01:00
Leendert de Borst
197248a6ea Merge pull request #406 from lanedirt/323-customize-error-when-unhandled-error-occurs-in-webapp
Style blazor wasm exception message
2024-11-22 12:15:35 +01:00
Leendert de Borst
5de9a0b8d8 Style blazor wasm exception message (#323) 2024-11-22 10:48:43 +01:00
Leendert de Borst
8a99dbf705 Merge pull request #394 from lanedirt/359-back-button-should-not-be-visible-at-terms-and-conditions-step-during-user-create
Do not show back button on first step of user creation
2024-11-22 10:03:45 +01:00
Leendert de Borst
b6b3b88b1d Merge pull request #395 from lanedirt/358-do-not-show-expired-access-tokens-on-security-page-on-client
Only show non-expired refresh tokens on client
2024-11-22 10:03:39 +01:00
Leendert de Borst
0dc699ea54 Merge pull request #396 from lanedirt/371-tweak-client-body-and-footer-z-index
Fix body and footer overlap issue
2024-11-22 10:03:33 +01:00
Leendert de Borst
a228ccb904 Merge pull request #397 from lanedirt/363-client-logout-action-registers-as-failed-in-auth-log
Fix refresh token revoke bug
2024-11-22 10:03:28 +01:00
Leendert de Borst
398e4016dc Merge pull request #399 from lanedirt/398-only-use-installsh-for-testing-pull-deploy-in-github-actions
Download fresh install.sh to test pull deploy in GitHub Actions
2024-11-22 10:03:22 +01:00
Leendert de Borst
fd1e0c5d15 Merge pull request #404 from lanedirt/402-add-github-pages-documentation-website
Update README with new docs website
2024-11-22 01:21:27 +01:00
Leendert de Borst
e6ea0c51c8 Update README with new docs website (#402) 2024-11-22 01:21:11 +01:00
Leendert de Borst
38eef67207 Merge pull request #403 from lanedirt/402-add-github-pages-documentation-website
Update documentation
2024-11-22 00:41:03 +01:00
Leendert de Borst
7ce253e93d Update docs (#402) 2024-11-22 00:40:41 +01:00
Leendert de Borst
c519b80159 Merge pull request #401 from lanedirt/400-tweak-docker-compose-setup-to-not-use-static-network-name-to-prevent-conflicts
Remove static docker network name to prevent conflicts as its not needed
2024-11-21 22:37:16 +01:00
Leendert de Borst
e128bbf091 Remove static docker network name to prevent conflicts as its not needed (#400) 2024-11-21 22:36:15 +01:00
Leendert de Borst
04315b38ba Create CNAME 2024-11-21 20:41:12 +01:00
Leendert de Borst
0ee1b5e992 Download fresh install.sh to test pull deploy instead of checking out full repo (#398) 2024-11-21 19:53:04 +01:00
Leendert de Borst
b4b2dc3fe7 Fix refresh token revoke bug (#363) 2024-11-21 19:26:16 +01:00
Leendert de Borst
7ac9cdc9e7 Tweak body so it fully overlaps over absolutely positioned footer while scrolling (#371) 2024-11-21 18:14:14 +01:00
Leendert de Borst
9ba8bb183a Only show non-expired refresh tokens on client (#358) 2024-11-21 18:12:42 +01:00
Leendert de Borst
7ef8a12fb2 Do not show back button on first step of user creation (#359) 2024-11-21 17:33:19 +01:00
Leendert de Borst
ea7aba4ff4 Merge pull request #393 from lanedirt/391-download-letsencrypt-docker-compose-yml-file-for-quick-install
Add static docker compose network name
2024-11-20 17:52:37 +01:00
Leendert de Borst
aac9694d5d Add static network name (#391) 2024-11-20 17:52:11 +01:00
Leendert de Borst
06d7666265 Merge pull request #392 from lanedirt/391-download-letsencrypt-docker-compose-yml-file-for-quick-install
Update install.sh
2024-11-20 17:23:56 +01:00
Leendert de Borst
ca17759727 Update install.sh (#391) 2024-11-20 17:23:36 +01:00
Leendert de Borst
48b96b4151 Merge pull request #390 from lanedirt/389-prepare-070-release
Update documentation for 0.7.0 release
2024-11-20 17:01:20 +01:00
Leendert de Borst
e9064643a6 Add busy timeout to SQLite connections to prevent errors (#389) 2024-11-20 16:52:20 +01:00
Leendert de Borst
667592411f Update for 0.7.0 release (#389) 2024-11-20 16:51:48 +01:00
Leendert de Borst
dfdf4981cb Add LetsEncrypt ssl certificate generation to docker setup (#388)
* Add LetsEncrypt scaffolding to docker compose setup (#367)

* Update install.sh (#367)

* Add certificate request logic (#367)

* Update domain validation regex (#367)

* Update install.sh (#367)

* Update install.sh (#367)

* Update nginx.conf for LetsEncrypt validation (#367)

* Update nginx.conf (#367)

* Add certbot volume mapping to nginx (#367)

* Update nginx conf to template to use env vars (#367)

* Update nginx certbot root (#367)

* Update install.sh (#367)

* Update nginx ssl letsencrypt paths (#367)

* Update install.sh (#367)

* Use conditional nginx.conf include instead of vars (#367)

* Update install.sh so it doesn't restart docker stack but expects it to be running already (#367)

* Update permissions (#367)

* Update install.sh (#367)

* Refactor and cleanup (#367)
2024-11-20 16:25:35 +01:00
Leendert de Borst
0f377bdec6 Merge pull request #384 from lanedirt/383-add-try-catch-around-favicon-extractor-to-prevent-hostname-could-not-be-parsed-exceptions
Log failed favicon extraction as information instead of warning
2024-11-20 10:13:30 +01:00
Leendert de Borst
ba17474e62 Merge pull request #385 from lanedirt/370-from-is-always-empty-in-email-popup-in-client
Fix email from value which was empty
2024-11-20 10:13:22 +01:00
Leendert de Borst
c09ad99739 Merge pull request #387 from lanedirt/386-admin-menu-absolute-urls-do-not-work-when-ran-from-subdirectory
Update absolute urls to relative URLs in admin
2024-11-20 10:13:16 +01:00
Leendert de Borst
799efe1772 Update absolute urls to relative URLs in admin (#386) 2024-11-19 21:51:37 +01:00
Leendert de Borst
1d79400df5 Fix email from value which didn't show (#370) 2024-11-19 21:42:50 +01:00
Leendert de Borst
cc4a2e087f Update FaviconController to log failed favicon extraction as information instead of warning (#383) 2024-11-19 21:30:57 +01:00
Leendert de Borst
64a76f3b9f Merge pull request #381 from lanedirt/372-installsh-reset-password-throws-sed-notice-error
Fix bug in reset-password regex check
2024-11-18 20:28:28 +01:00
Leendert de Borst
7c1aaab291 Fix bug in reset-password regex check (#372) 2024-11-18 20:21:55 +01:00
Leendert de Borst
63556d163a Merge pull request #380 from lanedirt/374-publish-docker-images-on-release
Add -y flag to install.sh for uninstall action
2024-11-18 20:13:13 +01:00
Leendert de Borst
c49c0e4ad5 Update install.sh (#374) 2024-11-18 19:51:05 +01:00
Leendert de Borst
3f2121f272 Merge pull request #379 from lanedirt/374-publish-docker-images-on-release
Publish docker images on release
2024-11-18 19:42:55 +01:00
Leendert de Borst
ebdcf778be Update README.md (#374) 2024-11-18 19:00:10 +01:00
Leendert de Borst
fb669df9cf Update docs (#374) 2024-11-18 17:18:28 +01:00
Leendert de Borst
cedf7d0733 Update README.md (#374) 2024-11-18 17:13:17 +01:00
Leendert de Borst
00db83f478 Update github actions to use new install.sh (#374) 2024-11-18 16:39:09 +01:00
Leendert de Borst
03b7f92a44 Fix admin absolute redirect issues (#374) 2024-11-18 16:32:20 +01:00
Leendert de Borst
d542a4273d Fix DataProtection issues (#374) 2024-11-18 16:32:06 +01:00
Leendert de Borst
dcb27ca543 Update install.sh to generate/download external dependencies (#374) 2024-11-18 16:31:11 +01:00
Leendert de Borst
78635b8ba1 Combine all CLI actions to a single file (#374) 2024-11-18 13:06:10 +01:00
Leendert de Borst
e18d31ee9b Fix 404 dark mode text (#374) 2024-11-18 12:56:31 +01:00
Leendert de Borst
0db5fb64a8 Run install and build in verbose mode in workflows (#374) 2024-11-18 11:33:41 +01:00
Leendert de Borst
e36d28eb99 Update README (#374) 2024-11-18 11:33:18 +01:00
Leendert de Borst
dd331f75c9 Fix regex (#374) 2024-11-18 11:15:10 +01:00
dependabot[bot]
aa11697ee2 Bump NUnit.Analyzers from 4.3.0 to 4.4.0
Bumps [NUnit.Analyzers](https://github.com/nunit/nunit.analyzers) from 4.3.0 to 4.4.0.
- [Release notes](https://github.com/nunit/nunit.analyzers/releases)
- [Changelog](https://github.com/nunit/nunit.analyzers/blob/master/CHANGES.md)
- [Commits](https://github.com/nunit/nunit.analyzers/compare/4.3.0...4.4.0)

---
updated-dependencies:
- dependency-name: NUnit.Analyzers
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-18 11:05:37 +01:00
dependabot[bot]
fdd698dd0a Bump Microsoft.IdentityModel.Tokens from 8.2.0 to 8.2.1
Bumps [Microsoft.IdentityModel.Tokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet) from 8.2.0 to 8.2.1.
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.2.0...8.2.1)

---
updated-dependencies:
- dependency-name: Microsoft.IdentityModel.Tokens
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-18 11:05:29 +01:00
Leendert de Borst
c8df588401 Fix admin password check (#374) 2024-11-18 11:05:07 +01:00
dependabot[bot]
a8373338c2 Bump the npm_and_yarn group across 2 directories with 1 update
Bumps the npm_and_yarn group with 1 update in the /src/AliasVault.Admin directory: [cross-spawn](https://github.com/moxystudio/node-cross-spawn).
Bumps the npm_and_yarn group with 1 update in the /src/AliasVault.Client directory: [cross-spawn](https://github.com/moxystudio/node-cross-spawn).


Updates `cross-spawn` from 7.0.3 to 7.0.5
- [Changelog](https://github.com/moxystudio/node-cross-spawn/blob/master/CHANGELOG.md)
- [Commits](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.3...v7.0.5)

Updates `cross-spawn` from 7.0.3 to 7.0.5
- [Changelog](https://github.com/moxystudio/node-cross-spawn/blob/master/CHANGELOG.md)
- [Commits](https://github.com/moxystudio/node-cross-spawn/compare/v7.0.3...v7.0.5)

---
updated-dependencies:
- dependency-name: cross-spawn
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: cross-spawn
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-18 10:47:17 +01:00
Leendert de Borst
15abd1f51b Update workflows (#374) 2024-11-18 10:46:22 +01:00
Leendert de Borst
71407cc86d Publish InstallCli image used for resetting admin password (#374) 2024-11-18 10:46:00 +01:00
Leendert de Borst
85a3fed127 Create docker-compose-pull.yml (#374) 2024-11-18 10:44:05 +01:00
Leendert de Borst
6b8f0d6cdf Add separate install/build.sh files (#374) 2024-11-18 10:43:50 +01:00
Leendert de Borst
43441831d4 Convert repository name to lowercase (#374) 2024-11-18 09:41:39 +01:00
Leendert de Borst
319cff8fe1 Merge pull request #375 from lanedirt/374-publish-docker-images-on-release
Publish docker images on release
2024-11-18 09:38:47 +01:00
Leendert de Borst
5904204465 Add docker image publish workflow (#374) 2024-11-18 09:33:52 +01:00
Leendert de Borst
6c8cc92a67 Merge pull request #365 from lanedirt/364-update-docker-setup-to-run-https-by-default
Update docker setup to run https by default
2024-11-15 18:56:34 +01:00
Leendert de Borst
693860acef Update Dockerfile (#364) 2024-11-15 18:48:50 +01:00
Leendert de Borst
f7626ec15b Update ApiLoggingTests to set correct base url (#364) 2024-11-15 18:40:09 +01:00
Leendert de Borst
03c6bbc81f Update README.md (#364) 2024-11-15 17:27:57 +01:00
Leendert de Borst
bbe7ef1b2b Update install.sh (#364) 2024-11-15 17:25:59 +01:00
Leendert de Borst
027b95da15 Fix dataprotection certificate errors (#364) 2024-11-15 17:20:57 +01:00
Leendert de Borst
e9c33a808f Make apps work when run in local debug mode (#364) 2024-11-15 16:58:20 +01:00
Leendert de Borst
2545e1204f Update API and admin apps to be able to run under subdirectories (#364) 2024-11-15 16:58:20 +01:00
Leendert de Borst
970d334b59 Make all apps available through single container and HTTPS port (#364) 2024-11-15 16:58:20 +01:00
Leendert de Borst
50a18dc461 Add -k flag to ignore self-signed certs, refactor (#364) 2024-11-15 16:58:20 +01:00
Leendert de Borst
0dcc77eb0d Update docker-compose-build.yml (#364) 2024-11-15 16:58:20 +01:00
Leendert de Borst
cd84592be1 Fix AliasVault.InstallCli dockerfile names (#364) 2024-11-15 16:58:20 +01:00
Leendert de Borst
df6de32a4a Update docker setup to run under HTTPS by default (#364) 2024-11-15 16:58:20 +01:00
Leendert de Borst
3d24772caa Merge pull request #366 from lanedirt/362-tweak-dataprotection-certificate-tweaks-so-its-not-dependent-on-local-machine-keystore
Change DataProtection certificate generation so its not dependent on local machine keystore
2024-11-15 16:56:00 +01:00
Leendert de Borst
1a106e59fc Update CertificateGenerator.cs (#362) 2024-11-13 21:20:02 +01:00
Leendert de Borst
290460c095 Merge pull request #361 from lanedirt/360-upgrade-all-projects-to-net-9
Upgrade all projects to .NET 9
2024-11-13 17:55:55 +01:00
Leendert de Borst
17802dc216 Fix dataprotection, refactor (#360) 2024-11-13 17:24:03 +01:00
Leendert de Borst
0de52a396a Add .NET 9 to sonarcloud workflow explicitly (#360) 2024-11-13 17:06:15 +01:00
Leendert de Borst
64705e582d Update E2E github workflow to use new .NET 9 (#360) 2024-11-13 16:50:37 +01:00
Leendert de Borst
b09cdcec1e Fix E2E tests by switching to new KestrelTestServer (#360) 2024-11-13 16:44:44 +01:00
Leendert de Borst
87bb34f3ba Update dotnet version in github workflows (#360) 2024-11-13 14:27:50 +01:00
Leendert de Borst
5b53208a3e Update .gitignore to also ignore sqlite bak files (#360) 2024-11-13 14:25:57 +01:00
Leendert de Borst
7a687bba43 Update dockerfiles to use .NET9 (#360) 2024-11-13 14:16:16 +01:00
Leendert de Borst
aafac49bcb Disable DataProtection temporary (#360) 2024-11-13 12:48:11 +01:00
Leendert de Borst
201af7b88a Upgrade all projects to .NET 9 (#360) 2024-11-13 11:47:05 +01:00
Leendert de Borst
43ddd394c2 Merge pull request #357 from lanedirt/356-prepare-060-release
Update AppInfo.cs with new release version
2024-11-11 18:47:12 +01:00
Leendert de Borst
f248f9cd26 Update AppInfo.cs (#356) 2024-11-11 18:46:48 +01:00
Leendert de Borst
24f6168a7e Merge pull request #355 from lanedirt/350-remove-first-step-from-create-wizard
Remove first step from create wizard
2024-11-11 18:45:11 +01:00
Leendert de Borst
46b0d7b24b Merge pull request #354 from lanedirt/353-add-support-email-option-to-env-to-show-in-client
Add support email to .env to show in client application
2024-11-11 18:30:32 +01:00
Leendert de Borst
37bc557278 Update tests (#350) 2024-11-11 18:30:16 +01:00
Leendert de Borst
29d7b6dfdb Remove WelcomeStep from new user registration flow (#350) 2024-11-11 18:11:18 +01:00
Leendert de Borst
ec84792034 Add support email to .env to show in client application (#353) 2024-11-11 18:05:59 +01:00
Leendert de Borst
250ab24654 Merge pull request #344 from lanedirt/341-improve-documentation-to-explain-architecture
Improve documentation
2024-11-11 14:56:35 +01:00
Leendert de Borst
9b8770bb20 Update README with architecture docs (#341) 2024-11-11 14:50:42 +01:00
Leendert de Borst
192d35d2dd Update security architecture diagram (#341) 2024-11-11 11:43:49 +01:00
Leendert de Borst
9d2f7a15dd Update ENCRYPTION.md (#341) 2024-11-11 11:43:36 +01:00
dependabot[bot]
95ca7ab014 Bump Microsoft.IdentityModel.JsonWebTokens and Microsoft.IdentityModel.Tokens
Bumps [Microsoft.IdentityModel.JsonWebTokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet) and [Microsoft.IdentityModel.Tokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet). These dependencies needed to be updated together.

Updates `Microsoft.IdentityModel.JsonWebTokens` from 8.1.2 to 8.2.0
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.1.2...8.2.0)

Updates `Microsoft.IdentityModel.Tokens` from 8.2.0 to 8.2.0
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.2.0...8.2.0)

---
updated-dependencies:
- dependency-name: Microsoft.IdentityModel.JsonWebTokens
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: Microsoft.IdentityModel.Tokens
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-11 11:30:49 +01:00
dependabot[bot]
d29a33a95e Bump NUglify from 1.21.9 to 1.21.10
Bumps [NUglify](https://github.com/trullock/NUglify) from 1.21.9 to 1.21.10.
- [Release notes](https://github.com/trullock/NUglify/releases)
- [Changelog](https://github.com/trullock/NUglify/blob/master/changelog.md)
- [Commits](https://github.com/trullock/NUglify/compare/v1.21.9...v1.21.10)

---
updated-dependencies:
- dependency-name: NUglify
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-11 11:30:41 +01:00
Leendert de Borst
a2486b67d7 Update security architecture diagram (#341) 2024-11-10 22:12:42 +01:00
Leendert de Borst
abcd887e49 Update security architecture diagram (#341) 2024-11-10 14:21:08 +01:00
Leendert de Borst
f400387630 Update security architecture diagram (#341) 2024-11-09 17:52:34 +01:00
Leendert de Borst
3613a0cae1 Merge pull request #348 from lanedirt/347-reverting-vault-to-previous-version-does-not-work-correctly-when-password-has-been-changed
Get latest vault by revision number instead of updated at timestamp
2024-11-09 15:29:51 +01:00
Leendert de Borst
13e16d1a51 Update admin tests with new home to users redirect (#347) 2024-11-08 17:44:46 +01:00
Leendert de Borst
a2eb12d6b9 Refactor (#347) 2024-11-08 17:41:54 +01:00
Leendert de Borst
dbb0a33179 Get latest vault by revision number instead of updated at timestamp (#347) 2024-11-08 17:31:32 +01:00
Leendert de Borst
32bb4502d6 Add security architecture documentation and diagrams (#341) 2024-11-08 17:27:48 +01:00
Leendert de Borst
f12642873d Update ENCRYPTION.md (#341) 2024-11-08 17:27:08 +01:00
Leendert de Borst
e9b9d6c363 Merge pull request #346 from lanedirt/345-deleting-user-with-emails-throws-error
Deleting user that has email (claims) throws error
2024-11-07 19:06:50 +01:00
Leendert de Borst
a92f074099 Preserve email claims when user is deleted (#345) 2024-11-07 18:51:28 +01:00
Leendert de Borst
5fbaed57cc Update ENCRYPTION.md (#341) 2024-11-06 12:16:34 +01:00
Leendert de Borst
9e24442d84 Add encryption information (#341) 2024-11-06 12:12:17 +01:00
dependabot[bot]
7737a586ab Bump Microsoft.AspNetCore.Components.WebAssembly from 8.0.8 to 8.0.10
Bumps [Microsoft.AspNetCore.Components.WebAssembly](https://github.com/dotnet/aspnetcore) from 8.0.8 to 8.0.10.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.8...v8.0.10)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Components.WebAssembly
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-04 13:06:57 +01:00
dependabot[bot]
ce97c26b05 Bump Microsoft.IdentityModel.Tokens from 8.1.2 to 8.2.0
Bumps [Microsoft.IdentityModel.Tokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet) from 8.1.2 to 8.2.0.
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.1.2...8.2.0)

---
updated-dependencies:
- dependency-name: Microsoft.IdentityModel.Tokens
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-04 12:42:54 +01:00
dependabot[bot]
fa52643d48 Bump Microsoft.AspNetCore.Components.WebAssembly.Authentication
Bumps [Microsoft.AspNetCore.Components.WebAssembly.Authentication](https://github.com/dotnet/aspnetcore) from 8.0.8 to 8.0.10.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.8...v8.0.10)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Components.WebAssembly.Authentication
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-04 12:42:45 +01:00
Leendert de Borst
be3ea8e198 Bump Microsoft.Extensions.Configuration.Json in all projects (#300) 2024-11-04 09:39:08 +01:00
dependabot[bot]
574dcb3048 Bump Microsoft.Extensions.Hosting and Microsoft.Extensions.Configuration.Json
Bumps [Microsoft.Extensions.Hosting](https://github.com/dotnet/runtime) and [Microsoft.Extensions.Configuration.Json](https://github.com/dotnet/runtime). These dependencies needed to be updated together.

Updates `Microsoft.Extensions.Hosting` from 8.0.0 to 8.0.1
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/compare/v8.0.0...v8.0.1)

Updates `Microsoft.Extensions.Configuration.Json` from 8.0.0 to 8.0.1
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/compare/v8.0.0...v8.0.1)

---
updated-dependencies:
- dependency-name: Microsoft.Extensions.Hosting
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.Extensions.Configuration.Json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-04 09:39:08 +01:00
Leendert de Borst
bb20f16b0f Merge pull request #337 from lanedirt/336-include-app-version-and-show-it-in-client-and-admin-project-footer
Add static app version and show in footer
2024-11-03 17:22:19 +01:00
Leendert de Borst
8284241be6 Add static app version and show in footer (#336) 2024-11-03 15:14:41 +01:00
dependabot[bot]
a0fb68a68c Bump Microsoft.AspNetCore.DataProtection.EntityFrameworkCore
Bumps [Microsoft.AspNetCore.DataProtection.EntityFrameworkCore](https://github.com/dotnet/aspnetcore) from 8.0.8 to 8.0.10.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.8...v8.0.10)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.DataProtection.EntityFrameworkCore
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-03 13:44:01 +01:00
dependabot[bot]
2e1497795d Bump Microsoft.AspNetCore.Components.Web and Microsoft.AspNetCore.Authorization
Bumps [Microsoft.AspNetCore.Components.Web](https://github.com/dotnet/aspnetcore) and [Microsoft.AspNetCore.Authorization](https://github.com/dotnet/aspnetcore). These dependencies needed to be updated together.

Updates `Microsoft.AspNetCore.Components.Web` from 8.0.8 to 8.0.10
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.8...v8.0.10)

Updates `Microsoft.AspNetCore.Authorization` from 8.0.8 to 8.0.10
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.8...v8.0.10)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Components.Web
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.AspNetCore.Authorization
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-02 13:49:49 +01:00
dependabot[bot]
ddeab13cc3 Bump HtmlAgilityPack from 1.11.67 to 1.11.70
Bumps [HtmlAgilityPack](https://github.com/zzzprojects/html-agility-pack) from 1.11.67 to 1.11.70.
- [Release notes](https://github.com/zzzprojects/html-agility-pack/releases)
- [Commits](https://github.com/zzzprojects/html-agility-pack/commits/v1.11.70)

---
updated-dependencies:
- dependency-name: HtmlAgilityPack
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-02 13:49:29 +01:00
dependabot[bot]
8841a51376 Bump Microsoft.AspNetCore.Identity.EntityFrameworkCore
Bumps [Microsoft.AspNetCore.Identity.EntityFrameworkCore](https://github.com/dotnet/aspnetcore) from 8.0.8 to 8.0.10.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.8...v8.0.10)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Identity.EntityFrameworkCore
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-02 13:49:04 +01:00
dependabot[bot]
e8e380bd22 Bump Serilog from 4.0.2 to 4.1.0
Bumps [Serilog](https://github.com/serilog/serilog) from 4.0.2 to 4.1.0.
- [Release notes](https://github.com/serilog/serilog/releases)
- [Commits](https://github.com/serilog/serilog/compare/v4.0.2...v4.1.0)

---
updated-dependencies:
- dependency-name: Serilog
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-02 13:49:00 +01:00
dependabot[bot]
ce5ad91ef5 Bump Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Bumps [Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore](https://github.com/dotnet/aspnetcore) from 8.0.8 to 8.0.10.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.8...v8.0.10)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-02 13:48:54 +01:00
dependabot[bot]
b253772152 Bump Microsoft.EntityFrameworkCore.Sqlite from 8.0.8 to 8.0.10
Bumps [Microsoft.EntityFrameworkCore.Sqlite](https://github.com/dotnet/efcore) from 8.0.8 to 8.0.10.
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v8.0.8...v8.0.10)

---
updated-dependencies:
- dependency-name: Microsoft.EntityFrameworkCore.Sqlite
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-02 13:48:49 +01:00
dependabot[bot]
b0cb9e9b8d Bump Microsoft.EntityFrameworkCore.Design from 8.0.8 to 8.0.10
Bumps [Microsoft.EntityFrameworkCore.Design](https://github.com/dotnet/efcore) from 8.0.8 to 8.0.10.
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v8.0.8...v8.0.10)

---
updated-dependencies:
- dependency-name: Microsoft.EntityFrameworkCore.Design
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-02 13:48:43 +01:00
dependabot[bot]
085706eae5 Bump Microsoft.AspNetCore.Components.WebAssembly.DevServer
Bumps [Microsoft.AspNetCore.Components.WebAssembly.DevServer](https://github.com/dotnet/aspnetcore) from 8.0.8 to 8.0.10.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.8...v8.0.10)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Components.WebAssembly.DevServer
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-02 13:48:37 +01:00
Leendert de Borst
f57dcfa894 Update README.md 2024-11-02 13:18:49 +01:00
dependabot[bot]
1b9ff1754a Bump Serilog.Settings.Configuration from 8.0.2 to 8.0.4
Bumps [Serilog.Settings.Configuration](https://github.com/serilog/serilog-settings-configuration) from 8.0.2 to 8.0.4.
- [Release notes](https://github.com/serilog/serilog-settings-configuration/releases)
- [Changelog](https://github.com/serilog/serilog-settings-configuration/blob/dev/CHANGES.md)
- [Commits](https://github.com/serilog/serilog-settings-configuration/compare/v8.0.2...v8.0.4)

---
updated-dependencies:
- dependency-name: Serilog.Settings.Configuration
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-01 19:17:01 +01:00
dependabot[bot]
86a49de886 Bump Microsoft.AspNetCore.Authentication.JwtBearer from 8.0.8 to 8.0.10
Bumps [Microsoft.AspNetCore.Authentication.JwtBearer](https://github.com/dotnet/aspnetcore) from 8.0.8 to 8.0.10.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.8...v8.0.10)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Authentication.JwtBearer
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-01 19:16:54 +01:00
dependabot[bot]
f6473b263b Bump Microsoft.Extensions.Http from 8.0.0 to 8.0.1
Bumps [Microsoft.Extensions.Http](https://github.com/dotnet/runtime) from 8.0.0 to 8.0.1.
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/compare/v8.0.0...v8.0.1)

---
updated-dependencies:
- dependency-name: Microsoft.Extensions.Http
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-01 19:16:48 +01:00
dependabot[bot]
eae0aaf2a5 Bump Swashbuckle.AspNetCore from 6.8.1 to 6.9.0
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.8.1 to 6.9.0.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.8.1...v6.9.0)

---
updated-dependencies:
- dependency-name: Swashbuckle.AspNetCore
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-01 19:16:42 +01:00
dependabot[bot]
e086ce3684 Bump Microsoft.Playwright.NUnit from 1.47.0 to 1.48.0
Bumps [Microsoft.Playwright.NUnit](https://github.com/microsoft/playwright-dotnet) from 1.47.0 to 1.48.0.
- [Release notes](https://github.com/microsoft/playwright-dotnet/releases)
- [Commits](https://github.com/microsoft/playwright-dotnet/compare/v1.47.0...v1.48.0)

---
updated-dependencies:
- dependency-name: Microsoft.Playwright.NUnit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-01 19:16:35 +01:00
dependabot[bot]
3401dcf402 Bump Microsoft.AspNetCore.Components.WebAssembly.Server
Bumps [Microsoft.AspNetCore.Components.WebAssembly.Server](https://github.com/dotnet/aspnetcore) from 8.0.8 to 8.0.10.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.8...v8.0.10)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Components.WebAssembly.Server
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-01 19:16:30 +01:00
dependabot[bot]
30ec77ef56 Bump Microsoft.EntityFrameworkCore from 8.0.8 to 8.0.10
Bumps [Microsoft.EntityFrameworkCore](https://github.com/dotnet/efcore) from 8.0.8 to 8.0.10.
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v8.0.8...v8.0.10)

---
updated-dependencies:
- dependency-name: Microsoft.EntityFrameworkCore
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-11-01 19:16:21 +01:00
Leendert de Borst
5e6e05cfd3 Update dependabot.yml 2024-11-01 19:16:06 +01:00
Leendert de Borst
d06187879b Merge pull request #328 from lanedirt/326-add-beta-indication
Add beta indication
2024-10-31 00:05:46 +01:00
Leendert de Borst
d5e6b7a5c7 Update text (#326) 2024-10-30 23:25:06 +01:00
Leendert de Borst
609006d199 Add beta flag to logo (#326) 2024-10-29 20:44:53 +01:00
Leendert de Borst
1eb6f46f3c Merge pull request #327 from lanedirt/177-replace-welcome-screen-with-step-by-step-wizard-interface-for-creating-first-credential
Replace welcome screen with simple tutorial
2024-10-28 17:11:19 +01:00
Leendert de Borst
ad03613316 Tweak admin layout for mobile (#177) 2024-10-28 16:52:32 +01:00
Leendert de Borst
d71194b3b8 Add E2E tests for welcome screen tutorial (#177) 2024-10-28 16:48:00 +01:00
Leendert de Borst
7b43acec09 Refactor (#177) 2024-10-28 16:13:16 +01:00
Leendert de Borst
8e24686578 Update tests (#177) 2024-10-28 15:13:10 +01:00
Leendert de Borst
2d91fdfaed Tweak layout for mobile (#177) 2024-10-28 14:59:54 +01:00
Leendert de Borst
ce93c01039 Show credential placeholder on empty page (#177) 2024-10-28 14:11:07 +01:00
Leendert de Borst
0631daf61b Add TutorialDone settings flag (#177) 2024-10-28 13:36:55 +01:00
Leendert de Borst
50c3c64db6 Delete transitionEffect.js (#177) 2024-10-28 13:36:36 +01:00
Leendert de Borst
5b22a41aa6 Rework welcome screen (#177) 2024-10-28 13:02:06 +01:00
Leendert de Borst
e2be93ec85 Change welcome page to tutorial steps (#177) 2024-10-27 20:45:30 +01:00
Leendert de Borst
bc6c7a10dc Update light mode background color for improved constrast (#177) 2024-10-27 20:28:29 +01:00
Leendert de Borst
bca0d3ee6b Merge pull request #325 from lanedirt/314-improve-ux-for-slow-clients
Show page refresh button if loading takes too long
2024-10-26 18:02:04 +02:00
Leendert de Borst
c860899f8e Show refresh button after 30 sec (#314) 2024-10-25 23:32:20 +02:00
Leendert de Borst
fba8c171b6 Show page refresh button if loading takes too long (#314) 2024-10-25 18:08:40 +02:00
Leendert de Borst
557deee352 Merge pull request #324 from lanedirt/320-add-client-styled-error-messages
Improve error message for unlock page if API cannot be reached
2024-10-24 20:44:31 +02:00
Leendert de Borst
9ec1d83de9 Update Unlock.razor (#320) 2024-10-24 20:02:35 +02:00
Leendert de Borst
6760a9c89a Merge pull request #322 from lanedirt/317-refactor-client-appsettingsjson-to-always-use-config-object
Expose all config settings through config object
2024-10-23 22:01:49 +02:00
Leendert de Borst
86ccccb95d Improve error message for unlock page if API cannot be reached (#320) 2024-10-23 22:01:22 +02:00
Leendert de Borst
8cca485930 Merge pull request #321 from lanedirt/312-login-flow-optimizations
Login flow optimizations
2024-10-23 21:53:13 +02:00
Leendert de Borst
353631bcda Expose all config settings through config object (#317) 2024-10-23 21:48:04 +02:00
Leendert de Borst
2f79eabd1b Add hidden submit button to allow enter to submit the form if it has multiple elements (#312) 2024-10-23 21:44:56 +02:00
Leendert de Borst
0ef1a9b118 Add form wrapper around setup fields to intercept enter (#312) 2024-10-22 23:10:45 +02:00
Leendert de Borst
7a374d9730 Improve webauthn unlock flow (#312) 2024-10-22 22:52:11 +02:00
Leendert de Borst
faa578b5b5 Update unlock.razor webauthn flow (#312) 2024-10-22 21:42:36 +02:00
Leendert de Borst
d59757c8fb Merge pull request #318 from lanedirt/315-fix-account-creation-mobile-interface-for-safari-browser
Fix account creation mobile interface for safari browser
2024-10-22 21:27:33 +02:00
Leendert de Borst
88e5142049 Add scroll to top when switching between steps (#315) 2024-10-22 21:18:26 +02:00
Leendert de Borst
f6c9000bec Fix uninstall script (#315) 2024-10-21 23:37:08 +02:00
Leendert de Borst
d3b3281ca4 Update README.md 2024-10-21 23:10:50 +02:00
Leendert de Borst
55178006c8 Fix setup theme for mobile devices (#315) 2024-10-21 19:50:50 +02:00
Leendert de Borst
92b65bad20 Add margin to loading screens in client (#315) 2024-10-21 12:22:54 +02:00
Leendert de Borst
443721dc75 Update css rebuild task names to make client and admin unique (#315) 2024-10-21 12:19:33 +02:00
Leendert de Borst
997335205f Update launchSettings to bind to all network interfaces to allow mobile phone debugging on same LAN (#315) 2024-10-21 11:56:23 +02:00
Leendert de Borst
2d4c865709 Merge pull request #316 from lanedirt/311-uploading-multiple-attachments-doesnt-work
Uploading multiple attachments doesnt work
2024-10-20 15:47:52 +02:00
Leendert de Borst
5f4290add1 Update credential update logic to save all new attachments (#311) 2024-10-19 12:08:42 +02:00
Leendert de Borst
f553f4e596 Add attachment tests to reproduce issue (#311) 2024-10-19 11:59:13 +02:00
Leendert de Borst
acdeb8bc28 Allow for uploading multiple attachments (#311) 2024-10-19 11:59:03 +02:00
Leendert de Borst
030b90eb76 Update style for mobile responsive setup (#315) 2024-10-19 11:37:59 +02:00
Leendert de Borst
022a32358d Merge pull request #313 from lanedirt/308-optimize-credential-edit-page-for-mobile
Optimize credential AddEdit page for mobile
2024-10-18 21:50:24 +02:00
Leendert de Borst
75f71dcc43 Optimize credential AddEdit page for mobile (#308) 2024-10-18 21:41:59 +02:00
Leendert de Borst
dae7e1d065 Merge pull request #310 from lanedirt/306-improve-ux-for-login--create-account-flow
Improve ux for login and create account flow
2024-10-18 18:04:22 +02:00
Leendert de Borst
d0b680c20c Add E2E test for new user setup account creation flow (#306) 2024-10-18 17:56:40 +02:00
Leendert de Borst
95bc774d2d Refactor (#306) 2024-10-18 17:39:32 +02:00
Leendert de Borst
11c680471f Fix release mode conditional variable name (#306) 2024-10-18 17:36:07 +02:00
Leendert de Borst
c5ccde298f Fix existing tests (#306) 2024-10-18 17:01:09 +02:00
Leendert de Borst
c969cd738f Fix note bugs (#306) 2024-10-18 16:04:34 +02:00
Leendert de Borst
be62fc9127 Replaced png logo with SVG (#306) 2024-10-18 15:33:36 +02:00
Leendert de Borst
da5754d720 Cleanup setup components (#306) 2024-10-18 15:05:52 +02:00
Leendert de Borst
658d03bc02 Improve flow with separate creating step, minor tweaks (#306) 2024-10-18 14:28:50 +02:00
Leendert de Borst
862f013bda Add terms and conditions step (#306) 2024-10-18 12:53:07 +02:00
Leendert de Borst
c0d250a35c Update back and continue button position (#306) 2024-10-18 12:01:44 +02:00
Leendert de Borst
26580f72ca Tweak account create layout for small and large screens (#306) 2024-10-18 11:46:14 +02:00
Leendert de Borst
3ff418945c Tweak start page (#306) 2024-10-17 22:56:15 +02:00
Leendert de Borst
c729a06e25 Add focus on input, tweak password notices (#306) 2024-10-17 22:44:03 +02:00
Leendert de Borst
b62a13ce76 Improve username step validation (#306) 2024-10-16 18:01:34 +02:00
Leendert de Borst
9dca684e4c Add password step and working account creation (#306) 2024-10-15 22:21:16 +02:00
Leendert de Borst
5d7433674c Add username validation logic (#306) 2024-10-15 21:27:32 +02:00
Leendert de Borst
458a336526 Add user create tutorial scaffolding (#306) 2024-10-14 17:05:38 +02:00
Leendert de Borst
9e16e30ad0 Add start screen, replace logo with text and img cleanup (#306) 2024-10-14 13:42:40 +02:00
Leendert de Borst
de0cce7b64 Merge pull request #296 from lanedirt/287-saving-existing-credential-with-one-or-more-attachments-fails
Saving existing credential with one or more attachments fails
2024-10-14 09:58:30 +02:00
dependabot[bot]
7b315dc87a Bump MailKit from 4.7.1.1 to 4.8.0
Bumps [MailKit](https://github.com/jstedfast/MailKit) from 4.7.1.1 to 4.8.0.
- [Changelog](https://github.com/jstedfast/MailKit/blob/master/ReleaseNotes.md)
- [Commits](https://github.com/jstedfast/MailKit/compare/4.7.1.1...4.8.0)

---
updated-dependencies:
- dependency-name: MailKit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-14 09:56:48 +02:00
Leendert de Borst
dcf04f040d Add attachment delete test and fix bug with IsDeleted flag (#287) 2024-10-13 19:04:55 +02:00
Leendert de Borst
6d795c6370 Added attachment test that reproduces issue (#287) 2024-10-13 16:32:06 +02:00
Leendert de Borst
827f677af8 Add attachment upload test scaffolding (#287) 2024-10-12 12:10:56 +02:00
dependabot[bot]
be96d45275 Bump Serilog from 4.0.1 to 4.0.2
Bumps [Serilog](https://github.com/serilog/serilog) from 4.0.1 to 4.0.2.
- [Release notes](https://github.com/serilog/serilog/releases)
- [Commits](https://github.com/serilog/serilog/compare/v4.0.1...v4.0.2)

---
updated-dependencies:
- dependency-name: Serilog
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-11 16:29:33 +02:00
dependabot[bot]
7ef6e3ad8f Bump MimeKit from 4.7.1 to 4.8.0
Bumps [MimeKit](https://github.com/jstedfast/MimeKit) from 4.7.1 to 4.8.0.
- [Changelog](https://github.com/jstedfast/MimeKit/blob/master/ReleaseNotes.md)
- [Commits](https://github.com/jstedfast/MimeKit/compare/4.7.1...4.8.0)

---
updated-dependencies:
- dependency-name: MimeKit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-11 16:29:26 +02:00
dependabot[bot]
df83bdd329 Bump Swashbuckle.AspNetCore from 6.8.0 to 6.8.1
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.8.0 to 6.8.1.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.8.0...v6.8.1)

---
updated-dependencies:
- dependency-name: Swashbuckle.AspNetCore
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-11 16:29:19 +02:00
dependabot[bot]
9d1341e02a Bump HtmlAgilityPack from 1.11.66 to 1.11.67
Bumps [HtmlAgilityPack](https://github.com/zzzprojects/html-agility-pack) from 1.11.66 to 1.11.67.
- [Release notes](https://github.com/zzzprojects/html-agility-pack/releases)
- [Commits](https://github.com/zzzprojects/html-agility-pack/commits)

---
updated-dependencies:
- dependency-name: HtmlAgilityPack
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-11 16:29:14 +02:00
dependabot[bot]
1f249af022 Bump the npm_and_yarn group across 2 directories with 1 update
Bumps the npm_and_yarn group with 1 update in the /src/AliasVault.Admin directory: [micromatch](https://github.com/micromatch/micromatch).
Bumps the npm_and_yarn group with 1 update in the /src/AliasVault.Client directory: [micromatch](https://github.com/micromatch/micromatch).


Updates `micromatch` from 4.0.7 to 4.0.8
- [Release notes](https://github.com/micromatch/micromatch/releases)
- [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/micromatch/compare/4.0.7...4.0.8)

Updates `micromatch` from 4.0.7 to 4.0.8
- [Release notes](https://github.com/micromatch/micromatch/releases)
- [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/micromatch/compare/4.0.7...4.0.8)

---
updated-dependencies:
- dependency-name: micromatch
  dependency-type: indirect
  dependency-group: npm_and_yarn
- dependency-name: micromatch
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-11 16:29:05 +02:00
dependabot[bot]
5f9f607290 Bump Microsoft.EntityFrameworkCore.Tools, Microsoft.EntityFrameworkCore.Design and Microsoft.EntityFrameworkCore
Bumps [Microsoft.EntityFrameworkCore.Tools](https://github.com/dotnet/efcore), [Microsoft.EntityFrameworkCore.Design](https://github.com/dotnet/efcore) and [Microsoft.EntityFrameworkCore](https://github.com/dotnet/efcore). These dependencies needed to be updated together.

Updates `Microsoft.EntityFrameworkCore.Tools` from 8.0.8 to 8.0.10
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v8.0.8...v8.0.10)

Updates `Microsoft.EntityFrameworkCore.Design` from 8.0.8 to 8.0.10
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v8.0.8...v8.0.10)

Updates `Microsoft.EntityFrameworkCore` from 8.0.8 to 8.0.10
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v8.0.8...v8.0.10)

---
updated-dependencies:
- dependency-name: Microsoft.EntityFrameworkCore.Tools
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.EntityFrameworkCore.Design
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.EntityFrameworkCore
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-11 16:28:54 +02:00
dependabot[bot]
16baa7ad74 Bump Microsoft.AspNetCore.DataProtection from 8.0.8 to 8.0.10
Bumps [Microsoft.AspNetCore.DataProtection](https://github.com/dotnet/aspnetcore) from 8.0.8 to 8.0.10.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.8...v8.0.10)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.DataProtection
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-11 16:28:46 +02:00
dependabot[bot]
c4197e6cd8 Bump Microsoft.EntityFrameworkCore.Proxies and Microsoft.EntityFrameworkCore
Bumps [Microsoft.EntityFrameworkCore.Proxies](https://github.com/dotnet/efcore) and [Microsoft.EntityFrameworkCore](https://github.com/dotnet/efcore). These dependencies needed to be updated together.

Updates `Microsoft.EntityFrameworkCore.Proxies` from 8.0.8 to 8.0.10
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v8.0.8...v8.0.10)

Updates `Microsoft.EntityFrameworkCore` from 8.0.8 to 8.0.10
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v8.0.8...v8.0.10)

---
updated-dependencies:
- dependency-name: Microsoft.EntityFrameworkCore.Proxies
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.EntityFrameworkCore
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-11 16:28:40 +02:00
dependabot[bot]
8aa2ec925a Bump Microsoft.IdentityModel.JsonWebTokens and Microsoft.IdentityModel.Tokens
Bumps [Microsoft.IdentityModel.JsonWebTokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet) and [Microsoft.IdentityModel.Tokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet). These dependencies needed to be updated together.

Updates `Microsoft.IdentityModel.JsonWebTokens` from 8.1.0 to 8.1.2
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.1.0...8.1.2)

Updates `Microsoft.IdentityModel.Tokens` from 8.1.0 to 8.1.2
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.1.0...8.1.2)

---
updated-dependencies:
- dependency-name: Microsoft.IdentityModel.JsonWebTokens
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.IdentityModel.Tokens
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-11 16:28:32 +02:00
dependabot[bot]
b3ac7064ef Bump Microsoft.AspNetCore.Mvc.Testing, Microsoft.Extensions.Hosting and Microsoft.Extensions.Configuration.Json
Bumps [Microsoft.AspNetCore.Mvc.Testing](https://github.com/dotnet/aspnetcore), [Microsoft.Extensions.Hosting](https://github.com/dotnet/runtime) and [Microsoft.Extensions.Configuration.Json](https://github.com/dotnet/runtime). These dependencies needed to be updated together.

Updates `Microsoft.AspNetCore.Mvc.Testing` from 8.0.8 to 8.0.10
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.8...v8.0.10)

Updates `Microsoft.Extensions.Hosting` from 8.0.0 to 8.0.1
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/compare/v8.0.0...v8.0.1)

Updates `Microsoft.Extensions.Configuration.Json` from 8.0.0 to 8.0.1
- [Release notes](https://github.com/dotnet/runtime/releases)
- [Commits](https://github.com/dotnet/runtime/compare/v8.0.0...v8.0.1)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Mvc.Testing
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.Extensions.Hosting
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.Extensions.Configuration.Json
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-11 16:28:25 +02:00
dependabot[bot]
91f554187e Bump Microsoft.EntityFrameworkCore.SqlServer and Microsoft.EntityFrameworkCore
Bumps [Microsoft.EntityFrameworkCore.SqlServer](https://github.com/dotnet/efcore) and [Microsoft.EntityFrameworkCore](https://github.com/dotnet/efcore). These dependencies needed to be updated together.

Updates `Microsoft.EntityFrameworkCore.SqlServer` from 8.0.8 to 8.0.10
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v8.0.8...v8.0.10)

Updates `Microsoft.EntityFrameworkCore` from 8.0.8 to 8.0.10
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v8.0.8...v8.0.10)

---
updated-dependencies:
- dependency-name: Microsoft.EntityFrameworkCore.SqlServer
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.EntityFrameworkCore
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-10-11 16:28:17 +02:00
Leendert de Borst
e161478614 Merge pull request #288 from lanedirt/175-make-all-ui-components-compatible-with-dark-mode
Make all UI components compatible with dark mode
2024-10-11 16:27:05 +02:00
Leendert de Borst
92e2de76ba Refactor (#175) 2024-10-11 16:17:04 +02:00
Leendert de Borst
5644f89db0 Updated admin for dark mode (#175) 2024-10-11 14:57:44 +02:00
Leendert de Borst
8ea8382c7d Fix dark mode init, update loading screen (#175) 2024-10-11 11:41:03 +02:00
Leendert de Borst
869c3c86be Update dark mode body color (#175) 2024-10-10 18:11:48 +02:00
Leendert de Borst
cd865d70c6 Update alerts and sync messages for dark mode (#175) 2024-10-09 22:37:44 +02:00
Leendert de Borst
5bb2e3d5ce Set dark mode during page init (#175) 2024-10-08 22:35:48 +02:00
Leendert de Borst
e80c351ee6 Update client for dark theme compatibility (#175) 2024-10-08 21:50:41 +02:00
Leendert de Borst
359fa1752f Merge pull request #286 from lanedirt/220-refactor-blazor-components-for-reuse
Update ClientPlaywrightTest.cs (#220)
2024-10-07 21:07:48 +02:00
Leendert de Borst
259de77a12 Update ClientPlaywrightTest.cs (#220) 2024-10-07 21:07:27 +02:00
Leendert de Borst
f15ef80839 Merge pull request #284 from lanedirt/220-refactor-blazor-components-for-reuse
Refactor blazor components to reduce duplicated code
2024-10-07 20:58:54 +02:00
Leendert de Borst
62d2249f40 Refactor (#220) 2024-10-07 20:50:20 +02:00
Leendert de Borst
14845e77e0 Update tests (#220) 2024-10-07 20:29:29 +02:00
Leendert de Borst
fa664ea918 Update all admin tables to use new SortableTable component (#220) 2024-10-07 20:03:23 +02:00
Leendert de Borst
bbb168d764 Refactor table to common SortableTable component (#220) 2024-10-07 17:47:07 +02:00
Leendert de Borst
d5ba3a63e4 Refactor misc buttons in client app to shared button components (#220) 2024-10-07 16:29:59 +02:00
Leendert de Borst
afc605afd0 Update LinkButton (#220) 2024-10-07 16:11:42 +02:00
Leendert de Borst
cdbe6c6e8c Refactor admin account settings links/buttons (#220) 2024-10-07 16:03:11 +02:00
Leendert de Borst
b184273456 Refactor page headers in admin to shared component (#220) 2024-10-07 15:18:08 +02:00
Leendert de Borst
fb7de645e5 Adjust namespace (#220) 2024-10-07 14:39:08 +02:00
Leendert de Borst
35f35b8bbe Refactor page headers in client to shared component (#220) 2024-10-07 14:34:53 +02:00
Leendert de Borst
4c5e312f11 Update welcome.razor margins (#220) 2024-10-07 13:11:11 +02:00
Leendert de Borst
708f6d7b9b Merge pull request #283 from lanedirt/280-optimize-mobile-responsive-version
Mobile response tweaks
2024-10-07 12:43:12 +02:00
Leendert de Borst
5b72e181e6 Merge pull request #282 from lanedirt/276-show-specific-warning-if-wasm-is-not-supported-by-client
Add WASM error detection and show application warning if WASM is not supported by client
2024-10-07 12:42:58 +02:00
Leendert de Borst
4441c543cc Refactor if/else (#276) 2024-10-07 12:29:51 +02:00
Leendert de Borst
933f8650ce Mobile response tweaks (#280) 2024-10-07 12:27:28 +02:00
Leendert de Borst
26c910bf26 Add WASM error detection and show application warning (#276) 2024-10-07 11:45:40 +02:00
Leendert de Borst
037919a548 Update README.md 2024-10-06 15:11:03 +02:00
Leendert de Borst
771527c891 Update README.md 2024-10-06 15:09:13 +02:00
Leendert de Borst
13c8709c19 Merge pull request #278 from lanedirt/275-make-2fa-input-field-number-input
Make 2fa input field a number
2024-10-05 19:53:28 +02:00
Leendert de Borst
043538054e Make 2FA input field a number (#275) 2024-10-05 19:45:46 +02:00
Leendert de Borst
d366dc3b0c Fix note regex bug (#275) 2024-10-05 19:16:45 +02:00
Leendert de Borst
35f1332138 Merge pull request #273 from lanedirt/271-add-newline-support-to-notes-field
Update note widget to support newlines and anchor tags
2024-10-05 15:20:31 +02:00
Leendert de Borst
ac040d90a8 Update note widget to support newlines and anchor tags (#271) 2024-10-04 20:02:06 +02:00
Leendert de Borst
0e50276308 Merge pull request #274 from lanedirt/269-add-support-for-persisting-encryption-key
Revert JsInteropService to have init in properties
2024-10-04 20:01:01 +02:00
Leendert de Borst
1c0041326b Revert JsInteropService to have init in properties (#269) 2024-10-04 20:00:29 +02:00
Leendert de Borst
8d13b1b0e3 Merge pull request #272 from lanedirt/269-add-support-for-persisting-encryption-key
Make webauthn implementation secure
2024-10-04 18:23:25 +02:00
Leendert de Borst
a267d94b3e Fix flaky tests (#269) 2024-10-04 18:11:24 +02:00
Leendert de Borst
4ccbba5b4b Refactor (#269) 2024-10-04 17:23:25 +02:00
Leendert de Borst
daf25fcc12 Updated instructions (#269) 2024-10-04 14:33:41 +02:00
Leendert de Borst
fc8d365c49 Improve webauthn error reporting, add support for Yubikey (#269) 2024-10-04 14:11:48 +02:00
Leendert de Borst
e7e66a6285 Rewrite webauthn implementation to use PRF (#269) 2024-10-04 12:31:37 +02:00
Leendert de Borst
ad26450d8b Refactor webauthn call structure (#269) 2024-10-03 22:17:32 +02:00
Leendert de Borst
fcf0fb8605 Merge pull request #270 from lanedirt/269-add-support-for-persisting-encryption-key
Add support for persisting encryption key
2024-10-03 00:53:41 +02:00
Leendert de Borst
da2efa7e8a Add rough working webauthn version (#269) 2024-10-03 00:53:06 +02:00
Leendert de Borst
4018d38148 Add webauthn scaffolding (#269) 2024-10-02 20:23:21 +02:00
Leendert de Borst
6affa67561 Update Login.razor (#265) 2024-09-30 11:49:27 +02:00
dependabot[bot]
0a543cec42 Bump Microsoft.IdentityModel.JsonWebTokens and Microsoft.IdentityModel.Tokens
Bumps [Microsoft.IdentityModel.JsonWebTokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet) and [Microsoft.IdentityModel.Tokens](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet). These dependencies needed to be updated together.

Updates `Microsoft.IdentityModel.JsonWebTokens` from 8.0.1 to 8.1.0
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.0.1...8.1.0)

Updates `Microsoft.IdentityModel.Tokens` from 8.0.1 to 8.1.0
- [Release notes](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/releases)
- [Changelog](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/blob/dev/CHANGELOG.md)
- [Commits](https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/compare/8.0.1...8.1.0)

---
updated-dependencies:
- dependency-name: Microsoft.IdentityModel.JsonWebTokens
  dependency-type: direct:production
  update-type: version-update:semver-minor
- dependency-name: Microsoft.IdentityModel.Tokens
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-25 07:49:16 +02:00
Leendert de Borst
179faac0a0 Update README.md 2024-09-24 23:10:39 +02:00
Leendert de Borst
4cfacc5012 Merge pull request #259 from lanedirt/233-general-refactoring-and-cleanup
General refactoring, update folder structure, code cleanup
2024-09-24 23:06:11 +02:00
Leendert de Borst
a407a23101 Implement ILogger for all client side console logging calls (#233) 2024-09-24 23:05:25 +02:00
Leendert de Borst
df33d4abd4 Replace console.writeline with ILogger implementation for dbservice (#233) 2024-09-24 18:38:34 +02:00
dependabot[bot]
28a5939f62 Bump Swashbuckle.AspNetCore from 6.7.3 to 6.8.0
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.7.3 to 6.8.0.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.7.3...v6.8.0)

---
updated-dependencies:
- dependency-name: Swashbuckle.AspNetCore
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-24 08:16:45 +02:00
Leendert de Borst
467b25104e Update dotnet-e2e-client-tests.yml (#233) 2024-09-23 18:50:10 +02:00
Leendert de Borst
8ee3cd0396 Merge main into current branch (#233) 2024-09-23 18:37:54 +02:00
Leendert de Borst
d471a61fbf Restructure tests into their own shards to speed up parallel execution (#233) 2024-09-23 18:35:48 +02:00
dependabot[bot]
df0413038e Bump HtmlAgilityPack from 1.11.65 to 1.11.66
Bumps [HtmlAgilityPack](https://github.com/zzzprojects/html-agility-pack) from 1.11.65 to 1.11.66.
- [Release notes](https://github.com/zzzprojects/html-agility-pack/releases)
- [Commits](https://github.com/zzzprojects/html-agility-pack/compare/v1.11.65...v1.11.66)

---
updated-dependencies:
- dependency-name: HtmlAgilityPack
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-23 18:07:04 +02:00
Leendert de Borst
9180d600a6 Separate e2e tests to run in separate actions to speed up execution (#233) 2024-09-23 18:06:43 +02:00
Leendert de Borst
8bea3d9336 Refactor (#233) 2024-09-22 22:08:59 +02:00
Leendert de Borst
1f88d5678b Refactor E2E registration part (#233) 2024-09-22 21:35:46 +02:00
Leendert de Borst
061e72210f Update null! usage to required or default empty value (#233) 2024-09-21 22:19:01 +02:00
Leendert de Borst
ef8fa091b9 Update LoginBase.cs (#233) 2024-09-20 18:35:40 +02:00
Leendert de Borst
21e8171355 Refactor (#233) 2024-09-20 18:07:26 +02:00
Leendert de Borst
5509be5281 Update Dockerfile (#233) 2024-09-20 17:03:10 +02:00
Leendert de Borst
6c7645ea3d Enable treat warning as error for release (#233) 2024-09-20 17:02:51 +02:00
Leendert de Borst
4bd3b5cb29 Refactor project folder structure (#233) 2024-09-20 16:19:06 +02:00
Leendert de Borst
2e08de3546 Move shared projects (#233) 2024-09-20 15:17:38 +02:00
Leendert de Borst
956338f61f Refactor generator projects (#233) 2024-09-20 14:56:14 +02:00
Leendert de Borst
9f87861f88 Add default service URL check to update (#233) 2024-09-20 11:44:27 +02:00
Leendert de Borst
db6357a845 Tweak lock/unlock flow (#233) 2024-09-19 22:21:23 +02:00
Leendert de Borst
adc82278b2 Merge pull request #258 from lanedirt/257-move-user-menu-items-to-mobile-menu-for-mobile-screens 2024-09-19 08:49:48 +02:00
Leendert de Borst
22945f6066 Tweak top menu, add dblock functionality (#257) 2024-09-19 00:14:00 +02:00
Leendert de Borst
9646552e46 Combine user menu to mobile menu (#267) 2024-09-18 23:27:26 +02:00
Leendert de Borst
2ffc6c1f52 Update timeout from 15sec to 20sec to reduce errors in GitHub Actions runs (#254) 2024-09-18 00:12:26 +02:00
Leendert de Borst
9338384649 Set remember me checkbox to enabled by default (#254) 2024-09-18 00:12:26 +02:00
Leendert de Borst
b6cfc03b01 Add revision retention rule to keep last 10 revisions (#254) 2024-09-18 00:12:26 +02:00
Leendert de Borst
997bd8ce44 Add revision number to admin and default migration (#254) 2024-09-18 00:12:26 +02:00
Leendert de Borst
e8b0544735 Merge pull request #252 from lanedirt/186-implement-vault-synchronize-support
Implement vault synchronize/merge support
2024-09-17 22:57:43 +02:00
Leendert de Borst
f1ff5c1d54 Update AttachmentUploader.razor (#186) 2024-09-17 22:56:54 +02:00
Leendert de Borst
90471c362f Refactor (#186) 2024-09-17 22:23:50 +02:00
Leendert de Borst
201f521d60 Add soft delete and cleanup mechanism for merge (#186) 2024-09-17 22:13:12 +02:00
Leendert de Borst
cb25be8962 Add support for overriding Argon2Id settings in client for improved E2E test speed (#186) 2024-09-17 16:57:02 +02:00
Leendert de Borst
a1291b1951 Add E2E test for merge failed situation (#186) 2024-09-17 15:46:21 +02:00
Leendert de Borst
eed66e3c48 Fix db upgrade test (#186) 2024-09-17 14:47:07 +02:00
Leendert de Borst
9544aab2ce Update E2E timeout (#186) 2024-09-17 10:21:21 +02:00
Leendert de Borst
809507d9c3 Mutate UpdatedAt during credential save for all inner objects (#186) 2024-09-17 02:16:53 +02:00
Leendert de Borst
b3e88f9d99 Fix E2E test bug caused by unlock page redirect check (#186) 2024-09-17 02:13:45 +02:00
Leendert de Borst
eda6ad0e44 Add todos (#186) 2024-09-17 01:47:00 +02:00
Leendert de Borst
86eacb0ad8 Add second merge test (#186) 2024-09-17 00:57:37 +02:00
Leendert de Borst
06830baf3d Refactor merge strategy: require client merge before save (#186) 2024-09-17 00:05:15 +02:00
Leendert de Borst
e82faeba40 Add working merge functionality (#186) 2024-09-16 21:09:21 +02:00
Leendert de Borst
f2cf7b123d Add vault merge API endpoint and client side scaffolding (#186) 2024-09-16 20:26:20 +02:00
Leendert de Borst
e499fa9ace Add merge required detection to webapi vault load (#186) 2024-09-16 18:12:11 +02:00
Leendert de Borst
d6e73251d8 Check remember me by default on login (#186) 2024-09-16 16:28:20 +02:00
Leendert de Borst
7ee2984459 Add db sync test (#186) 2024-09-16 16:16:08 +02:00
Leendert de Borst
5b89f163de Add revision number vault retention policy and tests (#186) 2024-09-16 14:11:17 +02:00
Leendert de Borst
291b441d3f Add revision number to vault table (#186) 2024-09-16 13:04:46 +02:00
Leendert de Borst
89751633f1 Add sync support to client database (#186) 2024-09-16 13:04:25 +02:00
Leendert de Borst
50464886f3 Fix delay in navigating to admin log pages (#250) 2024-09-15 16:44:47 +02:00
Leendert de Borst
9d0fc082c0 Refactor (#192) 2024-09-14 21:22:23 +02:00
Leendert de Borst
c85bf5cebd Optimize refresh token logic, add IP address and integrate remember me option (#244) 2024-09-14 21:22:23 +02:00
Leendert de Borst
4f49f343c9 Update release.yml 2024-09-14 21:13:36 +02:00
Leendert de Borst
226b5bfaff Update admin mobile menu content (#244) 2024-09-13 21:09:29 +02:00
dependabot[bot]
73013306d6 Bump Microsoft.Playwright.NUnit from 1.46.0 to 1.47.0
Bumps [Microsoft.Playwright.NUnit](https://github.com/microsoft/playwright-dotnet) from 1.46.0 to 1.47.0.
- [Release notes](https://github.com/microsoft/playwright-dotnet/releases)
- [Commits](https://github.com/microsoft/playwright-dotnet/compare/v1.46.0...v1.47.0)

---
updated-dependencies:
- dependency-name: Microsoft.Playwright.NUnit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-13 16:49:59 +02:00
Leendert de Borst
0b7c641e32 Fix mobile menu open/close (#244) 2024-09-13 16:49:41 +02:00
Leendert de Borst
b7ab70e3de Add PWA basic structure (#202) 2024-09-12 23:05:32 +02:00
Leendert de Borst
f09c27eefa Refactor encryption.cs (#46) 2024-09-11 22:56:36 +02:00
Leendert de Borst
0f4482487b Refactor vault retention manager logic (#46) 2024-09-11 22:56:36 +02:00
Leendert de Borst
edc537316f Change default argon2id settings, persist settings to vault table (#46) 2024-09-11 22:56:36 +02:00
Leendert de Borst
4667ff64e1 Merge pull request #241 from lanedirt/240-improve-playwright-stability
Update Playwright stability
2024-09-10 23:57:57 +02:00
Leendert de Borst
d3d6dc56b8 Remove semaphore as timer with cancellation token prevents race conditions (#240) 2024-09-10 23:48:06 +02:00
Leendert de Borst
b5525f137a Update instructions (#240) 2024-09-10 23:47:21 +02:00
Leendert de Borst
5c619d9553 Fix race condition in E2E tests caused by worker status razor component (#240) 2024-09-10 23:35:10 +02:00
Leendert de Borst
693d419bd9 Update github action workflows (#240) 2024-09-10 22:12:24 +02:00
Leendert de Borst
9bccaba360 Add docs for running github actions locally to aid in debugging (#240) 2024-09-10 20:52:24 +02:00
Leendert de Borst
c4e82205b6 Update Playwright stability (#240) 2024-09-07 01:00:04 +02:00
Leendert de Borst
ef9c9e690f Set parallelism to max 1 for all tests (#125) 2024-09-07 00:14:12 +02:00
Leendert de Borst
a4cc75a3aa Set admin test parallelism to 2 (#125) 2024-09-07 00:14:12 +02:00
Leendert de Borst
633cef3450 Add tweaks to tests for improved stability (#125) 2024-09-07 00:14:12 +02:00
Leendert de Borst
c7af544e25 Refactor logout in tests (#125) 2024-09-07 00:14:12 +02:00
Leendert de Borst
43ae4625dd Improve text and tests (#239) 2024-09-07 00:14:12 +02:00
Leendert de Borst
a53deeeebf Add forgot password screen to client (#125) 2024-09-07 00:14:12 +02:00
Leendert de Borst
f84f063155 Add additional vault metadata (#168) 2024-09-06 14:59:03 +02:00
Leendert de Borst
7f411db4dd Merge pull request #238 from lanedirt/232-add-loading-animation-to-logout-screen
Add loading icon to logout to improve UX
2024-09-06 14:56:33 +02:00
Leendert de Borst
f5ae307fba Add loading icon to logout to improve UX (#232) 2024-09-06 14:56:06 +02:00
Leendert de Borst
f0989aa2d7 Merge pull request #234 from lanedirt/dependabot/nuget/main/Microsoft.NET.Test.Sdk-17.11.1
Bump Microsoft.NET.Test.Sdk from 17.11.0 to 17.11.1
2024-09-06 14:01:53 +02:00
dependabot[bot]
d8ea3fe73c Bump Microsoft.NET.Test.Sdk from 17.11.0 to 17.11.1
Bumps [Microsoft.NET.Test.Sdk](https://github.com/microsoft/vstest) from 17.11.0 to 17.11.1.
- [Release notes](https://github.com/microsoft/vstest/releases)
- [Changelog](https://github.com/microsoft/vstest/blob/main/docs/releases.md)
- [Commits](https://github.com/microsoft/vstest/compare/v17.11.0...v17.11.1)

---
updated-dependencies:
- dependency-name: Microsoft.NET.Test.Sdk
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-06 01:34:00 +00:00
Leendert de Borst
a1c1e86059 Merge pull request #231 from lanedirt/230-auth-log-shows-wrong-ip-address-for-success-entries
Fix bug in auth log IP address
2024-09-02 23:38:43 +02:00
Leendert de Borst
c86a1f84db Fix bug in auth log IP address (#230) 2024-09-02 23:27:42 +02:00
Leendert de Borst
92b5df1cc8 Merge pull request #229 from lanedirt/200-implement-client-password-change-feature
Implement client password change feature
2024-09-02 23:20:37 +02:00
Leendert de Borst
3e7826607f Update DbUpgradeTest after unlock page change (#200) 2024-09-02 23:08:36 +02:00
Leendert de Borst
06f09cdbf1 Add local encryption key validation to unlock page (#200) 2024-09-02 22:51:36 +02:00
Leendert de Borst
81ec09a2ed Fix todos (#200) 2024-09-02 22:24:19 +02:00
Leendert de Borst
7977cd7394 Add admin restore user vault to previous version (#200) 2024-09-02 21:29:18 +02:00
Leendert de Borst
71ad07fad0 Add password change E2E test (#200) 2024-09-02 21:04:33 +02:00
Leendert de Borst
77de70ba82 Update tests (#200) 2024-09-02 20:41:40 +02:00
Leendert de Borst
b97b2163d5 Remove SRP columns from AliasVaultUsers table (#200) 2024-09-02 19:35:57 +02:00
Leendert de Borst
b2aed24d8a Refactored change password to change pass and upload new vault in one atomic webapi operation (#200) 2024-09-02 19:21:18 +02:00
Leendert de Borst
6e6f24417a Move SRP salt and verifier to vaults table (#200) 2024-09-02 17:55:29 +02:00
Leendert de Borst
725efcfa91 Merge pull request #226 from lanedirt/dependabot/nuget/main/NUnit-4.2.2
Bump NUnit from 3.14.0 to 4.2.2
2024-09-02 17:45:34 +02:00
Leendert de Borst
71c326bc55 Add password change functionality (#200) 2024-09-02 14:47:11 +02:00
Leendert de Borst
4b1feca11d Set misc versions back to their correct versions after merge conflict (#226) 2024-09-02 10:48:24 +02:00
Leendert de Borst
02f9571b8b Update NUnit version to 4.2.2. for all test projects (#226) 2024-09-02 10:44:25 +02:00
Leendert de Borst
9e3b08c50d Merge pull request #227 from lanedirt/dependabot/nuget/main/Microsoft.AspNetCore.Components.WebAssembly.DevServer-8.0.8
Bump Microsoft.AspNetCore.Components.WebAssembly.DevServer from 8.0.7 to 8.0.8
2024-09-02 10:34:35 +02:00
Leendert de Borst
84ac36b1e2 Merge pull request #225 from lanedirt/dependabot/nuget/main/Microsoft.AspNetCore.Mvc.Testing-8.0.8
Bump Microsoft.AspNetCore.Mvc.Testing from 8.0.7 to 8.0.8
2024-09-02 10:34:26 +02:00
Leendert de Borst
690547bbf2 Merge pull request #224 from lanedirt/dependabot/nuget/main/Microsoft.Playwright.NUnit-1.46.0
Bump Microsoft.Playwright.NUnit from 1.45.1 to 1.46.0
2024-09-02 10:34:21 +02:00
Leendert de Borst
8d00ee496f Merge pull request #223 from lanedirt/dependabot/nuget/main/Microsoft.EntityFrameworkCore-8.0.8
Bump Microsoft.EntityFrameworkCore from 8.0.7 to 8.0.8
2024-09-02 10:34:14 +02:00
dependabot[bot]
aea8cbf405 Bump Microsoft.AspNetCore.Components.WebAssembly.DevServer
Bumps [Microsoft.AspNetCore.Components.WebAssembly.DevServer](https://github.com/dotnet/aspnetcore) from 8.0.7 to 8.0.8.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.7...v8.0.8)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Components.WebAssembly.DevServer
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-02 01:44:38 +00:00
dependabot[bot]
0d3a2032a2 Bump NUnit from 3.14.0 to 4.2.2
Bumps [NUnit](https://github.com/nunit/nunit) from 3.14.0 to 4.2.2.
- [Release notes](https://github.com/nunit/nunit/releases)
- [Changelog](https://github.com/nunit/nunit/blob/main/CHANGES.md)
- [Commits](https://github.com/nunit/nunit/compare/v3.14.0...4.2.2)

---
updated-dependencies:
- dependency-name: NUnit
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-02 01:44:08 +00:00
dependabot[bot]
d619976b10 Bump Microsoft.AspNetCore.Mvc.Testing from 8.0.7 to 8.0.8
Bumps [Microsoft.AspNetCore.Mvc.Testing](https://github.com/dotnet/aspnetcore) from 8.0.7 to 8.0.8.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.7...v8.0.8)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Mvc.Testing
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-02 01:43:25 +00:00
dependabot[bot]
72034391fb Bump Microsoft.Playwright.NUnit from 1.45.1 to 1.46.0
Bumps [Microsoft.Playwright.NUnit](https://github.com/microsoft/playwright-dotnet) from 1.45.1 to 1.46.0.
- [Release notes](https://github.com/microsoft/playwright-dotnet/releases)
- [Commits](https://github.com/microsoft/playwright-dotnet/compare/v1.45.1...v1.46.0)

---
updated-dependencies:
- dependency-name: Microsoft.Playwright.NUnit
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-02 01:42:45 +00:00
dependabot[bot]
5cda059a91 Bump Microsoft.EntityFrameworkCore from 8.0.7 to 8.0.8
Bumps [Microsoft.EntityFrameworkCore](https://github.com/dotnet/efcore) from 8.0.7 to 8.0.8.
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v8.0.7...v8.0.8)

---
updated-dependencies:
- dependency-name: Microsoft.EntityFrameworkCore
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-02 01:42:04 +00:00
Leendert de Borst
3109135a17 Merge pull request #222 from lanedirt/180-add-log-truncate-option-to-admin-project 2024-09-01 19:58:09 +02:00
Leendert de Borst
eca61933bf Add log truncate buttons to admin (#180) 2024-09-01 17:31:53 +02:00
Leendert de Borst
df72068e5c Merge pull request #213 from lanedirt/dependabot/nuget/main/Microsoft.NET.Test.Sdk-17.11.0
Bump Microsoft.NET.Test.Sdk from 17.8.0 to 17.11.0
2024-09-01 15:54:20 +02:00
Leendert de Borst
f093958833 Update Microsoft.NET.Test.Sdk to latest version for all test projects (#213) 2024-09-01 15:47:13 +02:00
Leendert de Borst
d98ac5e61d Merge pull request #219 from lanedirt/dependabot/nuget/main/multi-6114d871cd
Bump Microsoft.AspNetCore.Components.WebAssembly and Microsoft.AspNetCore.Components.Web
2024-09-01 15:46:17 +02:00
Leendert de Borst
7a730ac944 Merge pull request #208 from lanedirt/dependabot/nuget/main/NUnit.Analyzers-4.3.0
Bump NUnit.Analyzers from 3.9.0 to 4.3.0
2024-09-01 15:46:09 +02:00
Leendert de Borst
a99e370b1c Merge pull request #218 from lanedirt/217-ignore-empty-fields-during-encryptiondecryption
Prevent error when attempting to encrypt/decrypt empty string (#217)
2024-09-01 15:42:01 +02:00
dependabot[bot]
94ad6e9ea0 Bump Microsoft.AspNetCore.Components.WebAssembly and Microsoft.AspNetCore.Components.Web
Bumps [Microsoft.AspNetCore.Components.WebAssembly](https://github.com/dotnet/aspnetcore) and [Microsoft.AspNetCore.Components.Web](https://github.com/dotnet/aspnetcore). These dependencies needed to be updated together.

Updates `Microsoft.AspNetCore.Components.WebAssembly` from 8.0.7 to 8.0.8
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.7...v8.0.8)

Updates `Microsoft.AspNetCore.Components.Web` from 8.0.7 to 8.0.8
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.7...v8.0.8)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Components.WebAssembly
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.AspNetCore.Components.Web
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 13:33:12 +00:00
Leendert de Borst
eaec5447f5 Update NUnitAnalyzers in test projects (#208) 2024-09-01 15:33:01 +02:00
Leendert de Borst
c3aee4df8f Merge pull request #211 from lanedirt/dependabot/nuget/main/Swashbuckle.AspNetCore-6.7.3
Bump Swashbuckle.AspNetCore from 6.7.1 to 6.7.3
2024-09-01 15:30:55 +02:00
Leendert de Borst
27b0820906 Merge pull request #210 from lanedirt/dependabot/nuget/main/coverlet.collector-6.0.2
Bump coverlet.collector from 6.0.0 to 6.0.2
2024-09-01 15:30:47 +02:00
Leendert de Borst
1330e78169 Merge pull request #215 from lanedirt/dependabot/nuget/main/multi-7a460b1692
Bump Microsoft.EntityFrameworkCore.Sqlite and Microsoft.EntityFrameworkCore
2024-09-01 15:29:46 +02:00
Leendert de Borst
739c54d821 Merge pull request #214 from lanedirt/dependabot/nuget/main/multi-d0f7e4fcac
Bump Microsoft.AspNetCore.Components.WebAssembly.Authentication, Microsoft.AspNetCore.Authorization and Microsoft.AspNetCore.Components.Web
2024-09-01 15:29:38 +02:00
Leendert de Borst
0e8e5bf2ad Merge pull request #212 from lanedirt/dependabot/nuget/main/Microsoft.AspNetCore.Components.WebAssembly.Server-8.0.8
Bump Microsoft.AspNetCore.Components.WebAssembly.Server from 8.0.7 to 8.0.8
2024-09-01 15:29:25 +02:00
Leendert de Borst
f235e72f01 Merge pull request #207 from lanedirt/dependabot/nuget/main/HtmlAgilityPack-1.11.65
Bump HtmlAgilityPack from 1.11.61 to 1.11.65
2024-09-01 15:28:55 +02:00
Leendert de Borst
9b250bf83f Prevent error when attempting to encrypt/decrypt empty string (#217) 2024-09-01 15:20:49 +02:00
dependabot[bot]
138ffcb7a6 Bump Microsoft.EntityFrameworkCore.Sqlite and Microsoft.EntityFrameworkCore
Bumps [Microsoft.EntityFrameworkCore.Sqlite](https://github.com/dotnet/efcore) and [Microsoft.EntityFrameworkCore](https://github.com/dotnet/efcore). These dependencies needed to be updated together.

Updates `Microsoft.EntityFrameworkCore.Sqlite` from 8.0.7 to 8.0.8
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v8.0.7...v8.0.8)

Updates `Microsoft.EntityFrameworkCore` from 8.0.7 to 8.0.8
- [Release notes](https://github.com/dotnet/efcore/releases)
- [Commits](https://github.com/dotnet/efcore/compare/v8.0.7...v8.0.8)

---
updated-dependencies:
- dependency-name: Microsoft.EntityFrameworkCore.Sqlite
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.EntityFrameworkCore
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 13:04:53 +00:00
dependabot[bot]
7da152a412 Bump Microsoft.AspNetCore.Components.WebAssembly.Authentication, Microsoft.AspNetCore.Authorization and Microsoft.AspNetCore.Components.Web
Bumps [Microsoft.AspNetCore.Components.WebAssembly.Authentication](https://github.com/dotnet/aspnetcore), [Microsoft.AspNetCore.Authorization](https://github.com/dotnet/aspnetcore) and [Microsoft.AspNetCore.Components.Web](https://github.com/dotnet/aspnetcore). These dependencies needed to be updated together.

Updates `Microsoft.AspNetCore.Components.WebAssembly.Authentication` from 8.0.7 to 8.0.8
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.7...v8.0.8)

Updates `Microsoft.AspNetCore.Authorization` from 8.0.7 to 8.0.8
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.7...v8.0.8)

Updates `Microsoft.AspNetCore.Components.Web` from 8.0.7 to 8.0.8
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.7...v8.0.8)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Components.WebAssembly.Authentication
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.AspNetCore.Authorization
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: Microsoft.AspNetCore.Components.Web
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 13:04:32 +00:00
dependabot[bot]
ec4e2d2c80 Bump Microsoft.NET.Test.Sdk from 17.8.0 to 17.11.0
Bumps [Microsoft.NET.Test.Sdk](https://github.com/microsoft/vstest) from 17.8.0 to 17.11.0.
- [Release notes](https://github.com/microsoft/vstest/releases)
- [Changelog](https://github.com/microsoft/vstest/blob/main/docs/releases.md)
- [Commits](https://github.com/microsoft/vstest/compare/v17.8.0...v17.11.0)

---
updated-dependencies:
- dependency-name: Microsoft.NET.Test.Sdk
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 13:04:07 +00:00
dependabot[bot]
984d8512e9 Bump Microsoft.AspNetCore.Components.WebAssembly.Server
Bumps [Microsoft.AspNetCore.Components.WebAssembly.Server](https://github.com/dotnet/aspnetcore) from 8.0.7 to 8.0.8.
- [Release notes](https://github.com/dotnet/aspnetcore/releases)
- [Changelog](https://github.com/dotnet/aspnetcore/blob/main/docs/ReleasePlanning.md)
- [Commits](https://github.com/dotnet/aspnetcore/compare/v8.0.7...v8.0.8)

---
updated-dependencies:
- dependency-name: Microsoft.AspNetCore.Components.WebAssembly.Server
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 13:03:23 +00:00
dependabot[bot]
e2e0b81564 Bump Swashbuckle.AspNetCore from 6.7.1 to 6.7.3
Bumps [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore) from 6.7.1 to 6.7.3.
- [Release notes](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/releases)
- [Commits](https://github.com/domaindrivendev/Swashbuckle.AspNetCore/compare/v6.7.1...v6.7.3)

---
updated-dependencies:
- dependency-name: Swashbuckle.AspNetCore
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 13:03:11 +00:00
dependabot[bot]
770ee60402 Bump coverlet.collector from 6.0.0 to 6.0.2
Bumps [coverlet.collector](https://github.com/coverlet-coverage/coverlet) from 6.0.0 to 6.0.2.
- [Release notes](https://github.com/coverlet-coverage/coverlet/releases)
- [Commits](https://github.com/coverlet-coverage/coverlet/compare/v6.0.0...v6.0.2)

---
updated-dependencies:
- dependency-name: coverlet.collector
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 13:02:45 +00:00
dependabot[bot]
2aa7d1ce60 Bump NUnit.Analyzers from 3.9.0 to 4.3.0
Bumps [NUnit.Analyzers](https://github.com/nunit/nunit.analyzers) from 3.9.0 to 4.3.0.
- [Release notes](https://github.com/nunit/nunit.analyzers/releases)
- [Changelog](https://github.com/nunit/nunit.analyzers/blob/master/CHANGES.md)
- [Commits](https://github.com/nunit/nunit.analyzers/compare/3.9.0...4.3.0)

---
updated-dependencies:
- dependency-name: NUnit.Analyzers
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 13:01:34 +00:00
dependabot[bot]
578dd9da87 Bump HtmlAgilityPack from 1.11.61 to 1.11.65
Bumps [HtmlAgilityPack](https://github.com/zzzprojects/html-agility-pack) from 1.11.61 to 1.11.65.
- [Release notes](https://github.com/zzzprojects/html-agility-pack/releases)
- [Commits](https://github.com/zzzprojects/html-agility-pack/compare/v1.11.61...v1.11.65)

---
updated-dependencies:
- dependency-name: HtmlAgilityPack
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 13:00:51 +00:00
Leendert de Borst
b129a75255 Merge pull request #206 from lanedirt/203-optimize-github-actions-with-retry-to-prevent-false-negatives
Optimize GitHub actions for stability (#203)
2024-09-01 14:58:45 +02:00
Leendert de Borst
7ec2594d7f Create dependabot.yml (#203) 2024-09-01 14:38:51 +02:00
Leendert de Borst
e1f729f2ed Add retry to GitHub actions, refactor (#203) 2024-09-01 14:38:43 +02:00
Leendert de Borst
e53d1931c5 Merge pull request #204 from lanedirt/185-check-gzipbrotli-compression-for-client-app
Add gzip compression for client app
2024-09-01 14:04:17 +02:00
Leendert de Borst
4373e6fa62 Separate cryptography project to server and client to reduce client WASM size (#185) 2024-09-01 13:52:53 +02:00
Leendert de Borst
5ecdf926b6 Add gzip compression to client nginx (#185) 2024-09-01 13:52:10 +02:00
Leendert de Borst
e47b109f9d Merge pull request #198 from lanedirt/188-add-email-anchor-tags-translation-to-open-in-new-tabs-instead-of-iframe
Fix email anchor tag target=blank conversion
2024-09-01 12:58:10 +02:00
Leendert de Borst
be244b2c68 Refactor (#188) 2024-09-01 12:46:26 +02:00
Leendert de Borst
155a3ccd0b Merge pull request #201 from lanedirt/199-add-auth-log-entry-for-registration-which-also-includes-sign-in-action
Add user registration log entry and include auth log E2E tests
2024-08-31 21:07:10 +02:00
Leendert de Borst
5a16495864 Add user registration log entry and include auth log E2E tests (#199) 2024-08-31 20:50:57 +02:00
Leendert de Borst
b0c74d3ce2 Merge branch 'main' into 188-add-email-anchor-tags-translation-to-open-in-new-tabs-instead-of-iframe 2024-08-31 19:18:59 +02:00
Leendert de Borst
46360e2f4a Merge pull request #197 from lanedirt/171-add-email-delete-option-in-client
Add email delete option in client
2024-08-31 19:18:18 +02:00
Leendert de Borst
f2378f8e7f Merge pull request #195 from lanedirt/184-first-time-loading-animation-does-not-wait-for-app-to-load-correctly
Fix client app loading screen delay
2024-08-31 19:12:58 +02:00
Leendert de Borst
ca6aa40850 Update EmailModal.razor (#171) 2024-08-31 19:09:07 +02:00
Leendert de Borst
b015e4a9d6 Move anchor tag conversion from api to client (#188) 2024-08-31 19:07:53 +02:00
Leendert de Borst
8dc4bcb06f Update E2E test for email delete button (#171) 2024-08-31 17:51:45 +02:00
Leendert de Borst
466c181ad1 Add email delete option to email modal (#184) 2024-08-31 17:26:12 +02:00
Leendert de Borst
cd4dc918cb Update index.template.html loading screen delay (#184) 2024-08-31 16:24:03 +02:00
Leendert de Borst
18cea13ddd Merge pull request #194 from lanedirt/80-add-vault-auth-attempt-logging-bugfix
Update admin menu links
2024-08-31 15:44:12 +02:00
Leendert de Borst
ab5795101f Update admin menu links (#80) 2024-08-31 15:43:55 +02:00
Leendert de Borst
600d7bcbda Merge pull request #193 from lanedirt/80-add-vault-auth-attempt-logging-bugfix
Update admin logs path as /logs folder doesn't work correctly due to …
2024-08-31 15:30:59 +02:00
Leendert de Borst
25b908e311 Update admin logs path as /logs folder doesn't work correctly due to .gitignore (#80) 2024-08-31 15:30:06 +02:00
Leendert de Borst
0269d584aa Merge pull request #191 from lanedirt/80-add-vault-auth-attempt-logging-and-auto-lockout-to-combat-brute-force 2024-08-30 22:38:57 +02:00
Leendert de Borst
072e63e98f Refactor and cleanup (#80) 2024-08-30 22:04:28 +02:00
Leendert de Borst
95949508ba Add E2E tests for account lockout for password, 2fa and recovery (#80) 2024-08-30 21:11:40 +02:00
Leendert de Borst
1564df342a Add admin e2e tests for password and 2fa lockout (#80) 2024-08-30 19:57:05 +02:00
Leendert de Borst
1b2a6029bb Update tests (#80) 2024-08-30 17:47:14 +02:00
Leendert de Borst
c131372e37 Update E2E test config (#80) 2024-08-30 17:38:59 +02:00
Leendert de Borst
b830d90ba4 Update Lockout.razor (#80) 2024-08-30 17:21:14 +02:00
Leendert de Borst
e6feafcb87 Add recent auth logs to client (#80) 2024-08-30 17:19:28 +02:00
Leendert de Borst
52e55e44f2 Add database service builder abstraction (#80) 2024-08-30 16:35:56 +02:00
Leendert de Borst
1945b15e2e Add active sessions component to client (#80) 2024-08-30 16:28:22 +02:00
Leendert de Borst
4f8ab5da28 Add new user sessions endpoint to webapi (#80) 2024-08-30 13:54:31 +02:00
Leendert de Borst
188b1cba94 Update AuthLoggingService.cs (#80) 2024-08-30 13:19:47 +02:00
Leendert de Borst
5da1021088 Add user refresh tokens table to admin user view and revoke option (#80) 2024-08-27 23:25:02 +02:00
Leendert de Borst
21ae755018 Add auth logging table and log methods to admin and api (#80) 2024-08-27 23:05:14 +02:00
Leendert de Borst
ca3e35e066 Merge pull request #182 from lanedirt/70-add-totp-authenticator-support-to-client
Add TOTP authenticator support to client
2024-08-26 16:30:02 +02:00
Leendert de Borst
7d6a5fa947 Update Security.razor (#70)
Update Login.razor (#70)
Code style refactor (#70)
Update JSON models to have required properties (#70)
2024-08-26 16:23:55 +02:00
Leendert de Borst
a9e41fa6b4 Refactor 2fa methods from AuthController to its own controller (#70) 2024-08-26 15:21:50 +02:00
Leendert de Borst
f6f33c2482 Add E2E test for 2-FA recovery codes (#70) 2024-08-26 14:31:43 +02:00
Leendert de Borst
9ef078bd57 Add recovery code support to client 2FA login flow (#70) 2024-08-26 12:36:15 +02:00
Leendert de Borst
329281cd53 Refactor two-factor auth setup in client (#70) 2024-08-24 18:24:24 +02:00
Leendert de Borst
1db9fa5a37 Add persistent 2FA warning to admin app if 2FA is not set (#70) 2024-08-23 19:29:03 +02:00
Leendert de Borst
8ba039ff25 Add admin option to disable 2FA for user (#70) 2024-08-23 19:12:25 +02:00
Leendert de Borst
0df0b2c3ff Add unittests for TotpGenerator logic (#70) 2024-08-23 18:25:51 +02:00
Leendert de Borst
e058990e31 Add E2E test for client two-factor auth setup (#70) 2024-08-23 18:20:54 +02:00
Leendert de Borst
f7865e5d9c Add working basic 2FA login flow to client (#70) 2024-08-23 17:44:28 +02:00
Leendert de Borst
7aeb34ec5f Update install.sh (#70) 2024-08-23 11:08:11 +02:00
Leendert de Borst
1f9400e811 Merge pull request #179 from lanedirt/130-make-dataprotection-work-in-both-local-development-and-when-running-through-docker
Make .NET dataprotection work in both local development and when running through docker
2024-08-21 15:03:37 -07:00
Leendert de Borst
a3e46f28a3 Refactor DataProtection setup to common extension class (#130) 2024-08-21 23:54:18 +02:00
Leendert de Borst
01f026a3d3 Add new required env vars to E2E test factories (#130) 2024-08-21 23:41:29 +02:00
Leendert de Borst
8824db222b Optimize settings to reduce irrelevant warnings in logs (#130) 2024-08-21 23:00:17 +02:00
Leendert de Borst
dce170cee1 Add certificate generation for DataProtection API for both local dev and Docker containers (#130) 2024-08-21 21:42:20 +02:00
Leendert de Borst
ef7a11e27a Update README.md (#130) 2024-08-20 18:06:15 +02:00
Leendert de Borst
75b22cfddf Merge pull request #176 from lanedirt/174-make-emailusername-on-login-case-insensitive
Change email to username for main user authentication
2024-08-19 14:41:41 -07:00
Leendert de Borst
65342a2a8d Change email to username for main user authentication (#174) 2024-08-19 23:33:50 +02:00
Leendert de Borst
18978b94be Merge pull request #173 from lanedirt/164-add-oobe-beginning-screen-if-user-does-not-have-any-credentials-yet
Out-of-box experience UX tweaks
2024-08-16 06:08:30 -07:00
Leendert de Borst
c989573565 Update Vault.razor (#164) 2024-08-16 14:57:21 +02:00
Leendert de Borst
67ce7da21a Refactor (#164) 2024-08-16 14:48:40 +02:00
Leendert de Borst
fb2972695a Update E2E tests (#164) 2024-08-16 14:35:18 +02:00
Leendert de Borst
2f47f81af8 Fix bug in email credential lookup query (#164) 2024-08-16 13:38:24 +02:00
Leendert de Borst
6d6ee8bf3f Add enter on form submit for AddEdit page, refactor service URL placeholder logic (#164) 2024-08-16 13:34:58 +02:00
Leendert de Borst
881eb58a35 Add focus tweaks to Credentials AddEdit page (#164) 2024-08-16 13:27:07 +02:00
Leendert de Borst
80bc7cd223 Add welcome page for new users for OOBE (#164) 2024-08-16 12:25:52 +02:00
Leendert de Borst
87f494fea8 Layout tweaks (#164) 2024-08-16 12:25:28 +02:00
Leendert de Borst
a24e533e4c Tweak settings page layout (#164) 2024-08-16 12:24:52 +02:00
Leendert de Borst
ebb8b27f85 Update DbStatusIndicator.razor (#164) 2024-08-16 12:24:40 +02:00
Leendert de Borst
41c210e75a Add minimum loading screen delay to blazor bootstrap to improve UX (#164) 2024-08-15 21:52:21 +02:00
Leendert de Borst
2a50a455d8 Merge pull request #170 from lanedirt/165-add-styled-wasm-loading-animation
Updated blazor loading animation to AliasVault style
2024-08-13 11:05:31 -07:00
Leendert de Borst
6896c4cd1d Updated blazor loading animation to AliasVault style (#165) 2024-08-13 19:05:15 +02:00
Leendert de Borst
9560572a40 Merge pull request #169 from lanedirt/144-update-client-side-validation-for-all-form-steps
Update client side validation for all form steps
2024-08-12 11:49:15 -07:00
Leendert de Borst
4dffb9c3c0 Change StartsWith overload (#144) 2024-08-12 20:39:12 +02:00
Leendert de Borst
b8cb3c4d78 Add username generate button, fix form validation bugs, tweak UI (#144) 2024-08-12 19:07:39 +02:00
Leendert de Borst
6f54b05d5a Update email style (#144) 2024-08-12 16:15:27 +02:00
Leendert de Borst
d051d69aea Merge pull request #166 from lanedirt/160-rework-credential-view-page-to-show-most-relevant-data-first
Add email page to browse through all received emails
2024-08-12 04:39:21 -07:00
Leendert de Borst
02f0c43cbd Code style refactor (#160) 2024-08-12 13:31:20 +02:00
Leendert de Borst
14cce42091 Add email page to browser through all received emails for all claimed email addresses(#160) 2024-08-12 13:20:20 +02:00
Leendert de Borst
a1c26cec04 Merge pull request #163 from lanedirt/158-add-global-search-bar
Add global search bar
2024-08-09 08:55:22 -07:00
Leendert de Borst
42fc1c018c Add E2E test for global search bar (#158) 2024-08-09 17:47:42 +02:00
Leendert de Borst
f3e740bab3 Add global search bar widget (#158) 2024-08-09 13:51:02 +02:00
Leendert de Borst
bbdf47d6f4 Merge pull request #162 from lanedirt/161-keyboard-shortcuts-stop-working-when-something-else-has-been-typed-before 2024-08-07 22:15:09 -07:00
Leendert de Borst
5faf93d6be Fix CredentialTest, replace wait text after breadcrumb change (#161) 2024-08-07 23:55:47 +02:00
Leendert de Borst
fa1573ee13 Update keyboardShortcuts.js, fix bug (#161) 2024-08-07 23:27:44 +02:00
Leendert de Borst
50f7866a0b Improve GlobalNotificationDisplay system (#161) 2024-08-07 23:25:25 +02:00
Leendert de Borst
7b1a1e893e Merge pull request #159 from lanedirt/142-design-new-client-datamodel-structure-for-credentialsaliases-with-simplified-user-flow
Add quick create new identity popup
2024-08-07 13:39:59 -07:00
Leendert de Borst
40afea3908 Fix parallel E2E tests race condition (#142) 2024-08-07 22:33:58 +02:00
Leendert de Borst
e1ae260fc5 Code style refactor (#142) 2024-08-07 22:28:46 +02:00
Leendert de Borst
c33399b91d Add E2E test for quick create widget (#142) 2024-08-07 22:24:34 +02:00
Leendert de Borst
f46202223a Fix tests (#142) 2024-08-07 22:01:37 +02:00
Leendert de Borst
0867573f2f Load specific JS via isolated modules, refactor CredentialService (#142) 2024-08-07 20:39:39 +02:00
Leendert de Borst
2becb3aa8f Refactor (#142) 2024-08-06 22:04:12 +02:00
Leendert de Borst
dc2f4dd040 Add quick create new identity popup (#142) 2024-08-06 20:29:48 +02:00
Leendert de Borst
2cf3c142da Merge pull request #157 from lanedirt/156-add-e2e-test-for-generating-identity-via-client-gui
Add E2E test for identity generation in client (#156)
2024-08-05 13:53:21 -07:00
Leendert de Borst
a8d84fd38a Update CredentialTest.cs (#156) 2024-08-05 22:43:03 +02:00
Leendert de Borst
4a207763cc Add E2E test for identity generation in client (#156) 2024-08-05 21:18:21 +02:00
Leendert de Borst
b1ef5c33db Merge pull request #155 from lanedirt/108-add-identity-generator-scaffolding-utility-project
Add identity generator utility project for EN and NL identities
2024-08-05 11:35:56 -07:00
Leendert de Borst
578532efdf Code style refactor (#108) 2024-08-05 20:21:48 +02:00
Leendert de Borst
95fb8baaaa Add nonbacktracking option to regexes (#108) 2024-08-05 20:20:28 +02:00
Leendert de Borst
73e432b2dc Refactor identity generation logic (#108) 2024-08-05 17:24:51 +02:00
Leendert de Borst
f43c3171b0 Add local dictionary based identity generation (#108) 2024-08-05 16:34:22 +02:00
885 changed files with 89827 additions and 7550 deletions

View File

@@ -22,4 +22,17 @@
**/secrets.dev.yaml
**/values.dev.yaml
LICENSE
README.md
README.md
# Exclude AliasVault data directories
database/
logs/
certificates/
# Exclude git directory
.git/
# Exclude development files
*.log
*.env
*.env.*

View File

@@ -1,4 +1,10 @@
API_URL=
HOSTNAME=
JWT_KEY=
DATA_PROTECTION_CERT_PASS=
ADMIN_PASSWORD_HASH=
ADMIN_PASSWORD_GENERATED=2024-01-01T00:00:00Z
PRIVATE_EMAIL_DOMAINS=
SMTP_TLS_ENABLED=false
LETSENCRYPT_ENABLED=false
POSTGRES_PASSWORD=
SUPPORT_EMAIL=

31
.gitattributes vendored
View File

@@ -1,2 +1,31 @@
# Auto detect text files and perform LF normalization
# Set default behavior to automatically normalize line endings
* text=auto
# Common files should always use LF (Unix-style) line endings
*.sh text eol=lf
*.cs text eol=lf
*.razor text eol=lf
*.css text eol=lf
*.html text eol=lf
*.js text eol=lf
*.json text eol=lf
*.xml text eol=lf
*.yml text eol=lf
*.yaml text eol=lf
# Docker files should use LF
Dockerfile text eol=lf
docker-compose*.yml text eol=lf
# Config files should use LF
*.conf text eol=lf
*.config text eol=lf
.env* text eol=lf
# Batch scripts should always use CRLF (Windows-style) line endings
*.bat text eol=crlf
*.cmd text eol=crlf
# Documentation should be normalized
*.md text
*.txt text

2
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,2 @@
# These are supported funding model platforms
buy_me_a_coffee: lanedirt

27
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,27 @@
---
name: Bug report
about: Report a bug or unexpected behavior.
title: "[BUG] "
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Additional context**
Add any other context about the problem here.

View File

@@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for AliasVault
title: '[Feature Request] '
labels: '⚡️ enhancement'
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

15
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,15 @@
## Description
- [ ] Bug fix
- [ ] Feature enhancement
- [ ] Documentation update
- [ ] Other (please describe):
## Related Issues
Fixes #[issue-number]
## Checklist
- [ ] Code adheres to project standards and guidelines.
- [ ] Documentation has been updated where applicable.
## Additional Information
Add any additional context, screenshots, or explanations here.

53
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,53 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file
version: 2
updates:
# Enable version updates for NuGet
- package-ecosystem: "nuget"
directory: "/"
target-branch: "main"
open-pull-requests-limit: 10
labels:
- "dependencies"
# Check for updates once a week
schedule:
day: "monday"
time: "09:00"
interval: "weekly"
# Ignore certain dependencies (optional)
# ignore:
# - dependency-name: "SomePackage"
# versions: ["4.x", "5.x"]
# Enable version updates for npm
- package-ecosystem: "npm"
# Look for `package.json` and `lock` files in the `root` directory
directory: "/"
# Check for updates once a week
schedule:
day: "monday"
time: "09:00"
interval: "weekly"
# Enable version updates for Docker
- package-ecosystem: "docker"
# Look for a `Dockerfile` in the `root` directory
directory: "/"
# Check for updates once a week
schedule:
day: "monday"
time: "09:00"
interval: "weekly"
# Enable version updates for Composer
- package-ecosystem: "composer"
# Look for a `Dockerfile` in the `root` directory
directory: "/"
# Check for updates once a week
schedule:
day: "monday"
time: "09:00"
interval: "weekly"

6
.github/release.yml vendored
View File

@@ -9,9 +9,9 @@ changelog:
labels:
- dependencies
- bug
- title: 🧩 Dependencies Updates
labels:
- dependencies
- title: 🐞 Bug Fixes
labels:
- bug
- title: 🧩 Dependencies Updates
labels:
- dependencies

View File

@@ -0,0 +1,164 @@
name: Browser Extension Build
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
workflow_dispatch:
jobs:
build-chrome-extension:
runs-on: ubuntu-latest
defaults:
run:
working-directory: browser-extension
steps:
- uses: actions/checkout@v4
- name: Get short SHA
id: vars
run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: browser-extension/package-lock.json
- name: Install dependencies
run: npm ci
- name: Build extension
run: npm run build:chrome
- name: Run tests
run: npm run test
- name: Run linting
run: npm run lint
- name: Zip Chrome Extension
run: npm run zip:chrome
- name: Unzip for artifact
run: |
mkdir -p dist/chrome-unpacked
unzip dist/aliasvault-browser-extension-*-chrome.zip -d dist/chrome-unpacked
- name: Upload dist artifact Chrome
uses: actions/upload-artifact@v4
with:
name: aliasvault-browser-extension-${{ github.event_name == 'release' && github.ref_name || (github.ref_name == 'main' && format('main-{0}', steps.vars.outputs.sha_short) || steps.vars.outputs.sha_short) }}-chrome
path: browser-extension/dist/chrome-unpacked
outputs:
sha_short: ${{ steps.vars.outputs.sha_short }}
build-firefox-extension:
runs-on: ubuntu-latest
defaults:
run:
working-directory: browser-extension
steps:
- uses: actions/checkout@v4
- name: Get short SHA
id: vars
run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: browser-extension/package-lock.json
- name: Install dependencies
run: npm ci
- name: Build extension
run: npm run build:firefox
- name: Run tests
run: npm run test
- name: Run linting
run: npm run lint
- name: Zip Firefox Extension
run: npm run zip:firefox
- name: Unzip for artifact
run: |
mkdir -p dist/firefox-unpacked
unzip dist/aliasvault-browser-extension-*-firefox.zip -d dist/firefox-unpacked
mkdir -p dist/sources-unpacked
unzip dist/aliasvault-browser-extension-*-sources.zip -d dist/sources-unpacked
- name: Upload dist artifact Firefox
uses: actions/upload-artifact@v4
with:
name: aliasvault-browser-extension-${{ github.event_name == 'release' && github.ref_name || (github.ref_name == 'main' && format('main-{0}', steps.vars.outputs.sha_short) || steps.vars.outputs.sha_short) }}-firefox
path: browser-extension/dist/firefox-unpacked
- name: Upload dist artifact Firefox sources
uses: actions/upload-artifact@v4
with:
name: aliasvault-browser-extension-${{ github.event_name == 'release' && github.ref_name || (github.ref_name == 'main' && format('main-{0}', steps.vars.outputs.sha_short) || steps.vars.outputs.sha_short) }}-sources
path: browser-extension/dist/sources-unpacked
outputs:
sha_short: ${{ steps.vars.outputs.sha_short }}
build-edge-extension:
runs-on: ubuntu-latest
defaults:
run:
working-directory: browser-extension
steps:
- uses: actions/checkout@v4
- name: Get short SHA
id: vars
run: echo "sha_short=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: browser-extension/package-lock.json
- name: Install dependencies
run: npm ci
- name: Build extension
run: npm run build:edge
- name: Run tests
run: npm run test
- name: Run linting
run: npm run lint
- name: Zip Edge Extension
run: npm run zip:edge
- name: Unzip for artifact
run: |
mkdir -p dist/edge-unpacked
unzip dist/aliasvault-browser-extension-*-edge.zip -d dist/edge-unpacked
- name: Upload dist artifact Edge
uses: actions/upload-artifact@v4
with:
name: aliasvault-browser-extension-${{ github.event_name == 'release' && github.ref_name || (github.ref_name == 'main' && format('main-{0}', steps.vars.outputs.sha_short) || steps.vars.outputs.sha_short) }}-edge
path: browser-extension/dist/edge-unpacked
outputs:
sha_short: ${{ steps.vars.outputs.sha_short }}

View File

@@ -9,61 +9,95 @@ on:
jobs:
test-docker:
runs-on: ubuntu-latest
services:
docker:
image: docker:26.0.0
options: --privileged
steps:
- uses: actions/checkout@v2
- name: Create .env file with custom SMTP port as port 25 is not allowed in GitHub Actions
run: |
echo "SMTP_PORT=2525" > .env
- name: Set permissions and run install.sh
run: |
chmod +x install.sh
./install.sh
- name: Set up Docker Compose
run: |
# Change the exposed host port of the SmtpService from 25 to 2525 because port 25 is not allowed in GitHub Actions
sed -i 's/25\:25/2525\:25/g' docker-compose.yml
docker compose -f docker-compose.yml up -d
- name: Wait for services to be up
run: |
# Wait for a few seconds
sleep 5
- name: Test if localhost:80 (WASM app) responds
run: |
# Test if the service on localhost:80 responds
http_code=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:80)
if [ "$http_code" -ne 200 ]; then
echo "Service did not respond with 200 OK. Check if client app is configured correctly."
exit 1
else
echo "Service responded with 200 OK"
fi
- name: Test if localhost:81 (WebApi) responds
run: |
# Test if the service on localhost:81 responds
http_code=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:81)
if [ "$http_code" -ne 200 ]; then
echo "Service did not respond with expected 200 OK. Check if WebApi is configured correctly."
exit 1
else
echo "Service responded with $http_code"
fi
- name: Test if localhost:2525 (SmtpService) responds
run: |
# Test if the service on localhost:2525 responds
./install.sh build --verbose
- name: Test if services are responding
uses: nick-fields/retry@v3
with:
timeout_minutes: 5
max_attempts: 5
command: |
sleep 15
# Array of endpoints to test
declare -A endpoints=(
["WASM"]="https://localhost:443"
["WebApi"]="https://localhost:443/api"
["Admin"]="https://localhost:443/admin/user/login"
)
failed=false
# Test HTTP endpoints
for name in "${!endpoints[@]}"; do
url="${endpoints[$name]}"
echo "Testing $name at $url"
# Store both response body and HTTP code
response=$(curl -k -s -w "\nHTTP_CODE=%{http_code}" "$url")
http_code=$(echo "$response" | grep "HTTP_CODE=" | cut -d= -f2)
body=$(echo "$response" | sed '$d') # Remove the last line (HTTP_CODE)
if [ "$http_code" -ne 200 ]; then
echo "❌ $name failed with HTTP $http_code at $url"
echo "Response body:"
echo "$body"
failed=true
else
echo "✅ $name responded with HTTP 200"
fi
done
# Test SMTP
echo "Testing SmtpService at localhost:2525"
if ! nc -zv localhost 2525 2>&1 | grep -q 'succeeded'; then
echo "SmtpService did not respond on port 2525. Check if the SmtpService service is running."
exit 1
echo "SmtpService failed to respond on port 2525"
failed=true
else
echo "SmtpService responded on port 2525"
echo "SmtpService responded successfully"
fi
- name: Test if localhost:8080 (Admin) responds
# Exit with error if any service failed
if [ "$failed" = true ]; then
# Get container logs
echo "Container Logs admin:"
docker compose logs admin
echo "Container Logs api:"
docker compose logs api
echo "Container Logs client:"
docker compose logs client
echo "Container Logs smtp:"
docker compose logs smtp
echo "Container Logs reverse-proxy:"
docker compose logs reverse-proxy
# Restart containers for next test in case of failure
docker compose restart
exit 1
fi
- name: Test install.sh reset-admin-password output
run: |
# Test if the service on localhost:8080 responds
http_code=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/user/login)
if [ "$http_code" -ne 200 ]; then
echo "Service did not respond with expected 200 OK. Check if admin app is configured correctly."
exit 1
else
echo "Service responded with $http_code"
fi
output=$(./install.sh reset-admin-password)
if ! echo "$output" | grep -E '.*New admin password: [A-Za-z0-9+/=]{8,}.*'; then
echo "Password reset output format is incorrect"
echo "Expected: 'New admin password: <at least 8 base64 chars>'"
echo "Actual: $output"
exit 1
fi

View File

@@ -0,0 +1,146 @@
# This workflow will test if pulling the latest Docker Compose containers from the registry works.
name: Docker Compose Pull
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
test-docker:
runs-on: ubuntu-latest
services:
docker:
image: docker:26.0.0
options: --privileged
steps:
- name: Get repository and branch information
id: repo-info
run: |
# Check if this is a PR from a fork
if [ "${{ github.event_name }}" = "pull_request" ] && [ "${{ github.event.pull_request.head.repo.fork }}" = "true" ]; then
# If PR is from a fork, use main branch from lanedirt/AliasVault
echo "REPO_FULL_NAME=lanedirt/AliasVault" >> $GITHUB_ENV
echo "BRANCH_NAME=main" >> $GITHUB_ENV
else
# Otherwise use the current repository and branch
echo "REPO_FULL_NAME=${GITHUB_REPOSITORY}" >> $GITHUB_ENV
echo "BRANCH_NAME=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_ENV
fi
- name: Download install script from current branch
run: |
INSTALL_SCRIPT_URL="https://raw.githubusercontent.com/$REPO_FULL_NAME/$BRANCH_NAME/install.sh"
echo "Downloading install script from: $INSTALL_SCRIPT_URL"
curl -f -o install.sh "$INSTALL_SCRIPT_URL"
- name: Create .env file with custom SMTP port as port 25 is not allowed in GitHub Actions
run: |
echo "SMTP_PORT=2525" > .env
- name: Set permissions and run install.sh
id: install_script
run: |
chmod +x install.sh
{
./install.sh install --verbose
exit_code=$?
if [ $exit_code -eq 2 ]; then
echo "Test skipped: Install script version is newer than latest release version. This is expected behavior if the install script is run on a branch that is ahead of the latest release."
echo "skip_remaining=true" >> $GITHUB_OUTPUT
true # Force success exit code
elif [ $exit_code -ne 0 ]; then
false # Propagate failure
fi
} || {
if [ $exit_code -eq 2 ]; then
echo "skip_remaining=true" >> $GITHUB_OUTPUT
true # Version mismatch is okay
else
exit $exit_code # Propagate other failures
fi
}
- name: Set up Docker Compose
if: ${{ !steps.install_script.outputs.skip_remaining }}
run: docker compose -f docker-compose.yml up -d
- name: Wait for services to be up
if: ${{ !steps.install_script.outputs.skip_remaining }}
run: |
# Wait for a few seconds
sleep 10
- name: Test if localhost:443 (WASM app) responds
if: ${{ !steps.install_script.outputs.skip_remaining }}
uses: nick-fields/retry@v3
with:
timeout_minutes: 2
max_attempts: 3
command: |
http_code=$(curl -k -s -o /dev/null -w "%{http_code}" https://localhost:443)
if [ "$http_code" -ne 200 ]; then
echo "Service did not respond with 200 OK. Check if client app and/or nginx is configured correctly."
exit 1
else
echo "Service responded with 200 OK"
fi
- name: Test if localhost:443/api (WebApi) responds
if: ${{ !steps.install_script.outputs.skip_remaining }}
uses: nick-fields/retry@v3
with:
timeout_minutes: 2
max_attempts: 3
command: |
http_code=$(curl -k -s -o /dev/null -w "%{http_code}" https://localhost:443/api)
if [ "$http_code" -ne 200 ]; then
echo "Service did not respond with expected 200 OK. Check if WebApi and/or nginx is configured correctly."
exit 1
else
echo "Service responded with $http_code"
fi
- name: Test if localhost:443/admin (Admin) responds
if: ${{ !steps.install_script.outputs.skip_remaining }}
uses: nick-fields/retry@v3
with:
timeout_minutes: 2
max_attempts: 3
command: |
http_code=$(curl -k -s -o /dev/null -w "%{http_code}" https://localhost:443/admin/user/login)
if [ "$http_code" -ne 200 ]; then
echo "Service did not respond with expected 200 OK. Check if admin app and/or nginx is configured correctly."
exit 1
else
echo "Service responded with $http_code"
fi
- name: Test if localhost:2525 (SmtpService) responds
if: ${{ !steps.install_script.outputs.skip_remaining }}
uses: nick-fields/retry@v3
with:
timeout_minutes: 2
max_attempts: 3
command: |
if ! nc -zv localhost 2525 2>&1 | grep -q 'succeeded'; then
echo "SmtpService did not respond on port 2525. Check if the SmtpService service is running."
exit 1
else
echo "SmtpService responded on port 2525"
fi
- name: Test install.sh reset-admin-password output
if: ${{ !steps.install_script.outputs.skip_remaining }}
run: |
output=$(./install.sh reset-admin-password)
if ! echo "$output" | grep -E '.*New admin password: [A-Za-z0-9+/=]{8,}.*'; then
echo "Password reset output format is incorrect. Expected format: 'New admin password: <at least 8 base64 chars>'"
echo "Actual output: $output"
exit 1
else
echo "Password reset output format is correct"
fi

View File

@@ -0,0 +1,46 @@
# This workflow will test if running the E2E Admin tests via Playwright CLI works.
name: .NET E2E Admin Tests (Playwright)
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
admin-tests:
timeout-minutes: 60
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 9.0.x
- name: Install dependencies
run: dotnet workload install wasm-tools
- name: Build
run: dotnet build
- name: Start dev database
run: ./install.sh configure-dev-db start
- name: Ensure browsers are installed
run: pwsh src/Tests/AliasVault.E2ETests/bin/Debug/net9.0/playwright.ps1 install --with-deps
- name: Run AdminTests with retry
uses: nick-fields/retry@v3
with:
timeout_minutes: 60
max_attempts: 3
command: dotnet test src/Tests/AliasVault.E2ETests --no-build --verbosity normal --filter "Category=AdminTests"
- name: Upload Test Results
if: always()
uses: actions/upload-artifact@v4
with:
name: admin-test-results
path: TestResults-Admin.xml

View File

@@ -0,0 +1,43 @@
# This workflow will test if running the E2E Client tests via Playwright CLI works.
name: .NET E2E Client Tests (Playwright with Sharding)
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
client-tests:
timeout-minutes: 60
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
shard: [1, 2, 3, 4, 5]
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 9.0.x
- name: Install dependencies
run: dotnet workload install wasm-tools
- name: Build
run: dotnet build
- name: Start dev database
run: ./install.sh configure-dev-db start
- name: Ensure browsers are installed
run: pwsh src/Tests/AliasVault.E2ETests/bin/Debug/net9.0/playwright.ps1 install --with-deps
- name: Run ClientTests with retry (Shard ${{ matrix.shard }})
uses: nick-fields/retry@v3
with:
timeout_minutes: 60
max_attempts: 3
command: dotnet test src/Tests/AliasVault.E2ETests --no-build --verbosity normal --filter "FullyQualifiedName~.E2ETests.Tests.Client.Shard${{ matrix.shard }}."

View File

@@ -1,48 +0,0 @@
# This workflow will build a .NET project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net
name: .NET E2E Tests (Playwright)
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
test:
timeout-minutes: 60
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
- name: Install dependencies
run: dotnet workload install wasm-tools
- name: Build
run: dotnet build
- name: Ensure browsers are installed
run: pwsh src/Tests/AliasVault.E2ETests/bin/Debug/net8.0/playwright.ps1 install --with-deps
- name: Run AdminTests with retry
uses: nick-invision/retry@v2
with:
timeout_minutes: 10
max_attempts: 3
command: dotnet test src/Tests/AliasVault.E2ETests --no-build --verbosity normal --filter "Category=AdminTests"
- name: Run ClientTests with retry
uses: nick-invision/retry@v2
with:
timeout_minutes: 10
max_attempts: 3
command: dotnet test src/Tests/AliasVault.E2ETests --no-build --verbosity normal --filter "Category=ClientTests"
- name: Run remaining tests with retry
uses: nick-invision/retry@v2
with:
timeout_minutes: 10
max_attempts: 3
command: dotnet test src/Tests/AliasVault.E2ETests --no-build --verbosity normal --filter "Category!=AdminTests&Category!=ClientTests"

View File

@@ -1,6 +1,4 @@
# This workflow will build a .NET project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net
# This workflow will test if running the integration tests works.
name: .NET Integration Tests
on:
@@ -15,13 +13,20 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
dotnet-version: 9.0.x
- name: Install dependencies
run: dotnet workload install wasm-tools
- name: Build
run: dotnet build
- name: Start dev database
run: ./install.sh configure-dev-db start
- name: Run integration tests
run: dotnet test src/Tests/AliasVault.IntegrationTests --no-build --verbosity normal

View File

@@ -1,6 +1,4 @@
# This workflow will build a .NET project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net
# This workflow will test if running the unit tests works.
name: .NET Unit Tests
on:
@@ -14,15 +12,20 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: 8.0.x
dotnet-version: 9.0.x
- name: Install dependencies
run: dotnet workload install wasm-tools
- name: Restore dependencies
run: dotnet restore
- name: Build
run: dotnet build --no-restore
- name: Run unittests
run: dotnet test src/Tests/AliasVault.UnitTests --no-build --verbosity normal

165
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,165 @@
name: Release
on:
release:
types: [published]
workflow_dispatch:
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
upload-install-script:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Upload install.sh to release
uses: softprops/action-gh-release@v2
with:
files: install.sh
token: ${{ secrets.GITHUB_TOKEN }}
package-browser-extensions:
runs-on: ubuntu-latest
defaults:
run:
working-directory: browser-extension
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
cache-dependency-path: browser-extension/package-lock.json
- name: Install dependencies
run: npm ci
- name: Zip extensions
run: |
npm run zip:chrome
npm run zip:firefox
npm run zip:edge
- name: Upload extensions to release
uses: softprops/action-gh-release@v2
with:
files: |
dist/aliasvault-browser-extension-*-chrome.zip
dist/aliasvault-browser-extension-*-firefox.zip
dist/aliasvault-browser-extension-*-edge.zip
dist/aliasvault-browser-extension-*-sources.zip
token: ${{ secrets.GITHUB_TOKEN }}
build-and-push-docker:
needs: [upload-install-script, package-browser-extensions]
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Convert repository name to lowercase
run: |
echo "REPO_LOWER=${GITHUB_REPOSITORY,,}" >>${GITHUB_ENV}
- name: Log in to the Container registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.REPO_LOWER }}
- name: Build and push Postgres image
uses: docker/build-push-action@v5
with:
context: .
file: src/Databases/AliasServerDb/Dockerfile
platforms: linux/amd64,linux/arm64/v8
push: true
tags: ${{ env.REGISTRY }}/${{ env.REPO_LOWER }}-postgres:latest,${{ env.REGISTRY }}/${{ env.REPO_LOWER }}-postgres:${{ github.ref_name }}
- name: Build and push API image
uses: docker/build-push-action@v5
with:
context: .
file: src/AliasVault.Api/Dockerfile
platforms: linux/amd64,linux/arm64/v8
push: true
tags: ${{ env.REGISTRY }}/${{ env.REPO_LOWER }}-api:latest,${{ env.REGISTRY }}/${{ env.REPO_LOWER }}-api:${{ github.ref_name }}
- name: Build and push Client image
uses: docker/build-push-action@v5
with:
context: .
file: src/AliasVault.Client/Dockerfile
platforms: linux/amd64,linux/arm64/v8
push: true
tags: ${{ env.REGISTRY }}/${{ env.REPO_LOWER }}-client:latest,${{ env.REGISTRY }}/${{ env.REPO_LOWER }}-client:${{ github.ref_name }}
- name: Build and push Admin image
uses: docker/build-push-action@v5
with:
context: .
file: src/AliasVault.Admin/Dockerfile
platforms: linux/amd64,linux/arm64/v8
push: true
tags: ${{ env.REGISTRY }}/${{ env.REPO_LOWER }}-admin:latest,${{ env.REGISTRY }}/${{ env.REPO_LOWER }}-admin:${{ github.ref_name }}
- name: Build and push Reverse Proxy image
uses: docker/build-push-action@v5
with:
context: .
file: Dockerfile
platforms: linux/amd64,linux/arm64/v8
push: true
tags: ${{ env.REGISTRY }}/${{ env.REPO_LOWER }}-reverse-proxy:latest,${{ env.REGISTRY }}/${{ env.REPO_LOWER }}-reverse-proxy:${{ github.ref_name }}
- name: Build and push SMTP image
uses: docker/build-push-action@v5
with:
context: .
file: src/Services/AliasVault.SmtpService/Dockerfile
platforms: linux/amd64,linux/arm64/v8
push: true
tags: ${{ env.REGISTRY }}/${{ env.REPO_LOWER }}-smtp:latest,${{ env.REGISTRY }}/${{ env.REPO_LOWER }}-smtp:${{ github.ref_name }}
- name: Build and push TaskRunner image
uses: docker/build-push-action@v5
with:
context: .
file: src/Services/AliasVault.TaskRunner/Dockerfile
platforms: linux/amd64,linux/arm64/v8
push: true
tags: ${{ env.REGISTRY }}/${{ env.REPO_LOWER }}-task-runner:latest,${{ env.REGISTRY }}/${{ env.REPO_LOWER }}-task-runner:${{ github.ref_name }}
- name: Build and push InstallCli image
uses: docker/build-push-action@v5
with:
context: .
file: src/Utilities/AliasVault.InstallCli/Dockerfile
platforms: linux/amd64,linux/arm64/v8
push: true
tags: ${{ env.REGISTRY }}/${{ env.REPO_LOWER }}-installcli:latest,${{ env.REGISTRY }}/${{ env.REPO_LOWER }}-installcli:${{ github.ref_name }}

View File

@@ -1,29 +1,46 @@
# This workflow will perform a SonarCloud code analysis on every push to the main branch or
# when a pull request is opened, synchronized, or reopened. The "pull_request_target" event is
# used to ensure that the analysis is done on the source branch of the pull request which has
# access to the SonarCloud token secret.
name: SonarCloud code analysis
on:
push:
branches:
- main
pull_request:
pull_request_target:
types: [opened, synchronize, reopened]
jobs:
build:
name: Build and analyze
runs-on: windows-latest
steps:
- name: Setup .NET
uses: actions/setup-dotnet@v3
with:
dotnet-version: '9.0.x'
- name: Install WASM workload
run: dotnet workload install wasm-tools
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: 17
distribution: 'zulu' # Alternative distribution options are available.
- uses: actions/checkout@v3
distribution: 'zulu'
- name: Checkout code of PR branch
uses: actions/checkout@v3
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
- name: Cache SonarCloud packages
uses: actions/cache@v3
with:
path: ~\sonar\cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
- name: Cache SonarCloud scanner
id: cache-sonar-scanner
uses: actions/cache@v3
@@ -31,19 +48,25 @@ jobs:
path: .\.sonar\scanner
key: ${{ runner.os }}-sonar-scanner
restore-keys: ${{ runner.os }}-sonar-scanner
- name: Install SonarCloud scanner
if: steps.cache-sonar-scanner.outputs.cache-hit != 'true'
shell: powershell
run: |
New-Item -Path .\.sonar\scanner -ItemType Directory
dotnet tool update dotnet-sonarscanner --tool-path .\.sonar\scanner
- name: Build and analyze
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
shell: powershell
run: |
.\.sonar\scanner\dotnet-sonarscanner begin /k:"lanedirt_AliasVault" /o:"lanedirt" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonarcloud.io" /d:sonar.cs.opencover.reportsPaths="**/coverage.opencover.xml" /d:sonar.coverage.exclusions="**Tests*.cs"
if ('${{ github.event_name }}' -eq 'pull_request_target') {
.\.sonar\scanner\dotnet-sonarscanner begin /k:"lanedirt_AliasVault" /o:"lanedirt" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.pullrequest.key=${{ github.event.pull_request.number }} /d:sonar.host.url="https://sonarcloud.io" /d:sonar.cs.opencover.reportsPaths="**/coverage.opencover.xml" /d:sonar.coverage.exclusions="**Tests*.cs" /d:sonar.exclusions="**/__tests__/test-forms/*.html"
} else {
.\.sonar\scanner\dotnet-sonarscanner begin /k:"lanedirt_AliasVault" /o:"lanedirt" /d:sonar.token="${{ secrets.SONAR_TOKEN }}" /d:sonar.host.url="https://sonarcloud.io" /d:sonar.cs.opencover.reportsPaths="**/coverage.opencover.xml" /d:sonar.coverage.exclusions="**Tests*.cs" /d:sonar.exclusions="**/__tests__/test-forms/*.html"
}
dotnet build
dotnet test -c Release /p:CollectCoverage=true /p:CoverletOutput=coverage /p:CoverletOutputFormat=opencover --filter 'FullyQualifiedName!~AliasVault.E2ETests'
.\.sonar\scanner\dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}"

44
.gitignore vendored
View File

@@ -9,6 +9,7 @@
*.user
*.userosscache
*.sln.docstates
*.code-workspace
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
@@ -268,9 +269,14 @@ ServiceFabricBackup/
# SQLite files
*.sqlite
*.sqlite.*
*.sqlite-shm
*.sqlite-wal
# SQL files
*.sql
*.sql.gz
# Business Intelligence projects
*.rdl.data
*.bim.layout
@@ -371,13 +377,49 @@ FodyWeavers.xsd
.idea
*.licenseheader
# AliasVault specific
# Junie JetBrains plugin
.junie
.output.txt
# Codebuddy Rider plugin
.codebuddy
# -------------------
# AliasVault specifics
# -------------------
# index.html is generated by the build process from index.template.html and therefore should be ignored
src/AliasVault.Client/wwwroot/index.html
# appsettings.Development.json is generated by the build process from appsettings.Development.template.json and therefore should be ignored
src/AliasVault.Client/wwwroot/appsettings.Development.json
# appsettings.Development.json is added manually if needed, it should not be committed.
src/Tests/AliasVault.E2ETests/appsettings.Development.json
# .env is generated by install.sh and therefore should be ignored
.env
# install.sh backup files are generated by install.sh self-update and therefore should be ignored
install.sh.backup
# Draw.io diagram temp files
*.drawio.*
# Certificates
certificates/**/*.crt
certificates/**/*.key
certificates/**/*.pfx
certificates/**/*.pem
certificates/letsencrypt/**
# Docs
docs/_site
docs/vendor
docs/.bundle
# Database files
database/postgres
database/postgres-dev
# Temp files
temp

4
.vscode/launch.json vendored
View File

@@ -2,10 +2,10 @@
"version": "0.2.0",
"configurations": [
{
"name": "C#: AliasVault.WebApp [http]",
"name": "C#: AliasVault.Client [http]",
"type": "dotnet",
"request": "launch",
"projectPath": "${workspaceFolder}/src/AliasVault.WebApp/AliasVault.WebApp.csproj",
"projectPath": "${workspaceFolder}/src/AliasVault.Client/AliasVault.Client.csproj",
"launchConfigurationId": "TargetFramework=;http"
},
{

47
.vscode/tasks.json vendored Normal file
View File

@@ -0,0 +1,47 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "Run and watch API",
"type": "shell",
"command": "dotnet watch",
"args": [],
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
},
"options": {
"cwd": "${workspaceFolder}/src/AliasVault.Api"
}
},
{
"label": "Run and watch Client",
"type": "shell",
"command": "dotnet watch",
"args": [],
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
},
"options": {
"cwd": "${workspaceFolder}/src/AliasVault.Client"
}
},
{
"label": "Run and watch Admin",
"type": "shell",
"command": "dotnet watch",
"args": [],
"problemMatcher": [],
"group": {
"kind": "build",
"isDefault": true
},
"options": {
"cwd": "${workspaceFolder}/src/AliasVault.Admin"
}
}
]
}

128
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,128 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or
advances of any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or email
address, without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
contact@support.aliasvault.net.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

View File

@@ -1,89 +1,14 @@
# Contributing
This document is a work-in-progress and will be expanded as time goes on. If you have any questions feel free to open a issue on GitHub.
# Contributing to the source code
We welcome contributions to AliasVault. Please read the guidelines on the official AliasVault docs website on how to get your local development environment setup and the general contribution guidelines:
Note: all instructions below are based on MacOS. If you are using a different operating system, you may need to adjust the commands accordingly.
https://docs.aliasvault.net/misc/dev/
## Getting Started
In order to contribute to this project follow these instructions to setup your local environment:
> Tip: if the URL above is not available, the raw doc pages can also be found in the `docs` folder in this repository.
### 1. Clone the repository
## Contributing to the documentation
The docs are built using Jekyll and automatically deploy to GitHub Pages via GitHub Actions. You can build the docs locally by running `docker compose up` in in the `./docs` folder.
```bash
git clone https://github.com/lanedirt/AliasVault.git
cd AliasVault
```
### 2. Copy pre-commit hook script to .git/hooks directory
**Important**: All commits in this repo are required to contain a reference to a GitHub issue in the format of "your commit message (#123)" where "123" references the GitHub issue number.
The pre-commit hook script below will check the commit message before allowing the commit to proceed. If the commit message is invalid, the commit will be aborted.
```bash
# Copy the commit-msg hook script to the .git/hooks directory
cp .github/hooks/commit-msg .git/hooks/commit-msg
# Make the script executable
chmod +x .git/hooks/commit-msg
```
### 3. Install the latest version of .NET SDK 8
```bash
# Install .NET SDK 8
# On MacOS via brew:
brew install --cask dotnet-sdk
# On Windows via winget
winget install Microsoft.DotNet.SDK.8
```
### 4. Install dotnet CLI EF Tools
```bash
# Install dotnet EF tools globally
dotnet tool install --global dotnet-ef
# Include dotnet tools in your PATH
nano ~/.zshrc
# Add the following line to your .zshrc file
export PATH="$PATH:$HOME/.dotnet/tools"
# Start a new terminal and test that this command works:
dotnet ef
```
### 5. Run Tailwind CSS compiler while changing HTML files to update compiled CSS
```bash
npm run build:css
```
### 6. Install Playwright in order to locally run NUnit E2E (end-to-end) tests
```bash
# First install PowerShell for Mac (if you don't have it already)
brew install powershell/tap/powershell
# Install Playwright
dotnet tool install --global Microsoft.Playwright.CLI
# Run Playwright install script to download local browsers
# Note: make sure the E2E test project has been built at least once so the bin dir exists.
pwsh src/Tests/AliasVault.E2ETests/bin/Debug/net8.0/playwright.ps1 install
```
### 7. Create AliasVault.Client appsettings.Development.json
The WASM client app supports a development specific appsettings.json file. This appsettings file is optional but can override various options to make debugging easier.
The docs site is based on the open-source template called Just The Docs. Find more information about how this template works in the [official docs](https://just-the-docs.github.io/just-the-docs/).
1. Copy `wwwroot/appsettings.json` to `wwwroot/appsettings.Development.json`
Here is an example file with the various options explained:
```
{
"ApiUrl": "http://localhost:5092",
"PrivateEmailDomains": ["example.tld"],
"UseDebugEncryptionKey": "true"
}
```
- UseDebugEncryptionKey
- This setting will use a static encryption key so that if you login as a user you can refresh the page without needing to unlock the database again. This speeds up development when changing things in the WebApp WASM project. Note: the project needs to be run in "Development" mode for this setting to be used.
To make changes to the AliasVault documentation please make a PR that directly edits the `docs` markdown files in this repository.

15
Dockerfile Normal file
View File

@@ -0,0 +1,15 @@
FROM nginx:alpine
# Install OpenSSL
RUN apk add --no-cache openssl
# Copy configuration and entrypoint script
COPY nginx.conf /etc/nginx/nginx.conf
COPY entrypoint.sh /docker-entrypoint.sh
# Create SSL directory
RUN mkdir -p /etc/nginx/ssl && chmod 755 /etc/nginx/ssl \
&& chmod +x /docker-entrypoint.sh
EXPOSE 80 443
ENTRYPOINT ["/docker-entrypoint.sh"]

View File

@@ -1,13 +0,0 @@
# Encryption
This document describes the encryption used in AliasVault.
## SRP
The application uses the Secure Remote Password (SRP) protocol for authentication. The SRP protocol is a password-authenticated key agreement protocol. This means that the client and server can authenticate each other using a password, without sending the password over the network.
With the use of SRP the master password never leaves the client. The client sends a verifier to the server, which is a value derived from the master password. The server uses this verifier to authenticate the client. With this the server can authenticate the client without having ever seen the actual master password.
## Argon2id
The application uses the Argon2id key derivation function to derive a key from the master password. Argon2id is a memory-hard function, which makes it difficult to perform large-scale custom hardware attacks. This makes it a good choice for password hashing.
## AES
AES-256 IV is used to encrypt the data. The data is encrypted with a key derived from the master password using Argon2id. The Initialization Vector (IV) is generated randomly for each encryption.

181
README.md
View File

@@ -1,89 +1,148 @@
<div align="center">
# AliasVault: password & (email) alias manager [<img src="https://github.com/user-attachments/assets/933c8b45-a190-4df6-913e-b7c64ad9938b" width="100" align="right" alt="AliasVault">](https://github.com/lanedirt/AliasVault)
<h1>AliasVault</h1>
[<img src="https://img.shields.io/github/v/release/lanedirt/AliasVault?include_prereleases&logo=github">](https://github.com/lanedirt/OGameX/releases)
[<img src="https://img.shields.io/github/actions/workflow/status/lanedirt/AliasVault/docker-compose-build.yml?label=docker-compose%20build">](https://github.com/lanedirt/AliasVault/actions/workflows/docker-compose-build.yml)
[<img src="https://img.shields.io/github/v/release/lanedirt/AliasVault?include_prereleases&logo=github">](https://github.com/lanedirt/AliasVault/releases)
[<img src="https://img.shields.io/github/actions/workflow/status/lanedirt/AliasVault/dotnet-unit-tests.yml?label=unit tests">](https://github.com/lanedirt/AliasVault/actions/workflows/dotnet-build-run-tests.yml)
[<img src="https://img.shields.io/github/actions/workflow/status/lanedirt/AliasVault/dotnet-integration-tests.yml?label=integration tests">](https://github.com/lanedirt/AliasVault/actions/workflows/dotnet-build-run-tests.yml)
[<img src="https://img.shields.io/github/actions/workflow/status/lanedirt/AliasVault/dotnet-e2e-tests.yml?label=e2e tests">](https://github.com/lanedirt/AliasVault/actions/workflows/dotnet-integration-tests.yml)
[<img src="https://img.shields.io/sonar/coverage/lanedirt_AliasVault?server=https%3A%2F%2Fsonarcloud.io&label=test code coverage">](https://sonarcloud.io/summary/new_code?id=lanedirt_AliasVault)
[<img src="https://img.shields.io/github/actions/workflow/status/lanedirt/AliasVault/dotnet-e2e-client-tests.yml?label=e2e tests">](https://github.com/lanedirt/AliasVault/actions/workflows/dotnet-e2e-client-tests.yml)
[<img src="https://img.shields.io/sonar/quality_gate/lanedirt_AliasVault?server=https%3A%2F%2Fsonarcloud.io&label=sonarcloud&logo=sonarcloud">](https://sonarcloud.io/summary/new_code?id=lanedirt_AliasVault)
</div>
[<img alt="Discord" src="https://img.shields.io/discord/1309300619026235422?logo=discord&logoColor=%237289da&label=discord&color=%237289da">](https://discord.gg/DsaXMTEtpF)
AliasVault is an open-source password and identity manager built with C# ASP.NET technology. AliasVault can be self-hosted on your own server with Docker, providing a secure and private solution for managing your online identities and passwords.
> AliasVault is an end-to-end encrypted password and (email) alias manager that protects your privacy by creating alternative identities, passwords and email addresses for every website you use. Use the official supported cloud version or self-host AliasVault on your own server with Docker.
## Quick links
- <a href="https://app.aliasvault.net">Try the cloud version 🔥</a> - <a href="https://aliasvault.net?utm_source=gh-readme">Website 🌐</a> - <a href="https://docs.aliasvault.net?utm_source=gh-readme">Documentation 📚</a> - <a href="#self-hosting">Self-host instructions ⚙️</a> - <a href="https://aliasvault.net/plugins?utm_source=gh-readme">Browser Extensions 🔌</a>
### What makes AliasVault unique:
- **Zero-knowledge architecture**: All data is end-to-end encrypted on the client and stored in encrypted state on the server. Your master password never leaves your device and the server never has access to your data.
- **Built-in email server**: AliasVault includes its own email server that allows you to generate virtual email addresses for each identity. Emails sent to these addresses are instantly visible in the AliasVault app.
- **Virtual identities**: Generate virtual identities and assign them to a website, allowing you to use different email addresses and usernames for each website. Keeping your online identities separate and secure, making it harder for attackers to link your accounts.
- **Open-source**: The source code is available on GitHub and can be self-hosted on your own server.
- **Built-in email server**: AliasVault includes its own email server that allows you to generate real working email addresses for each alias. Emails sent to these addresses are instantly visible in the AliasVault app and browser extension.
- **Alias generation**: Generate aliases and assign them to a website, allowing you to use different email addresses and usernames for each website. Keeping your online identities separate and secure, making it harder for bad actors to link your accounts.
- **Open-source**: The source code is available on GitHub and AliasVault can be self-hosted on your own server via an easy install script.
> Note: AliasVault is currently in active development and some features may not yet have been (fully) implemented. If you run into any issues, please create an issue on GitHub.
## Screenshots
## Live demo
A live demo of the app is available at [main.aliasvault.net](https://main.aliasvault.net) (nightly builds). You can create a free account to try it out yourself.
<table>
<tr>
<th align="center">Browser Extension</th>
<th align="center">Generate email and aliases</th>
</tr>
<tr>
<td align="center">
<img src="https://github.com/user-attachments/assets/d9ffd3dc-08a0-462d-8148-e8da5ec5a520" alt="Browser Autofill" />
</td>
<td align="center">
<img src="https://github.com/user-attachments/assets/86752994-d469-4b0e-b633-c089e0aed12b" alt="Generate Aliases" />
</td>
</tr>
<tr>
<th align="center">Strong security</th>
<th align="center">Easy self-host</th>
</tr>
<tr>
<td align="center">
<img src="https://github.com/user-attachments/assets/26b66379-10a5-4b8b-9c69-e64b553a10be" alt="Strong security" />
</td>
<td align="center">
<img src="https://github.com/user-attachments/assets/47c7002a-e326-4507-8801-194e134e00dd" alt="Easy self-host installation" />
</td>
</tr>
</table>
<img width="700" alt="Screenshot 2024-07-12 at 14 58 29" src="https://github.com/user-attachments/assets/57103f67-dff0-4124-9b33-62137aab5578">
## Official Cloud Version
The official cloud version of AliasVault is freely available at [app.aliasvault.net](https://app.aliasvault.net). This fully supported platform is always up to date with our latest release. Create an account to protect your privacy today.
## Installation on your own machine
To install AliasVault on your own machine, follow the steps below. Note: the install process is tested on MacOS and Linux. It should work on Windows too, but you might need to adjust some commands.
[<img width="700" alt="Screenshot of AliasVault" src="docs/assets/img/screenshot.png">](https://app.aliasvault.net)
### Requirements:
- Access to a terminal
- Docker
- Git
## Self-hosting
For full control over your own data you can self-host and install AliasVault on your own servers. The easiest method is to use the provided install script. This will download the pre-built Docker images and start the containers.
### 1. Clone this repository.
### Install using install script
This method uses pre-built Docker images and works on minimal hardware specifications:
- Linux VM with root access (Ubuntu/AlmaLinux recommended) or Raspberry Pi
- 1 vCPU
- 1GB RAM
- 16GB disk space
- Docker installed
```bash
# Clone this Git repository to "AliasVault" directory
$ git clone https://github.com/lanedirt/AliasVault.git
# Download install script from latest stable release
curl -o install.sh https://github.com/lanedirt/AliasVault/releases/latest/download/install.sh
# Make install script executable and run it. This will create the .env file, pull the Docker images, and start the AliasVault containers.
chmod +x install.sh
./install.sh install
```
### 2. Run the install script.
The script prepares the .env file, builds the Docker image, and starts the AliasVault containers.
The install script will output the URL where the app is available. By default this is:
- Client: https://localhost
- Admin portal: https://localhost/admin
```bash
# Go to the project directory
$ cd AliasVault
> Note: If you want to change the default AliasVault ports you can do so in the `.env` file.
# Make install script executable
$ chmod +x install.sh
## Documentation
For more detailed information about the installation process and other topics, please see the official documentation website:
- [Documentation website (docs.aliasvault.net) 📚](https://docs.aliasvault.net)
# Run the install script
$ ./install.sh
```
## Security Architecture
<a href="https://docs.aliasvault.net/architecture"><img alt="AliasVault Security Architecture Diagram" src="docs/assets/diagrams/security-architecture/aliasvault-security-architecture-thumb.jpg" width="343"></a>
Note: if you do not wish to run the script, you can set up the environment variables and build the Docker image and containers manually instead. See the [manual setup instructions](docs/setup/1-manually-setup-docker.md) for more information.
AliasVault takes security seriously and implements various measures to protect your data:
### 3. AliasVault is ready to use.
The script will output the URL where the app is available. You can now open the app in your browser and create an account.
- All sensitive user data is encrypted end-to-end using industry-standard encryption algorithms. This includes the complete vault contents and all received emails.
- Your master password never leaves your device.
- Zero-knowledge architecture ensures the server never has access to your unencrypted data
> Note: the container binds to port 80 for client and port 8080 for admin by default. If you have another service running on these ports, you can change the AliasVault ports in the `docker-compose.yml` file.
For detailed information about our encryption implementation and security architecture, see the following documents:
- [SECURITY.md](SECURITY.md)
- [Security Architecture Diagram](https://docs.aliasvault.net/architecture)
#### Note for first time build:
- When running the init script for the first time, it may take a few minutes for Docker to download all dependencies. Subsequent builds will be faster.
- A SQLite database file will be created in `./database/AliasServerDb.sqlite`. This file will store all (encrypted) password vaults. It should be kept secure and not shared.
## Roadmap
AliasVault is under active development with new features being added regularly. We believe in transparency and want to share our vision for the future of the platform. Here's what we've accomplished and what we're working on next:
#### Other useful commands:
- To reset the admin password, run the install.sh script with the `--reset-admin-password` flag.
- To uninstall AliasVault, make the uninstall script executable with `chmod +x uninstall.sh` first, then run the script: `./uninstall.sh`.
This will remove all containers, images, and volumes related to AliasVault. It will keep all files and configuration intact however, so you can easily reinstall AliasVault later.
- [x] Core password & alias management
- [x] End-to-end encryption
- [x] Built-in email server for aliases
- [x] Single-command Docker-based installation
- [x] Chrome browser extension
- [x] Firefox and MS Edge browser extension
- [x] Safari and Brave browser extension
- [x] Add and associate TOTP MFA tokens to credentials
- [ ] Add GUI to allow customizing password generation options (length, special chars etc.) (https://github.com/lanedirt/AliasVault/issues/167)
- [ ] Import passwords from existing password managers (https://github.com/lanedirt/AliasVault/issues/542)
- [ ] Add support for connecting custom user domains to cloud hosted version (https://github.com/lanedirt/AliasVault/issues/485)
## Tech stack / credits
The following technologies, frameworks and libraries are used in this project:
### Future Plans
- [ ] Mobile apps (iOS, Android)
- [ ] Team / organization features (sharing passwords/aliases)
- [ ] Disposable phone number service
- [C#](https://docs.microsoft.com/en-us/dotnet/csharp/) - A simple, modern, object-oriented, and type-safe programming language.
- [ASP.NET Core](https://dotnet.microsoft.com/apps/aspnet) - An open-source framework for building modern, cloud-based, internet-connected applications.
- [Entity Framework Core](https://docs.microsoft.com/en-us/ef/core/) - A lightweight, extensible, open-source and cross-platform version of the popular Entity Framework data access technology.
- [Blazor WASM](https://dotnet.microsoft.com/apps/aspnet/web-apps/blazor) - A framework for building interactive web UIs using C# instead of JavaScript. It's a single-page app framework that runs in the browser via WebAssembly.
- [Playwright](https://playwright.dev/) - A Node.js library to automate Chromium, Firefox and WebKit with a single API. Used for end-to-end testing.
- [Docker](https://www.docker.com/) - A platform for building, sharing, and running containerized applications.
- [SQLite](https://www.sqlite.org/index.html) - A C-language library that implements a small, fast, self-contained, high-reliability, full-featured, SQL database engine.
- [Tailwind CSS](https://tailwindcss.com/) - A utility-first CSS framework for rapidly building custom designs.
- [Flowbite](https://flowbite.com/) - A free and open-source UI component library based on Tailwind CSS.
- [Konscious.Security.Cryptography](https://github.com/kmaragon/Konscious.Security.Cryptography) - A .NET library that implements Argon2id, a memory-hard password hashing algorithm.
- [SRP.net](https://github.com/secure-remote-password/srp.net) - SRP6a Secure Remote Password protocol for secure password authentication.
- [SmtpServer](https://github.com/cosullivan/SmtpServer) - A SMTP server library for .NET that is used for the virtual email address feature.
- [MimeKit](https://github.com/jstedfast/MimeKit) - A .NET MIME creation and parser library used for the virtual email address feature.
Want to suggest a feature? Join our [Discord](https://discord.gg/DsaXMTEtpF) or create an issue on GitHub.
### Support the mission
Your donation helps me dedicate more time and resources to improving AliasVault, making the internet safer for everyone!
<a href="https://www.buymeacoffee.com/lanedirt" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-yellow.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>
## Tech Stack & Security
AliasVault is built with a modern, secure, and scalable technology stack, ensuring robust encryption and privacy protection.
### Core Technologies
- **C# & ASP.NET Core** Reliable, high-performance backend for Web API.
- **Blazor WASM** Secure, interactive web UI.
- **PostgreSQL & SQLite** Database solutions, with SQLite powering encrypted user vaults.
- **Docker** Containerized deployment for scalability.
- **Next.JS & React & Typescript** - Powering the AliasVault website and browser extensions
### Security & Cryptography
- **Argon2id (Konscious.Security.Cryptography)** Industry-leading password hashing.
- **SRP** Secure Remote Password (SRP-6a) protocol for authentication.
- **MimeKit & SmtpServer** Secure email processing and virtual addresses.
### Additional Tools
- **Tailwind CSS & Flowbite** Modern UI design.
- **Playwright** Automated end-to-end testing.
- **SonarCloud** Continuous code quality monitoring.
AliasVault prioritizes security, performance, and user privacy with a technology stack trusted by the industry.

95
SECURITY.md Normal file
View File

@@ -0,0 +1,95 @@
# SECURITY.md
This document describes the encryption algorithms used by AliasVault in order to keep its user data secure.
## Overview
AliasVault features a [zero-knowledge architecture](https://en.wikipedia.org/wiki/Zero-knowledge_service) and uses a combination of encryption algorithms to protect the data of its users.
The basic premise is that the master password chosen by the user upon registration forms the basis for all encryption
and decryption operations. This master password is never transmitted over the network and only resides on the client.
All data is encrypted at rest and in transit. This ensures that even if the AliasVault servers are compromised,
the user's data remains secure.
## Encryption algorithms
The following encryption algorithms are used by AliasVault:
- [Argon2id](#argon2id)
- [SRP](#srp)
- [AES-GCM](#aes-gcm)
- [RSA-OAEP](#rsa-oaep)
Below is a detailed explanation of each encryption algorithm.
For more information about how these algorithms are specifically used in AliasVault, see the [Architecture Documentation](https://docs.aliasvault.net/architecture) section on the documentation site.
### Argon2id
To derive a key from the master password, AliasVault uses the Argon2id key derivation function. Argon2id is a memory-hard
key derivation function which allows for controlling the execution time, memory required and degree of parallelism.
This makes it resilient against brute-force attacks and makes it one of the best choices for deriving keys from passwords.
AliasVault uses Argon2id with the following default parameters:
- Degree of parallelism: 1
- Memory size: 19456 KB
- Iterations: 2
More information about Argon2id can be found on the [Argon2](https://en.wikipedia.org/wiki/Argon2) Wikipedia page.
### SRP
The Secure Remote Password (SRP) protocol is used for authenticating a user with the AliasVault server during login.
The SRP protocol is a password-authenticated key exchange protocol (PAKE). This means that the client and server can
authenticate each other using a password, without sending the password itself over the network.
With the use of SRP the master password never leaves the client. The client sends a verifier to the server,
which is a value derived from the master password. The server uses this verifier to authenticate the client without
having ever seen the actual master password.
For more information see the [SRP protocol](https://en.wikipedia.org/wiki/Secure_Remote_Password_protocol) information on Wikipedia.
### AES-256-GCM
All user's vault data is fully encrypted on the client using the AES-256-GCM encryption algorithm, which stands for
*Advanced Encryption Standard with 256-bit key in Galois/Counter Mode*. The key for encryption is derived from the
master password by using the Argon2Id algorithm. AliasVault implements AES-GCM with the following specifications:
- Key Size: 256 bits
- Uses the Web Crypto API's SubtleCrypto interface for secure cryptographic operations
- Generates a random 12-byte (96-bit) IV (initialization vector) for each encryption operation
- Performs all encryption/decryption operations entirely in the browser
#### The encryption process works as follows:
- A unique IV is generated for each encryption operation
- The users vault data is encrypted using AES-GCM with the derived key and IV
- The IV is prepended to the ciphertext
More information about AES-GCM can be found on the [AES-GCM](https://en.wikipedia.org/wiki/Galois/Counter_Mode) Wikipedia page.
### RSA-OAEP
To secure email communications, AliasVault uses RSA-OAEP (RSA with Optimal Asymmetric Encryption Padding). This asymmetric
encryption system allows AliasVault to store emails on the server in encrypted state which can only be read by the
intended recipient. AliasVault implements RSA-OAEP with the following specifications:
- Algorithm: RSA-OAEP with SHA-256 hash
- Key Size: 2048-bit modulus
- Key Format: JWK (JSON Web Key)
- Padding: OAEP (Optimal Asymmetric Encryption Padding)
#### Email Security Flow
1. Key Generation: When a user creates a vault, a RSA key pair is generated:
- A private key that remains in the encrypted user's vault and is never transmitted
- A public key that is sent to the server
2. Email Reception Process: When an email arrives at the AliasVault email server:
- The server generates a random 256-bit symmetric encryption key to encrypt the email contents
- The symmetric encryption key is encrypted using the recipient's asymmetric public key
- The encrypted email contents together with the encrypted symmetric encryption key are stored in the server's database
- The original email content is never stored or logged
3. Email Retrieval Process:
- When a user accesses their emails, the encrypted content is retrieved from the server
- The client-side application decrypts the symmetric encryption key using the user's private key that is stored in their vault
- The decrypted symmetric encryption key is used to decrypt the email contents
- Decryption occurs entirely in the browser, maintaining end-to-end encryption
This implementation ensures that:
- Emails are encrypted and secure at rest in the server database
- Only the intended recipient that holds the private key can decrypt and read their emails
- Even if the server is compromised, email contents remain encrypted and unreadable
More information about RSA-OAEP can be found on the [RSA-OAEP](https://en.wikipedia.org/wiki/Optimal_asymmetric_encryption_padding) Wikipedia page.

View File

@@ -3,21 +3,17 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.10.34928.147
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AliasGenerators", "src\AliasGenerators\AliasGenerators.csproj", "{78E84B4E-57D1-491A-8F4E-9879AE49DE0F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Utilities", "Utilities", "{01AB9389-2F89-4F8E-A688-BF4BF1FC42C8}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FaviconExtractor", "src\Utilities\FaviconExtractor\FaviconExtractor.csproj", "{ED328644-A152-403D-86EB-81201AA07744}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AliasVault.FaviconExtractor", "src\Utilities\AliasVault.FaviconExtractor\AliasVault.FaviconExtractor.csproj", "{ED328644-A152-403D-86EB-81201AA07744}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AliasVault.UnitTests", "src\Tests\AliasVault.UnitTests\AliasVault.UnitTests.csproj", "{8E6A418A-B305-465D-857D-49953605C18E}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Cryptography", "src\Utilities\Cryptography\Cryptography.csproj", "{427EA8E2-EA76-467E-A6BC-201EFE40C0D0}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AliasVault.Api", "src\AliasVault.Api\AliasVault.Api.csproj", "{B797C533-260E-4DA2-83B1-0EE4BCFE08DB}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AliasVault.Client", "src\AliasVault.Client\AliasVault.Client.csproj", "{25248E01-5A4B-4F95-A63C-BEA01499A1C2}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AliasVault.Shared", "src\AliasVault.Shared\AliasVault.Shared.csproj", "{15EFE0D0-F41B-47D7-86B7-8F840335CB82}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AliasVault.Shared", "src\Shared\AliasVault.Shared\AliasVault.Shared.csproj", "{15EFE0D0-F41B-47D7-86B7-8F840335CB82}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{29DE523D-EEF2-41E9-AC12-F20D8D02BEBB}"
EndProject
@@ -33,7 +29,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AliasVault.E2ETests.Client.
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Server", "Server", "{607945F3-9896-4544-99EC-F3496CF4D36B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CsvImportExport", "src\Utilities\CsvImportExport\CsvImportExport.csproj", "{A9C9A606-C87E-4298-AB32-09B1884D7487}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AliasVault.CsvImportExport", "src\Utilities\AliasVault.CsvImportExport\AliasVault.CsvImportExport.csproj", "{A9C9A606-C87E-4298-AB32-09B1884D7487}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{8A477241-B96C-4174-968D-D40CB77F1ECD}"
EndProject
@@ -43,24 +39,42 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AliasVault.IntegrationTests
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AliasVault.Admin", "src\AliasVault.Admin\AliasVault.Admin.csproj", "{F2CAE93E-94A7-4365-8E84-8D48CE8DD53F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InitializationCLI", "src\Utilities\InitializationCLI\InitializationCLI.csproj", "{857BCD0E-753F-437A-AF75-B995B4D9A5FE}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AliasVault.InstallCli", "src\Utilities\AliasVault.InstallCli\AliasVault.InstallCli.csproj", "{857BCD0E-753F-437A-AF75-B995B4D9A5FE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AliasVault.Logging", "src\Utilities\AliasVault.Logging\AliasVault.Logging.csproj", "{FF0B0E64-1AE2-415C-A404-0EB78010821A}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AliasVault.RazorComponents", "src\Utilities\AliasVault.RazorComponents\AliasVault.RazorComponents.csproj", "{59642CEF-D90A-4A6B-AD3F-9C6300D1E3FC}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AliasVault.RazorComponents", "src\Shared\AliasVault.RazorComponents\AliasVault.RazorComponents.csproj", "{59642CEF-D90A-4A6B-AD3F-9C6300D1E3FC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AliasVault.WorkerStatus", "src\Utilities\AliasVault.WorkerStatus\AliasVault.WorkerStatus.csproj", "{951C3DF8-DF22-4B2B-839F-FBA26DDD8ABD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AliasVault.TotpGenerator", "src\Utilities\AliasVault.TotpGenerator\AliasVault.TotpGenerator.csproj", "{E8D9C551-67D2-4651-8EDF-4262DF7375CE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AliasVault.Auth", "src\Utilities\AliasVault.Auth\AliasVault.Auth.csproj", "{DA175274-0FF7-4436-9266-742F96C2D1ED}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Cryptography", "Cryptography", "{BB7E701E-B1C6-453E-800A-E12CE256318D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AliasVault.Cryptography.Server", "src\Utilities\Cryptography\AliasVault.Cryptography.Server\AliasVault.Cryptography.Server.csproj", "{341EC443-0B6B-4E8C-AF46-D6156573CEA5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AliasVault.Cryptography.Client", "src\Utilities\Cryptography\AliasVault.Cryptography.Client\AliasVault.Cryptography.Client.csproj", "{542C7B7D-C2B4-4AE3-9B2C-C62FCF4DFF8E}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Generators", "Generators", "{03D55CA4-20B3-4FEA-9ADD-3C7B5B10E0FE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AliasVault.Generators.Identity", "src\Generators\AliasVault.Generators.Identity\AliasVault.Generators.Identity.csproj", "{80E74FBC-4EC8-45FB-B210-473337C484B5}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{DD359F0A-0180-4F8F-9E48-46213386BA4D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AliasVault.Shared.Core", "src\Shared\AliasVault.Shared.Core\AliasVault.Shared.Core.csproj", "{40CA41BF-9E67-4D0A-A3F8-38B94992E4CA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AliasVault.TaskRunner", "src\Services\AliasVault.TaskRunner\AliasVault.TaskRunner.csproj", "{D631A936-DD1C-40CC-B735-BD0A5D4F46A1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AliasVault.Shared.Server", "src\Shared\AliasVault.Shared.Server\AliasVault.Shared.Server.csproj", "{34FADEB6-4B56-463B-B359-F844B43D76D9}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{78E84B4E-57D1-491A-8F4E-9879AE49DE0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{78E84B4E-57D1-491A-8F4E-9879AE49DE0F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{78E84B4E-57D1-491A-8F4E-9879AE49DE0F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{78E84B4E-57D1-491A-8F4E-9879AE49DE0F}.Release|Any CPU.Build.0 = Release|Any CPU
{ED328644-A152-403D-86EB-81201AA07744}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ED328644-A152-403D-86EB-81201AA07744}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ED328644-A152-403D-86EB-81201AA07744}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -69,10 +83,6 @@ Global
{8E6A418A-B305-465D-857D-49953605C18E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8E6A418A-B305-465D-857D-49953605C18E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8E6A418A-B305-465D-857D-49953605C18E}.Release|Any CPU.Build.0 = Release|Any CPU
{427EA8E2-EA76-467E-A6BC-201EFE40C0D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{427EA8E2-EA76-467E-A6BC-201EFE40C0D0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{427EA8E2-EA76-467E-A6BC-201EFE40C0D0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{427EA8E2-EA76-467E-A6BC-201EFE40C0D0}.Release|Any CPU.Build.0 = Release|Any CPU
{B797C533-260E-4DA2-83B1-0EE4BCFE08DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B797C533-260E-4DA2-83B1-0EE4BCFE08DB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B797C533-260E-4DA2-83B1-0EE4BCFE08DB}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -133,6 +143,38 @@ Global
{951C3DF8-DF22-4B2B-839F-FBA26DDD8ABD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{951C3DF8-DF22-4B2B-839F-FBA26DDD8ABD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{951C3DF8-DF22-4B2B-839F-FBA26DDD8ABD}.Release|Any CPU.Build.0 = Release|Any CPU
{E8D9C551-67D2-4651-8EDF-4262DF7375CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E8D9C551-67D2-4651-8EDF-4262DF7375CE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E8D9C551-67D2-4651-8EDF-4262DF7375CE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E8D9C551-67D2-4651-8EDF-4262DF7375CE}.Release|Any CPU.Build.0 = Release|Any CPU
{DA175274-0FF7-4436-9266-742F96C2D1ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DA175274-0FF7-4436-9266-742F96C2D1ED}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DA175274-0FF7-4436-9266-742F96C2D1ED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DA175274-0FF7-4436-9266-742F96C2D1ED}.Release|Any CPU.Build.0 = Release|Any CPU
{341EC443-0B6B-4E8C-AF46-D6156573CEA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{341EC443-0B6B-4E8C-AF46-D6156573CEA5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{341EC443-0B6B-4E8C-AF46-D6156573CEA5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{341EC443-0B6B-4E8C-AF46-D6156573CEA5}.Release|Any CPU.Build.0 = Release|Any CPU
{542C7B7D-C2B4-4AE3-9B2C-C62FCF4DFF8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{542C7B7D-C2B4-4AE3-9B2C-C62FCF4DFF8E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{542C7B7D-C2B4-4AE3-9B2C-C62FCF4DFF8E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{542C7B7D-C2B4-4AE3-9B2C-C62FCF4DFF8E}.Release|Any CPU.Build.0 = Release|Any CPU
{80E74FBC-4EC8-45FB-B210-473337C484B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{80E74FBC-4EC8-45FB-B210-473337C484B5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{80E74FBC-4EC8-45FB-B210-473337C484B5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{80E74FBC-4EC8-45FB-B210-473337C484B5}.Release|Any CPU.Build.0 = Release|Any CPU
{40CA41BF-9E67-4D0A-A3F8-38B94992E4CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{40CA41BF-9E67-4D0A-A3F8-38B94992E4CA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{40CA41BF-9E67-4D0A-A3F8-38B94992E4CA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{40CA41BF-9E67-4D0A-A3F8-38B94992E4CA}.Release|Any CPU.Build.0 = Release|Any CPU
{D631A936-DD1C-40CC-B735-BD0A5D4F46A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D631A936-DD1C-40CC-B735-BD0A5D4F46A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D631A936-DD1C-40CC-B735-BD0A5D4F46A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D631A936-DD1C-40CC-B735-BD0A5D4F46A1}.Release|Any CPU.Build.0 = Release|Any CPU
{34FADEB6-4B56-463B-B359-F844B43D76D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{34FADEB6-4B56-463B-B359-F844B43D76D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{34FADEB6-4B56-463B-B359-F844B43D76D9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{34FADEB6-4B56-463B-B359-F844B43D76D9}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -140,7 +182,7 @@ Global
GlobalSection(NestedProjects) = preSolution
{ED328644-A152-403D-86EB-81201AA07744} = {01AB9389-2F89-4F8E-A688-BF4BF1FC42C8}
{8E6A418A-B305-465D-857D-49953605C18E} = {29DE523D-EEF2-41E9-AC12-F20D8D02BEBB}
{427EA8E2-EA76-467E-A6BC-201EFE40C0D0} = {01AB9389-2F89-4F8E-A688-BF4BF1FC42C8}
{15EFE0D0-F41B-47D7-86B7-8F840335CB82} = {DD359F0A-0180-4F8F-9E48-46213386BA4D}
{AF013D08-1BF6-4E23-87D2-37F614BE7952} = {29DE523D-EEF2-41E9-AC12-F20D8D02BEBB}
{1277105D-50CD-4CE0-9C2C-549F46867E54} = {5F7417F6-4388-49CC-9511-ED63C4A6488A}
{FE10F294-817F-477E-A24F-8597A15AF0B5} = {5F7417F6-4388-49CC-9511-ED63C4A6488A}
@@ -151,8 +193,17 @@ Global
{1C7C8DE9-5F2A-43DB-A25E-33319E80A509} = {29DE523D-EEF2-41E9-AC12-F20D8D02BEBB}
{857BCD0E-753F-437A-AF75-B995B4D9A5FE} = {01AB9389-2F89-4F8E-A688-BF4BF1FC42C8}
{FF0B0E64-1AE2-415C-A404-0EB78010821A} = {01AB9389-2F89-4F8E-A688-BF4BF1FC42C8}
{59642CEF-D90A-4A6B-AD3F-9C6300D1E3FC} = {01AB9389-2F89-4F8E-A688-BF4BF1FC42C8}
{59642CEF-D90A-4A6B-AD3F-9C6300D1E3FC} = {DD359F0A-0180-4F8F-9E48-46213386BA4D}
{951C3DF8-DF22-4B2B-839F-FBA26DDD8ABD} = {01AB9389-2F89-4F8E-A688-BF4BF1FC42C8}
{E8D9C551-67D2-4651-8EDF-4262DF7375CE} = {01AB9389-2F89-4F8E-A688-BF4BF1FC42C8}
{DA175274-0FF7-4436-9266-742F96C2D1ED} = {01AB9389-2F89-4F8E-A688-BF4BF1FC42C8}
{BB7E701E-B1C6-453E-800A-E12CE256318D} = {01AB9389-2F89-4F8E-A688-BF4BF1FC42C8}
{341EC443-0B6B-4E8C-AF46-D6156573CEA5} = {BB7E701E-B1C6-453E-800A-E12CE256318D}
{542C7B7D-C2B4-4AE3-9B2C-C62FCF4DFF8E} = {BB7E701E-B1C6-453E-800A-E12CE256318D}
{80E74FBC-4EC8-45FB-B210-473337C484B5} = {03D55CA4-20B3-4FEA-9ADD-3C7B5B10E0FE}
{40CA41BF-9E67-4D0A-A3F8-38B94992E4CA} = {DD359F0A-0180-4F8F-9E48-46213386BA4D}
{D631A936-DD1C-40CC-B735-BD0A5D4F46A1} = {8A477241-B96C-4174-968D-D40CB77F1ECD}
{34FADEB6-4B56-463B-B359-F844B43D76D9} = {DD359F0A-0180-4F8F-9E48-46213386BA4D}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {FEE82475-C009-4762-8113-A6563D9DC49E}

View File

@@ -0,0 +1,28 @@
# Child EditorConfig file that enforces 2 space indent for Typescript projects
root = false
# Unix-style newlines with a newline ending every file
[*]
end_of_line = lf
insert_final_newline = true
charset = utf-8
trim_trailing_whitespace = true
# TypeScript and JavaScript files
[*.{ts,tsx,js,jsx}]
indent_style = space
indent_size = 2
# JSON files
[*.json]
indent_style = space
indent_size = 2
# YAML files
[*.{yml,yaml}]
indent_style = space
indent_size = 2
# Markdown files
[*.md]
trim_trailing_whitespace = false

33
browser-extension/.gitignore vendored Normal file
View File

@@ -0,0 +1,33 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.output
dist
stats.html
stats-*.json
.wxt
web-ext.config.ts
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# Dictionaries
# During build these are copied from the ../dictionaries folder because firefox zip requires all files to be in the root of the zip.
# Therefore this copied folder is not committed to the repo the original folder is already available outside this directory.
# See vite-plugins/identity-gen-dict-loader.ts for more details.
dictionaries

View File

@@ -0,0 +1,25 @@
This folder contains the source code for the browser extensions for AliasVault.
The browser extension is built using WXT and React:
- [WXT](https://wxt.dev/) is a build tool for browser extensions.
- [React](https://reactjs.org/) is a JavaScript library for building user interfaces.
To build the browser extension, run the following command in this directory:
### Build the browser extension
```bash
npm install
# Build the Chrome extension (saves in dist/chrome-mv3)
npm run zip:chrome
# Build the Firefox extension (creates two zip files in dist)
npm run zip:firefox
# Build the Edge extension (saves in dist/edge-mv3)
npm run zip:edge
# Build the Safari extension (saves in dist/safari-mv2 which is referenced by the dist/safari-xcode/AliasVault.xcodeproj project)
npm run build:safari
# Open the dist/safari-xcode/AliasVault.xcodeproj project in MacOS Xcode and run the project. This will install the extension to your Safari browser locally.
```

View File

@@ -0,0 +1,129 @@
import js from "@eslint/js";
import tsParser from "@typescript-eslint/parser";
import tsPlugin from "@typescript-eslint/eslint-plugin";
import reactPlugin from "eslint-plugin-react";
import reactHooksPlugin from "eslint-plugin-react-hooks";
import importPlugin from "eslint-plugin-import";
import jsdocPlugin from "eslint-plugin-jsdoc";
import globals from 'globals';
export default [
{
ignores: [
"dist/**",
"node_modules/**",
]
},
js.configs.recommended,
{
files: ["src/**/*.{ts,tsx}"],
languageOptions: {
parser: tsParser,
parserOptions: {
ecmaFeatures: { jsx: true },
ecmaVersion: "latest",
sourceType: "module",
project: "./tsconfig.json",
tsconfigRootDir: ".",
},
},
plugins: {
"@typescript-eslint": tsPlugin,
"react": reactPlugin,
"react-hooks": reactHooksPlugin,
"import": importPlugin,
"jsdoc": jsdocPlugin,
},
rules: {
...tsPlugin.configs.recommended.rules,
...reactPlugin.configs.recommended.rules,
...reactHooksPlugin.configs.recommended.rules,
"curly": ["error", "all"],
"brace-style": ["error", "1tbs", { "allowSingleLine": false }],
"@typescript-eslint/await-thenable": "error",
"@typescript-eslint/prefer-nullish-coalescing": ["error", {
"ignoreTernaryTests": false,
"ignoreConditionalTests": false,
"ignoreMixedLogicalExpressions": false
}],
"react/react-in-jsx-scope": "off",
"react/no-unused-prop-types": "error",
"@typescript-eslint/explicit-module-boundary-types": "off",
"@typescript-eslint/no-unused-vars": ["error", {
"vars": "all",
"args": "after-used",
"ignoreRestSiblings": true,
"varsIgnorePattern": "^_",
"argsIgnorePattern": "^_"
}],
"indent": ["error", 2, {
"SwitchCase": 1,
"VariableDeclarator": 1,
"outerIIFEBody": 1,
"MemberExpression": 1,
"FunctionDeclaration": { "parameters": 1, "body": 1 },
"FunctionExpression": { "parameters": 1, "body": 1 },
"CallExpression": { "arguments": 1 },
"ArrayExpression": 1,
"ObjectExpression": 1,
"ImportDeclaration": 1,
"flatTernaryExpressions": false,
"ignoreComments": false
}],
"no-multiple-empty-lines": ["error", { "max": 1, "maxEOF": 1, "maxBOF": 0 }],
"no-console": ["error", { allow: ["warn", "error", "info", "debug"] }],
"jsdoc/require-jsdoc": ["error", {
"require": {
"FunctionDeclaration": true,
"MethodDefinition": true,
"ClassDeclaration": true,
"ArrowFunctionExpression": true,
"FunctionExpression": true
}
}],
"jsdoc/require-description": ["error", {
"contexts": [
"FunctionDeclaration",
"MethodDefinition",
"ClassDeclaration",
"ArrowFunctionExpression",
"FunctionExpression"
]
}],
"spaced-comment": ["error", "always"],
"multiline-comment-style": ["error", "starred-block"],
"@typescript-eslint/explicit-member-accessibility": ["error"],
"@typescript-eslint/explicit-function-return-type": ["error"],
"@typescript-eslint/typedef": ["error"],
"@typescript-eslint/naming-convention": [
"error",
{
"selector": "interface",
"format": ["PascalCase"],
"prefix": ["I"]
},
{
"selector": "class",
"format": ["PascalCase"]
}
],
"react-hooks/exhaustive-deps": "warn",
"react/jsx-no-constructed-context-values": "error",
},
settings: {
react: {
version: "detect",
},
},
},
{
languageOptions: {
globals: {
...globals.browser,
...globals.node,
NodeJS: true,
chrome: 'readonly',
}
}
}
];

13494
browser-extension/package-lock.json generated Normal file
View File

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,64 @@
{
"name": "aliasvault-browser-extension",
"description": "AliasVault Browser Extension",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev:chrome": "wxt -b chrome",
"dev:firefox": "wxt -b firefox",
"dev:edge": "wxt -b edge",
"build:chrome": "wxt build -b chrome",
"build:firefox": "wxt build -b firefox",
"build:edge": "wxt build -b edge",
"build:safari": "wxt build -b safari",
"test": "vitest",
"test:coverage": "vitest run --coverage",
"lint": "eslint src",
"lint:custom": "eslint",
"lint:fix": "eslint src --fix",
"zip": "wxt zip",
"zip:chrome": "wxt zip -b chrome",
"zip:firefox": "wxt zip -b firefox",
"zip:edge": "wxt zip -b edge",
"compile": "tsc --noEmit",
"postinstall": "wxt prepare"
},
"dependencies": {
"@types/node": "^22.13.10",
"argon2-browser": "^1.18.0",
"buffer": "^6.0.3",
"globals": "^16.0.0",
"otpauth": "^9.3.6",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-router-dom": "^7.1.4",
"secure-remote-password": "github:LinusU/secure-remote-password#73e5f732b6ca0cdbdc19da1a0c5f48cdbad2cbf0",
"sql.js": "^1.12.0",
"vitest": "^3.0.8",
"webext-bridge": "^6.0.1"
},
"devDependencies": {
"@types/chrome": "^0.0.280",
"@types/jsdom": "^21.1.7",
"@types/react": "^19.0.7",
"@types/react-dom": "^19.0.3",
"@types/sql.js": "^1.4.9",
"@typescript-eslint/eslint-plugin": "^8.21.0",
"@typescript-eslint/parser": "^8.21.0",
"@vitest/coverage-v8": "^3.0.8",
"@wxt-dev/module-react": "^1.1.2",
"autoprefixer": "^10.4.20",
"eslint": "^9.19.0",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsdoc": "^50.6.3",
"eslint-plugin-react": "^7.37.4",
"eslint-plugin-react-hooks": "^5.1.0",
"jsdom": "^26.0.0",
"postcss": "^8.5.1",
"tailwindcss": "^3.4.17",
"typescript": "^5.6.3",
"vite-plugin-static-copy": "^2.2.0",
"wxt": "^0.19.13"
}
}

View File

@@ -0,0 +1,6 @@
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};

View File

@@ -0,0 +1,62 @@
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
## User settings
xcuserdata/
## Obj-C/Swift specific
*.hmap
## App packaging
*.ipa
*.dSYM.zip
*.dSYM
## Playgrounds
timeline.xctimeline
playground.xcworkspace
# Swift Package Manager
#
# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
# Packages/
# Package.pins
# Package.resolved
# *.xcodeproj
#
# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
# hence it is not needed unless you have added a package configuration file to your project
# .swiftpm
.build/
# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/
#
# Add this line if you want to avoid checking in source code from the Xcode workspace
# *.xcworkspace
# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts
Carthage/Build/
# fastlane
#
# It is recommended to not store the screenshots in the git repo.
# Instead, use fastlane to re-generate the screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
</dict>
</plist>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.Safari.web-extension</string>
<key>NSExtensionPrincipalClass</key>
<string>$(PRODUCT_MODULE_NAME).SafariWebExtensionHandler</string>
</dict>
</dict>
</plist>

View File

@@ -0,0 +1,42 @@
//
// SafariWebExtensionHandler.swift
// AliasVault Extension
//
// Created by Leendert de Borst on 12/03/2025.
//
import SafariServices
import os.log
class SafariWebExtensionHandler: NSObject, NSExtensionRequestHandling {
func beginRequest(with context: NSExtensionContext) {
let request = context.inputItems.first as? NSExtensionItem
let profile: UUID?
if #available(iOS 17.0, macOS 14.0, *) {
profile = request?.userInfo?[SFExtensionProfileKey] as? UUID
} else {
profile = request?.userInfo?["profile"] as? UUID
}
let message: Any?
if #available(iOS 15.0, macOS 11.0, *) {
message = request?.userInfo?[SFExtensionMessageKey]
} else {
message = request?.userInfo?["message"]
}
os_log(.default, "Received message from browser.runtime.sendNativeMessage: %@ (profile: %@)", String(describing: message), profile?.uuidString ?? "none")
let response = NSExtensionItem()
if #available(iOS 15.0, macOS 11.0, *) {
response.userInfo = [ SFExtensionMessageKey: [ "echo": message ] ]
} else {
response.userInfo = [ "message": [ "echo": message ] ]
}
context.completeRequest(returningItems: [ response ], completionHandler: nil)
}
}

View File

@@ -0,0 +1,619 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 56;
objects = {
/* Begin PBXBuildFile section */
CE0CAFA72D81A9F7006174AB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE0CAFA62D81A9F7006174AB /* AppDelegate.swift */; };
CE0CAFAB2D81A9F7006174AB /* Base in Resources */ = {isa = PBXBuildFile; fileRef = CE0CAFAA2D81A9F7006174AB /* Base */; };
CE0CAFAD2D81A9F7006174AB /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = CE0CAFAC2D81A9F7006174AB /* Icon.png */; };
CE0CAFAF2D81A9F7006174AB /* Style.css in Resources */ = {isa = PBXBuildFile; fileRef = CE0CAFAE2D81A9F7006174AB /* Style.css */; };
CE0CAFB12D81A9F7006174AB /* Script.js in Resources */ = {isa = PBXBuildFile; fileRef = CE0CAFB02D81A9F7006174AB /* Script.js */; };
CE0CAFB32D81A9F7006174AB /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE0CAFB22D81A9F7006174AB /* ViewController.swift */; };
CE0CAFB62D81A9F7006174AB /* Base in Resources */ = {isa = PBXBuildFile; fileRef = CE0CAFB52D81A9F7006174AB /* Base */; };
CE0CAFB82D81A9F8006174AB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CE0CAFB72D81A9F8006174AB /* Assets.xcassets */; };
CE0CAFC12D81A9F8006174AB /* AliasVault Extension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = CE0CAFC02D81A9F8006174AB /* AliasVault Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
CE0CAFC62D81A9F8006174AB /* SafariWebExtensionHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE0CAFC52D81A9F8006174AB /* SafariWebExtensionHandler.swift */; };
CE0CAFDB2D81A9F8006174AB /* background.js in Resources */ = {isa = PBXBuildFile; fileRef = CE0CAFD32D81A9F8006174AB /* background.js */; };
CE0CAFDC2D81A9F8006174AB /* popup.html in Resources */ = {isa = PBXBuildFile; fileRef = CE0CAFD42D81A9F8006174AB /* popup.html */; };
CE0CAFDD2D81A9F8006174AB /* chunks in Resources */ = {isa = PBXBuildFile; fileRef = CE0CAFD52D81A9F8006174AB /* chunks */; };
CE0CAFDE2D81A9F8006174AB /* content-scripts in Resources */ = {isa = PBXBuildFile; fileRef = CE0CAFD62D81A9F8006174AB /* content-scripts */; };
CE0CAFDF2D81A9F8006174AB /* manifest.json in Resources */ = {isa = PBXBuildFile; fileRef = CE0CAFD72D81A9F8006174AB /* manifest.json */; };
CE0CAFE02D81A9F8006174AB /* icon in Resources */ = {isa = PBXBuildFile; fileRef = CE0CAFD82D81A9F8006174AB /* icon */; };
CE0CAFE12D81A9F8006174AB /* assets in Resources */ = {isa = PBXBuildFile; fileRef = CE0CAFD92D81A9F8006174AB /* assets */; };
CE0CAFE22D81A9F8006174AB /* src in Resources */ = {isa = PBXBuildFile; fileRef = CE0CAFDA2D81A9F8006174AB /* src */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
CE0CAFC22D81A9F8006174AB /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = CE0CAF9B2D81A9F7006174AB /* Project object */;
proxyType = 1;
remoteGlobalIDString = CE0CAFBF2D81A9F8006174AB;
remoteInfo = "AliasVault Extension";
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
CE0CAFCE2D81A9F8006174AB /* Embed Foundation Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
CE0CAFC12D81A9F8006174AB /* AliasVault Extension.appex in Embed Foundation Extensions */,
);
name = "Embed Foundation Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
CE0CAFA32D81A9F7006174AB /* AliasVault.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AliasVault.app; sourceTree = BUILT_PRODUCTS_DIR; };
CE0CAFA62D81A9F7006174AB /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
CE0CAFAA2D81A9F7006174AB /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = Base; path = ../Base.lproj/Main.html; sourceTree = "<group>"; };
CE0CAFAC2D81A9F7006174AB /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Icon.png; sourceTree = "<group>"; };
CE0CAFAE2D81A9F7006174AB /* Style.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = Style.css; sourceTree = "<group>"; };
CE0CAFB02D81A9F7006174AB /* Script.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = Script.js; sourceTree = "<group>"; };
CE0CAFB22D81A9F7006174AB /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
CE0CAFB52D81A9F7006174AB /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
CE0CAFB72D81A9F8006174AB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
CE0CAFB92D81A9F8006174AB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
CE0CAFBA2D81A9F8006174AB /* AliasVault.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AliasVault.entitlements; sourceTree = "<group>"; };
CE0CAFBB2D81A9F8006174AB /* AliasVault.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AliasVault.entitlements; sourceTree = "<group>"; };
CE0CAFC02D81A9F8006174AB /* AliasVault Extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "AliasVault Extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
CE0CAFC52D81A9F8006174AB /* SafariWebExtensionHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariWebExtensionHandler.swift; sourceTree = "<group>"; };
CE0CAFC72D81A9F8006174AB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
CE0CAFC82D81A9F8006174AB /* AliasVault_Extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AliasVault_Extension.entitlements; sourceTree = "<group>"; };
CE0CAFD32D81A9F8006174AB /* background.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; name = background.js; path = "../../../dist/safari-mv2/background.js"; sourceTree = "<group>"; };
CE0CAFD42D81A9F8006174AB /* popup.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = popup.html; path = "../../../dist/safari-mv2/popup.html"; sourceTree = "<group>"; };
CE0CAFD52D81A9F8006174AB /* chunks */ = {isa = PBXFileReference; lastKnownFileType = folder; name = chunks; path = "../../../dist/safari-mv2/chunks"; sourceTree = "<group>"; };
CE0CAFD62D81A9F8006174AB /* content-scripts */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "content-scripts"; path = "../../../dist/safari-mv2/content-scripts"; sourceTree = "<group>"; };
CE0CAFD72D81A9F8006174AB /* manifest.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; name = manifest.json; path = "../../../dist/safari-mv2/manifest.json"; sourceTree = "<group>"; };
CE0CAFD82D81A9F8006174AB /* icon */ = {isa = PBXFileReference; lastKnownFileType = folder; name = icon; path = "../../../dist/safari-mv2/icon"; sourceTree = "<group>"; };
CE0CAFD92D81A9F8006174AB /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = assets; path = "../../../dist/safari-mv2/assets"; sourceTree = "<group>"; };
CE0CAFDA2D81A9F8006174AB /* src */ = {isa = PBXFileReference; lastKnownFileType = folder; name = src; path = "../../../dist/safari-mv2/src"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
CE0CAFA02D81A9F7006174AB /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
CE0CAFBD2D81A9F8006174AB /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
CE0CAF9A2D81A9F7006174AB = {
isa = PBXGroup;
children = (
CE0CAFA52D81A9F7006174AB /* AliasVault */,
CE0CAFC42D81A9F8006174AB /* AliasVault Extension */,
CE0CAFA42D81A9F7006174AB /* Products */,
);
sourceTree = "<group>";
};
CE0CAFA42D81A9F7006174AB /* Products */ = {
isa = PBXGroup;
children = (
CE0CAFA32D81A9F7006174AB /* AliasVault.app */,
CE0CAFC02D81A9F8006174AB /* AliasVault Extension.appex */,
);
name = Products;
sourceTree = "<group>";
};
CE0CAFA52D81A9F7006174AB /* AliasVault */ = {
isa = PBXGroup;
children = (
CE0CAFA62D81A9F7006174AB /* AppDelegate.swift */,
CE0CAFB22D81A9F7006174AB /* ViewController.swift */,
CE0CAFB42D81A9F7006174AB /* Main.storyboard */,
CE0CAFB72D81A9F8006174AB /* Assets.xcassets */,
CE0CAFB92D81A9F8006174AB /* Info.plist */,
CE0CAFBA2D81A9F8006174AB /* AliasVault.entitlements */,
CE0CAFBB2D81A9F8006174AB /* AliasVault.entitlements */,
CE0CAFA82D81A9F7006174AB /* Resources */,
);
path = AliasVault;
sourceTree = "<group>";
};
CE0CAFA82D81A9F7006174AB /* Resources */ = {
isa = PBXGroup;
children = (
CE0CAFA92D81A9F7006174AB /* Main.html */,
CE0CAFAC2D81A9F7006174AB /* Icon.png */,
CE0CAFAE2D81A9F7006174AB /* Style.css */,
CE0CAFB02D81A9F7006174AB /* Script.js */,
);
path = Resources;
sourceTree = "<group>";
};
CE0CAFC42D81A9F8006174AB /* AliasVault Extension */ = {
isa = PBXGroup;
children = (
CE0CAFD22D81A9F8006174AB /* Resources */,
CE0CAFC52D81A9F8006174AB /* SafariWebExtensionHandler.swift */,
CE0CAFC72D81A9F8006174AB /* Info.plist */,
CE0CAFC82D81A9F8006174AB /* AliasVault_Extension.entitlements */,
);
path = "AliasVault Extension";
sourceTree = "<group>";
};
CE0CAFD22D81A9F8006174AB /* Resources */ = {
isa = PBXGroup;
children = (
CE0CAFD32D81A9F8006174AB /* background.js */,
CE0CAFD42D81A9F8006174AB /* popup.html */,
CE0CAFD52D81A9F8006174AB /* chunks */,
CE0CAFD62D81A9F8006174AB /* content-scripts */,
CE0CAFD72D81A9F8006174AB /* manifest.json */,
CE0CAFD82D81A9F8006174AB /* icon */,
CE0CAFD92D81A9F8006174AB /* assets */,
CE0CAFDA2D81A9F8006174AB /* src */,
);
name = Resources;
path = "AliasVault Extension";
sourceTree = SOURCE_ROOT;
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
CE0CAFA22D81A9F7006174AB /* AliasVault */ = {
isa = PBXNativeTarget;
buildConfigurationList = CE0CAFCF2D81A9F8006174AB /* Build configuration list for PBXNativeTarget "AliasVault" */;
buildPhases = (
CE0CAF9F2D81A9F7006174AB /* Sources */,
CE0CAFA02D81A9F7006174AB /* Frameworks */,
CE0CAFA12D81A9F7006174AB /* Resources */,
CE0CAFCE2D81A9F8006174AB /* Embed Foundation Extensions */,
);
buildRules = (
);
dependencies = (
CE0CAFC32D81A9F8006174AB /* PBXTargetDependency */,
);
name = AliasVault;
productName = AliasVault;
productReference = CE0CAFA32D81A9F7006174AB /* AliasVault.app */;
productType = "com.apple.product-type.application";
};
CE0CAFBF2D81A9F8006174AB /* AliasVault Extension */ = {
isa = PBXNativeTarget;
buildConfigurationList = CE0CAFCB2D81A9F8006174AB /* Build configuration list for PBXNativeTarget "AliasVault Extension" */;
buildPhases = (
CE0CAFBC2D81A9F8006174AB /* Sources */,
CE0CAFBD2D81A9F8006174AB /* Frameworks */,
CE0CAFBE2D81A9F8006174AB /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = "AliasVault Extension";
productName = "AliasVault Extension";
productReference = CE0CAFC02D81A9F8006174AB /* AliasVault Extension.appex */;
productType = "com.apple.product-type.app-extension";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
CE0CAF9B2D81A9F7006174AB /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = 1;
LastSwiftUpdateCheck = 1540;
LastUpgradeCheck = 1540;
TargetAttributes = {
CE0CAFA22D81A9F7006174AB = {
CreatedOnToolsVersion = 15.4;
};
CE0CAFBF2D81A9F8006174AB = {
CreatedOnToolsVersion = 15.4;
};
};
};
buildConfigurationList = CE0CAF9E2D81A9F7006174AB /* Build configuration list for PBXProject "AliasVault" */;
compatibilityVersion = "Xcode 14.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = CE0CAF9A2D81A9F7006174AB;
productRefGroup = CE0CAFA42D81A9F7006174AB /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
CE0CAFA22D81A9F7006174AB /* AliasVault */,
CE0CAFBF2D81A9F8006174AB /* AliasVault Extension */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
CE0CAFA12D81A9F7006174AB /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
CE0CAFAD2D81A9F7006174AB /* Icon.png in Resources */,
CE0CAFB12D81A9F7006174AB /* Script.js in Resources */,
CE0CAFAB2D81A9F7006174AB /* Base in Resources */,
CE0CAFAF2D81A9F7006174AB /* Style.css in Resources */,
CE0CAFB82D81A9F8006174AB /* Assets.xcassets in Resources */,
CE0CAFB62D81A9F7006174AB /* Base in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
CE0CAFBE2D81A9F8006174AB /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
CE0CAFDD2D81A9F8006174AB /* chunks in Resources */,
CE0CAFE02D81A9F8006174AB /* icon in Resources */,
CE0CAFE12D81A9F8006174AB /* assets in Resources */,
CE0CAFE22D81A9F8006174AB /* src in Resources */,
CE0CAFDB2D81A9F8006174AB /* background.js in Resources */,
CE0CAFDF2D81A9F8006174AB /* manifest.json in Resources */,
CE0CAFDC2D81A9F8006174AB /* popup.html in Resources */,
CE0CAFDE2D81A9F8006174AB /* content-scripts in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
CE0CAF9F2D81A9F7006174AB /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
CE0CAFB32D81A9F7006174AB /* ViewController.swift in Sources */,
CE0CAFA72D81A9F7006174AB /* AppDelegate.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
CE0CAFBC2D81A9F8006174AB /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
CE0CAFC62D81A9F8006174AB /* SafariWebExtensionHandler.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
CE0CAFC32D81A9F8006174AB /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = CE0CAFBF2D81A9F8006174AB /* AliasVault Extension */;
targetProxy = CE0CAFC22D81A9F8006174AB /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
CE0CAFA92D81A9F7006174AB /* Main.html */ = {
isa = PBXVariantGroup;
children = (
CE0CAFAA2D81A9F7006174AB /* Base */,
);
name = Main.html;
sourceTree = "<group>";
};
CE0CAFB42D81A9F7006174AB /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
CE0CAFB52D81A9F7006174AB /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
CE0CAFC92D81A9F8006174AB /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MACOSX_DEPLOYMENT_TARGET = 14.5;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = macosx;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
CE0CAFCA2D81A9F8006174AB /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MACOSX_DEPLOYMENT_TARGET = 14.5;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = macosx;
SWIFT_COMPILATION_MODE = wholemodule;
};
name = Release;
};
CE0CAFCC2D81A9F8006174AB /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_ENTITLEMENTS = "AliasVault Extension/AliasVault_Extension.entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 8PHW4HN3F7;
ENABLE_HARDENED_RUNTIME = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "AliasVault Extension/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "AliasVault Extension";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@executable_path/../../../../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.14;
MARKETING_VERSION = 1.0;
OTHER_LDFLAGS = (
"-framework",
SafariServices,
);
PRODUCT_BUNDLE_IDENTIFIER = net.aliasvault.safari.extension;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
};
name = Debug;
};
CE0CAFCD2D81A9F8006174AB /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CODE_SIGN_ENTITLEMENTS = "AliasVault Extension/AliasVault_Extension.entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = 8PHW4HN3F7;
ENABLE_HARDENED_RUNTIME = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = "AliasVault Extension/Info.plist";
INFOPLIST_KEY_CFBundleDisplayName = "AliasVault Extension";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
"@executable_path/../../../../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.14;
MARKETING_VERSION = 1.0;
OTHER_LDFLAGS = (
"-framework",
SafariServices,
);
PRODUCT_BUNDLE_IDENTIFIER = net.aliasvault.safari.Extension;
PRODUCT_NAME = "$(TARGET_NAME)";
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
};
name = Release;
};
CE0CAFD02D81A9F8006174AB /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = AliasVault/AliasVault.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 7;
DEVELOPMENT_TEAM = 8PHW4HN3F7;
ENABLE_HARDENED_RUNTIME = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = AliasVault/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = AliasVault;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
INFOPLIST_KEY_NSMainStoryboardFile = Main;
INFOPLIST_KEY_NSPrincipalClass = NSApplication;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.14;
MARKETING_VERSION = 0.15.0;
OTHER_LDFLAGS = (
"-framework",
SafariServices,
"-framework",
WebKit,
);
PRODUCT_BUNDLE_IDENTIFIER = net.aliasvault.safari;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
};
name = Debug;
};
CE0CAFD12D81A9F8006174AB /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = AliasVault/AliasVault.entitlements;
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = 7;
DEVELOPMENT_TEAM = 8PHW4HN3F7;
ENABLE_HARDENED_RUNTIME = YES;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = AliasVault/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = AliasVault;
INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.productivity";
INFOPLIST_KEY_NSHumanReadableCopyright = "";
INFOPLIST_KEY_NSMainStoryboardFile = Main;
INFOPLIST_KEY_NSPrincipalClass = NSApplication;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.14;
MARKETING_VERSION = 0.15.0;
OTHER_LDFLAGS = (
"-framework",
SafariServices,
"-framework",
WebKit,
);
PRODUCT_BUNDLE_IDENTIFIER = net.aliasvault.safari;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
CE0CAF9E2D81A9F7006174AB /* Build configuration list for PBXProject "AliasVault" */ = {
isa = XCConfigurationList;
buildConfigurations = (
CE0CAFC92D81A9F8006174AB /* Debug */,
CE0CAFCA2D81A9F8006174AB /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
CE0CAFCB2D81A9F8006174AB /* Build configuration list for PBXNativeTarget "AliasVault Extension" */ = {
isa = XCConfigurationList;
buildConfigurations = (
CE0CAFCC2D81A9F8006174AB /* Debug */,
CE0CAFCD2D81A9F8006174AB /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
CE0CAFCF2D81A9F8006174AB /* Build configuration list for PBXNativeTarget "AliasVault" */ = {
isa = XCConfigurationList;
buildConfigurations = (
CE0CAFD02D81A9F8006174AB /* Debug */,
CE0CAFD12D81A9F8006174AB /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = CE0CAF9B2D81A9F7006174AB /* Project object */;
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>

View File

@@ -0,0 +1,21 @@
//
// AppDelegate.swift
// AliasVault
//
// Created by Leendert de Borst on 12/03/2025.
//
import Cocoa
@main
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ notification: Notification) {
// Override point for customization after application launch.
}
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
return true
}
}

View File

@@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,68 @@
{
"images" : [
{
"size" : "16x16",
"idiom" : "mac",
"filename" : "mac-icon-16@1x.png",
"scale" : "1x"
},
{
"size" : "16x16",
"idiom" : "mac",
"filename" : "mac-icon-16@2x.png",
"scale" : "2x"
},
{
"size" : "32x32",
"idiom" : "mac",
"filename" : "mac-icon-32@1x.png",
"scale" : "1x"
},
{
"size" : "32x32",
"idiom" : "mac",
"filename" : "mac-icon-32@2x.png",
"scale" : "2x"
},
{
"size" : "128x128",
"idiom" : "mac",
"filename" : "mac-icon-128@1x.png",
"scale" : "1x"
},
{
"size" : "128x128",
"idiom" : "mac",
"filename" : "mac-icon-128@2x.png",
"scale" : "2x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "mac-icon-256@1x.png",
"scale" : "1x"
},
{
"size" : "256x256",
"idiom" : "mac",
"filename" : "mac-icon-256@2x.png",
"scale" : "2x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "mac-icon-512@1x.png",
"scale" : "1x"
},
{
"size" : "512x512",
"idiom" : "mac",
"filename" : "mac-icon-512@2x.png",
"scale" : "2x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 721 B

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,20 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>AliasVault</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'self'">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<link rel="stylesheet" href="../Style.css">
<script src="../Script.js" defer></script>
</head>
<body>
<img src="../Icon.png" width="128" height="128" alt="AliasVault Icon">
<p class="state-unknown">To enable AliasVaults browser extension, go to the Safari Extensions preferences.</p>
<p class="state-on">AliasVaults browser extension is currently enabled in Safari. If you wish to turn it off, go to the Safari Extensions preferences.</p>
<p class="state-off">AliasVaults browser extension is currently disabled in Safari. If you wish to turn it on, go to the Safari Extensions preferences.</p>
<button class="open-preferences">Open Safari Extensions Preferences…</button>
</body>
</html>

View File

@@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="19085" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="B8D-0N-5wS">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19085"/>
<plugIn identifier="com.apple.WebKit2IBPlugin" version="19085"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--Application-->
<scene sceneID="JPo-4y-FX3">
<objects>
<application id="hnw-xV-0zn" sceneMemberID="viewController">
<menu key="mainMenu" title="Main Menu" systemMenu="main" id="AYu-sK-qS6">
<items>
<menuItem title="AliasVault" id="1Xt-HY-uBw">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="AliasVault" systemMenu="apple" id="uQy-DD-JDr">
<items>
<menuItem title="About AliasVault" id="5kV-Vb-QxS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="orderFrontStandardAboutPanel:" target="Ady-hI-5gd" id="Exp-CZ-Vem"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="VOq-y0-SEH"/>
<menuItem title="Hide AliasVault" keyEquivalent="h" id="Olw-nP-bQN">
<connections>
<action selector="hide:" target="Ady-hI-5gd" id="PnN-Uc-m68"/>
</connections>
</menuItem>
<menuItem title="Hide Others" keyEquivalent="h" id="Vdr-fp-XzO">
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
<connections>
<action selector="hideOtherApplications:" target="Ady-hI-5gd" id="VT4-aY-XCT"/>
</connections>
</menuItem>
<menuItem title="Show All" id="Kd2-mp-pUS">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="unhideAllApplications:" target="Ady-hI-5gd" id="Dhg-Le-xox"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="kCx-OE-vgT"/>
<menuItem title="Quit AliasVault" keyEquivalent="q" id="4sb-4s-VLi">
<connections>
<action selector="terminate:" target="Ady-hI-5gd" id="Te7-pn-YzF"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
<menuItem title="Help" id="wpr-3q-Mcd">
<modifierMask key="keyEquivalentModifierMask"/>
<menu key="submenu" title="Help" systemMenu="help" id="F2S-fz-NVQ">
<items>
<menuItem title="AliasVault Help" keyEquivalent="?" id="FKE-Sm-Kum">
<connections>
<action selector="showHelp:" target="Ady-hI-5gd" id="y7X-2Q-9no"/>
</connections>
</menuItem>
</items>
</menu>
</menuItem>
</items>
</menu>
<connections>
<outlet property="delegate" destination="Voe-Tx-rLC" id="PrD-fu-P6m"/>
</connections>
</application>
<customObject id="Voe-Tx-rLC" customClass="AppDelegate" customModuleProvider="target"/>
<customObject id="YLy-65-1bz" customClass="NSFontManager"/>
<customObject id="Ady-hI-5gd" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="76" y="-134"/>
</scene>
<!--Window Controller-->
<scene sceneID="R2V-B0-nI4">
<objects>
<windowController showSeguePresentationStyle="single" id="B8D-0N-5wS" sceneMemberID="viewController">
<window key="window" title="AliasVault" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" restorable="NO" releasedWhenClosed="NO" animationBehavior="default" id="IQv-IB-iLA">
<windowStyleMask key="styleMask" titled="YES" closable="YES"/>
<windowCollectionBehavior key="collectionBehavior" fullScreenNone="YES"/>
<rect key="contentRect" x="196" y="240" width="425" height="325"/>
<rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/>
<connections>
<outlet property="delegate" destination="B8D-0N-5wS" id="98r-iN-zZc"/>
</connections>
</window>
<connections>
<segue destination="XfG-lQ-9wD" kind="relationship" relationship="window.shadowedContentViewController" id="cq2-FE-JQM"/>
</connections>
</windowController>
<customObject id="Oky-zY-oP4" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="250"/>
</scene>
<!--View Controller-->
<scene sceneID="hIz-AP-VOD">
<objects>
<viewController id="XfG-lQ-9wD" customClass="ViewController" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" id="m2S-Jp-Qdl">
<rect key="frame" x="0.0" y="0.0" width="425" height="325"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<wkWebView wantsLayer="YES" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="eOr-cG-IQY">
<rect key="frame" x="0.0" y="0.0" width="425" height="325"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<wkWebViewConfiguration key="configuration">
<audiovisualMediaTypes key="mediaTypesRequiringUserActionForPlayback" none="YES"/>
<wkPreferences key="preferences"/>
</wkWebViewConfiguration>
</wkWebView>
</subviews>
</view>
<connections>
<outlet property="webView" destination="eOr-cG-IQY" id="GFe-mU-dBY"/>
</connections>
</viewController>
<customObject id="rPt-NT-nkU" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="75" y="655"/>
</scene>
</scenes>
</document>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SFSafariWebExtensionConverterVersion</key>
<string>15.4</string>
</dict>
</plist>

View File

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

View File

@@ -0,0 +1,22 @@
function show(enabled, useSettingsInsteadOfPreferences) {
if (useSettingsInsteadOfPreferences) {
document.getElementsByClassName('state-on')[0].innerText = "AliasVault's Safari browser extension is succesfully enabled. If you wish to turn it off, go to the Safari Extensions preferences.";
document.getElementsByClassName('state-off')[0].innerText = "AliasVault's Safari browser extension is currently disabled. If you wish to turn it on, go to the Safari Extensions preferences.";
document.getElementsByClassName('state-unknown')[0].innerText = "To enable AliasVault's Safari browser extension, go to the Safari Extensions preferences.";
document.getElementsByClassName('open-preferences')[0].innerText = "Open Safari Extensions Preferences…";
}
if (typeof enabled === "boolean") {
document.body.classList.toggle(`state-on`, enabled);
document.body.classList.toggle(`state-off`, !enabled);
} else {
document.body.classList.remove(`state-on`);
document.body.classList.remove(`state-off`);
}
}
function openPreferences() {
webkit.messageHandlers.controller.postMessage("open-preferences");
}
document.querySelector("button.open-preferences").addEventListener("click", openPreferences);

View File

@@ -0,0 +1,44 @@
* {
-webkit-user-select: none;
-webkit-user-drag: none;
cursor: default;
}
:root {
color-scheme: light dark;
--spacing: 20px;
}
html {
height: 100%;
}
body {
display: flex;
align-items: center;
justify-content: center;
flex-direction: column;
gap: var(--spacing);
margin: 0 calc(var(--spacing) * 2);
height: 100%;
text-align: center;
font: -apple-system-short-body;
font-family: -apple-system-short-body, system-ui;
}
body:not(.state-on, .state-off) :is(.state-on, .state-off) {
display: none;
}
body.state-on :is(.state-off, .state-unknown) {
display: none;
}
body.state-off :is(.state-on, .state-unknown) {
display: none;
}
button {
font-size: 1em;
}

View File

@@ -0,0 +1,74 @@
//
// ViewController.swift
// AliasVault
//
// Created by Leendert de Borst on 12/03/2025.
//
import Cocoa
import SafariServices
import WebKit
let extensionBundleIdentifier = "net.aliasvault.safari.extension"
class ViewController: NSViewController, WKNavigationDelegate, WKScriptMessageHandler {
@IBOutlet var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
self.webView.navigationDelegate = self
self.webView.configuration.userContentController.add(self, name: "controller")
self.webView.loadFileURL(Bundle.main.url(forResource: "Main", withExtension: "html")!, allowingReadAccessTo: Bundle.main.resourceURL!)
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
SFSafariExtensionManager.getStateOfSafariExtension(withIdentifier: extensionBundleIdentifier) { (state, error) in
guard let state = state, error == nil else {
// Insert code to inform the user that something went wrong.
return
}
DispatchQueue.main.async {
if #available(macOS 13, *) {
webView.evaluateJavaScript("show(\(state.isEnabled), true)")
} else {
webView.evaluateJavaScript("show(\(state.isEnabled), false)")
}
}
}
}
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
if (message.body as! String != "open-preferences") {
return;
}
SFSafariApplication.showPreferencesForExtension(withIdentifier: extensionBundleIdentifier) { error in
DispatchQueue.main.async {
if let error = error {
// Show manual instructions in case opening the preferences fails due to restricted permissions.
let alert = NSAlert()
alert.messageText = "Safari Extensions Settings"
alert.informativeText = """
Please follow these steps to enable the extension:
1. Open Safari
2. Click Safari > Settings in the menu bar
3. Go to Extensions
4. Find and enable "AliasVault"
"""
alert.addButton(withTitle: "OK")
alert.runModal()
}
else {
// Close app
NSApplication.shared.terminate(nil)
}
}
}
}
}

View File

@@ -0,0 +1,29 @@
This folder contains the Xcode project used to publish the Safari version of the AliasVault browser extension to Apple.
This project was created using the `safari-web-extension-converter` tool. This XCode project is a simple wrapper around the
WXT React browser extension, which is required by Apple in order to package and submit a Safari extension.
For more information see:
- https://developer.apple.com/documentation/safariservices/converting-a-web-extension-for-safari
- https://developer.apple.com/documentation/safariservices/running-your-safari-web-extension
To recreate this project, run the following command in the browser-extension root directory:
```bash
# Build the Safari extension via the normal build process (outputs in dist/safari-mv2)
npm run build:safari
# Convert the safari extension to an Xcode project (requires MacOS/XCode command line interface)
xcrun safari-web-extension-converter --bundle-identifier net.aliasvault.safari --macos-only dist/safari-mv2 --project-location safari-xcode --force
# After the Xcode project is opened, you can run the extension by clicking the "Run" button in the top left corner of the Xcode window.
# This will install the extension to your Safari browser and allow you to run it.
```
> Note: This project does not need to be recreated when the extension is updated. It loads all extension files from the dist/safari-mv2 directory that is created by the `build:safari` command. To update the extension and/or publish a new version:
> 1. Run `npm run build:safari` to rebuild the Safari extension
> 2. Open this Xcode project and rebuild it to get the latest version
> 3. Submit the extension to Apple for review via Xcode:
> - Select the "Archive" option from the Product menu
> - Select the newly created archive and click "Distribute App"
> - Select "Distribute" and follow the instructions to submit to App Store Connect

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

View File

@@ -0,0 +1,33 @@
import { browser } from "wxt/browser";
import { defineBackground } from 'wxt/sandbox';
import { onMessage } from "webext-bridge/background";
import { setupContextMenus, handleContextMenuClick } from './background/ContextMenu';
import { handleCheckAuthStatus, handleClearVault, handleCreateIdentity, handleGetCredentials, handleGetDefaultEmailDomain, handleGetDerivedKey, handleGetPasswordSettings, handleGetVault, handleStoreVault, handleSyncVault } from './background/VaultMessageHandler';
import { handleOpenPopup, handlePopupWithCredential } from './background/PopupMessageHandler';
export default defineBackground({
/**
* This is the main entry point for the background script.
*/
main() {
// Set up context menus
setupContextMenus();
browser.contextMenus.onClicked.addListener((info: browser.contextMenus.OnClickData, tab?: browser.tabs.Tab) =>
handleContextMenuClick(info, tab)
);
// Listen for messages using webext-bridge
onMessage('CHECK_AUTH_STATUS', () => handleCheckAuthStatus());
onMessage('STORE_VAULT', ({ data }) => handleStoreVault(data));
onMessage('SYNC_VAULT', () => handleSyncVault());
onMessage('GET_VAULT', () => handleGetVault());
onMessage('CLEAR_VAULT', () => handleClearVault());
onMessage('GET_CREDENTIALS', () => handleGetCredentials());
onMessage('CREATE_IDENTITY', ({ data }) => handleCreateIdentity(data));
onMessage('GET_DEFAULT_EMAIL_DOMAIN', () => handleGetDefaultEmailDomain());
onMessage('GET_PASSWORD_SETTINGS', () => handleGetPasswordSettings());
onMessage('GET_DERIVED_KEY', () => handleGetDerivedKey());
onMessage('OPEN_POPUP', () => handleOpenPopup());
onMessage('OPEN_POPUP_WITH_CREDENTIAL', ({ data }) => handlePopupWithCredential(data));
}
});

View File

@@ -0,0 +1,114 @@
import { sendMessage } from 'webext-bridge/background';
import { PasswordGenerator } from '../../utils/generators/Password/PasswordGenerator';
import { browser } from 'wxt/browser';
/**
* Setup the context menus.
*/
export function setupContextMenus() : void {
// Create root menu
browser.contextMenus.create({
id: "aliasvault-root",
title: "AliasVault",
contexts: ["all"]
});
// Add fill option first (only for editable fields)
browser.contextMenus.create({
id: "aliasvault-activate-form",
parentId: "aliasvault-root",
title: "Autofill with AliasVault",
contexts: ["editable"],
});
// Add separator (only for editable fields)
browser.contextMenus.create({
id: "aliasvault-separator",
parentId: "aliasvault-root",
type: "separator",
contexts: ["editable"],
});
// Add password generator option
browser.contextMenus.create({
id: "aliasvault-generate-password",
parentId: "aliasvault-root",
title: "Generate random password (copy to clipboard)",
contexts: ["all"]
});
}
/**
* Handle context menu clicks.
*/
export function handleContextMenuClick(info: browser.contextMenus.OnClickData, tab?: browser.tabs.Tab) : void {
if (info.menuItemId === "aliasvault-generate-password") {
// Initialize password generator
const passwordGenerator = new PasswordGenerator();
const password = passwordGenerator.generateRandomPassword();
// Use browser.scripting to write password to clipboard from active tab
if (tab?.id) {
browser.scripting.executeScript({
target: { tabId: tab.id },
func: copyPasswordToClipboard,
args: [password]
});
}
}
if (info.menuItemId === "aliasvault-activate-form" && tab?.id) {
// First get the active element's identifier
browser.scripting.executeScript({
target: { tabId: tab.id },
func: getActiveElementIdentifier,
}, (results) => {
const elementIdentifier = results[0]?.result;
if (elementIdentifier) {
// Send message to content script with proper tab targeting
sendMessage('OPEN_AUTOFILL_POPUP', { elementIdentifier }, `content-script@${tab.id}`);
}
});
}
}
/**
* Copy provided password to clipboard.
*/
function copyPasswordToClipboard(generatedPassword: string) : void {
navigator.clipboard.writeText(generatedPassword).then(() => {
showToast('Password copied to clipboard');
});
/**
* Show a toast notification.
*/
function showToast(message: string) : void {
const notification = document.createElement('div');
notification.textContent = message;
notification.style.cssText = `
position: fixed;
top: 20px;
right: 20px;
padding: 16px;
background: #4CAF50;
color: white;
border-radius: 4px;
z-index: 9999;
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
`;
document.body.appendChild(notification);
setTimeout(() => notification.remove(), 3000);
}
}
/**
* Activate AliasVault for the active input element.
*/
function getActiveElementIdentifier() : string {
const target = document.activeElement;
if (target instanceof HTMLInputElement) {
return target.id || target.name || '';
}
return '';
}

View File

@@ -0,0 +1,34 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { browser } from "wxt/browser";
import { BoolResponse } from '../../utils/types/messaging/BoolResponse';
/**
* Handle opening the popup.
*/
export function handleOpenPopup() : Promise<BoolResponse> {
return (async () : Promise<BoolResponse> => {
browser.windows.create({
url: browser.runtime.getURL('/popup.html?mode=inline_unlock&expanded=true'),
type: 'popup',
width: 400,
height: 600,
focused: true
});
return { success: true };
})();
}
/**
* Handle opening the popup with a credential.
*/
export function handlePopupWithCredential(message: any) : Promise<BoolResponse> {
return (async () : Promise<BoolResponse> => {
browser.windows.create({
url: browser.runtime.getURL(`/popup.html?expanded=true#/credentials/${message.credentialId}`),
type: 'popup',
width: 400,
height: 600,
focused: true
});
return { success: true };
})();
}

View File

@@ -0,0 +1,358 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import EncryptionUtility from '../../utils/EncryptionUtility';
import SqliteClient from '../../utils/SqliteClient';
import { WebApiService } from '../../utils/WebApiService';
import { Vault } from '../../utils/types/webapi/Vault';
import { VaultResponse } from '../../utils/types/webapi/VaultResponse';
import { VaultPostResponse } from '../../utils/types/webapi/VaultPostResponse';
import { storage } from 'wxt/storage';
import { BoolResponse as messageBoolResponse } from '../../utils/types/messaging/BoolResponse';
import { VaultResponse as messageVaultResponse } from '../../utils/types/messaging/VaultResponse';
import { CredentialsResponse as messageCredentialsResponse } from '../../utils/types/messaging/CredentialsResponse';
import { DefaultEmailDomainResponse as messageDefaultEmailDomainResponse } from '../../utils/types/messaging/DefaultEmailDomainResponse';
import { PasswordSettingsResponse as messagePasswordSettingsResponse } from '../../utils/types/messaging/PasswordSettingsResponse';
/**
* Check if the user is logged in and if the vault is locked.
*/
export async function handleCheckAuthStatus() : Promise<{ isLoggedIn: boolean, isVaultLocked: boolean }> {
const username = await storage.getItem('local:username');
const accessToken = await storage.getItem('local:accessToken');
const vaultData = await storage.getItem('session:encryptedVault');
const isLoggedIn = username !== null && accessToken !== null;
const isVaultLocked = isLoggedIn && vaultData === null;
return {
isLoggedIn,
isVaultLocked
};
}
/**
* Store the vault in browser storage.
*/
export async function handleStoreVault(
message: any,
) : Promise<messageBoolResponse> {
try {
const vaultResponse = message.vaultResponse as VaultResponse;
const encryptedVaultBlob = vaultResponse.vault.blob;
// Store encrypted vault and derived key in session storage.
await storage.setItems([
{ key: 'session:encryptedVault', value: encryptedVaultBlob },
{ key: 'session:derivedKey', value: message.derivedKey },
{ key: 'session:publicEmailDomains', value: vaultResponse.vault.publicEmailDomainList },
{ key: 'session:privateEmailDomains', value: vaultResponse.vault.privateEmailDomainList },
{ key: 'session:vaultRevisionNumber', value: vaultResponse.vault.currentRevisionNumber }
]);
return { success: true };
} catch (error) {
console.error('Failed to store vault:', error);
return { success: false, error: 'Failed to store vault' };
}
}
/**
* Sync the vault with the server to check if a newer vault is available. If so, the vault will be updated.
*/
export async function handleSyncVault(
) : Promise<messageBoolResponse> {
const webApi = new WebApiService(() => {});
const statusResponse = await webApi.getStatus();
const statusError = webApi.validateStatusResponse(statusResponse);
if (statusError !== null) {
return { success: false, error: statusError };
}
const vaultRevisionNumber = await storage.getItem('session:vaultRevisionNumber') as number;
if (statusResponse.vaultRevision > vaultRevisionNumber) {
// Retrieve the latest vault from the server.
const vaultResponse = await webApi.get<VaultResponse>('Vault');
await storage.setItems([
{ key: 'session:encryptedVault', value: vaultResponse.vault.blob },
{ key: 'session:publicEmailDomains', value: vaultResponse.vault.publicEmailDomainList },
{ key: 'session:privateEmailDomains', value: vaultResponse.vault.privateEmailDomainList },
{ key: 'session:vaultRevisionNumber', value: vaultResponse.vault.currentRevisionNumber }
]);
}
return { success: true };
}
/**
* Get the vault from browser storage.
*/
export async function handleGetVault(
) : Promise<messageVaultResponse> {
try {
const encryptedVault = await storage.getItem('session:encryptedVault') as string;
const derivedKey = await storage.getItem('session:derivedKey') as string;
const publicEmailDomains = await storage.getItem('session:publicEmailDomains') as string[];
const privateEmailDomains = await storage.getItem('session:privateEmailDomains') as string[];
const vaultRevisionNumber = await storage.getItem('session:vaultRevisionNumber') as number;
if (!encryptedVault) {
console.error('Vault not available');
return { success: false, error: 'Vault not available' };
}
const decryptedVault = await EncryptionUtility.symmetricDecrypt(
encryptedVault,
derivedKey
);
return {
success: true,
vault: decryptedVault,
publicEmailDomains: publicEmailDomains ?? [],
privateEmailDomains: privateEmailDomains ?? [],
vaultRevisionNumber: vaultRevisionNumber ?? 0
};
} catch (error) {
console.error('Failed to get vault:', error);
return { success: false, error: 'Failed to get vault' };
}
}
/**
* Clear the vault from browser storage.
*/
export function handleClearVault(
) : messageBoolResponse {
storage.removeItems([
'session:encryptedVault',
'session:derivedKey',
'session:publicEmailDomains',
'session:privateEmailDomains',
'session:vaultRevisionNumber'
]);
return { success: true };
}
/**
* Get all credentials.
*/
export async function handleGetCredentials(
) : Promise<messageCredentialsResponse> {
const derivedKey = await storage.getItem('session:derivedKey') as string;
if (!derivedKey) {
return { success: false, error: 'Vault is locked' };
}
try {
const sqliteClient = await createVaultSqliteClient();
const credentials = sqliteClient.getAllCredentials();
return { success: true, credentials: credentials };
} catch (error) {
console.error('Error getting credentials:', error);
return { success: false, error: 'Failed to get credentials' };
}
}
/**
* Create an identity.
*/
export async function handleCreateIdentity(
message: any,
) : Promise<messageBoolResponse> {
const derivedKey = await storage.getItem('session:derivedKey') as string;
if (!derivedKey) {
return { success: false, error: 'Vault is locked' };
}
try {
const sqliteClient = await createVaultSqliteClient();
// Add the new credential to the vault/database.
sqliteClient.createCredential(message.credential);
// Upload the new vault to the server.
await uploadNewVaultToServer(sqliteClient);
return { success: true };
} catch (error) {
console.error('Failed to create identity:', error);
return { success: false, error: 'Failed to create identity' };
}
}
/**
* Get the email addresses for a vault.
*/
export async function getEmailAddressesForVault(
sqliteClient: SqliteClient
): Promise<string[]> {
// TODO: create separate query to only get email addresses to avoid loading all credentials.
const credentials = sqliteClient.getAllCredentials();
// Get metadata from storage
const privateEmailDomains = await storage.getItem('session:privateEmailDomains') as string[];
const emailAddresses = credentials
.filter(cred => cred.Email != null)
.map(cred => cred.Email)
.filter((email, index, self) => self.indexOf(email) === index);
return emailAddresses.filter(email => {
const domain = email.split('@')[1];
return privateEmailDomains.includes(domain);
});
}
/**
* Get default email domain for a vault.
*/
export function handleGetDefaultEmailDomain(
) : Promise<messageDefaultEmailDomainResponse> {
return (async () : Promise<messageDefaultEmailDomainResponse> => {
try {
const privateEmailDomains = await storage.getItem('session:privateEmailDomains') as string[];
const publicEmailDomains = await storage.getItem('session:publicEmailDomains') as string[];
const sqliteClient = await createVaultSqliteClient();
const defaultEmailDomain = sqliteClient.getDefaultEmailDomain();
/**
* Check if a domain is valid.
*/
const isValidDomain = (domain: string) : boolean => {
const isValid = (domain &&
domain !== 'DISABLED.TLD' &&
(privateEmailDomains.includes(domain) || publicEmailDomains.includes(domain))) as boolean;
return isValid;
};
// First check if the default domain that is configured in the vault is still valid.
if (defaultEmailDomain && isValidDomain(defaultEmailDomain)) {
return { success: true, domain: defaultEmailDomain };
}
// If default domain is not valid, fall back to first available private domain.
const firstPrivate = privateEmailDomains.find(isValidDomain);
if (firstPrivate) {
return { success: true, domain: firstPrivate };
}
// Return first valid public domain if no private domains are available.
const firstPublic = publicEmailDomains.find(isValidDomain);
if (firstPublic) {
return { success: true, domain: firstPublic };
}
// Return null if no valid domains are found
return { success: true };
} catch (error) {
console.error('Error getting default email domain:', error);
return { success: false, error: 'Failed to get default email domain' };
}
})();
}
/**
* Get the password settings.
*/
export async function handleGetPasswordSettings(
) : Promise<messagePasswordSettingsResponse> {
try {
const sqliteClient = await createVaultSqliteClient();
const passwordSettings = sqliteClient.getPasswordSettings();
return { success: true, settings: passwordSettings };
} catch (error) {
console.error('Error getting password settings:', error);
return { success: false, error: 'Failed to get password settings' };
}
}
/**
* Get the derived key for the encrypted vault.
*/
export async function handleGetDerivedKey(
) : Promise<string> {
const derivedKey = await storage.getItem('session:derivedKey') as string;
return derivedKey;
}
/**
* Upload a new version of the vault to the server using the provided sqlite client.
*/
async function uploadNewVaultToServer(sqliteClient: SqliteClient) : Promise<void> {
const updatedVaultData = sqliteClient.exportToBase64();
const derivedKey = await storage.getItem('session:derivedKey') as string;
const encryptedVault = await EncryptionUtility.symmetricEncrypt(
updatedVaultData,
derivedKey
);
await storage.setItems([
{ key: 'session:encryptedVault', value: encryptedVault }
]);
// Get metadata from storage
const vaultRevisionNumber = await storage.getItem('session:vaultRevisionNumber') as number;
// Upload new encrypted vault to server.
const username = await storage.getItem('local:username') as string;
const emailAddresses = await getEmailAddressesForVault(sqliteClient);
const newVault: Vault = {
blob: encryptedVault,
createdAt: new Date().toISOString(),
credentialsCount: sqliteClient.getAllCredentials().length,
currentRevisionNumber: vaultRevisionNumber,
emailAddressList: emailAddresses,
privateEmailDomainList: [], // Empty on purpose, API will not use this for vault updates.
publicEmailDomainList: [], // Empty on purpose, API will not use this for vault updates.
encryptionPublicKey: '', // Empty on purpose, only required if new public/private key pair is generated.
client: '', // Empty on purpose, API will not use this for vault updates.
updatedAt: new Date().toISOString(),
username: username,
version: sqliteClient.getDatabaseVersion() ?? '0.0.0'
};
const webApi = new WebApiService(() => {});
const response = await webApi.post<Vault, VaultPostResponse>('Vault', newVault);
// Check if response is successful (.status === 0)
if (response.status === 0) {
await storage.setItem('session:vaultRevisionNumber', response.newRevisionNumber);
} else {
throw new Error('Failed to upload new vault to server');
}
}
/**
* Create a new sqlite client for the stored vault.
*/
async function createVaultSqliteClient() : Promise<SqliteClient> {
const encryptedVault = await storage.getItem('session:encryptedVault') as string;
const derivedKey = await storage.getItem('session:derivedKey') as string;
if (!encryptedVault || !derivedKey) {
throw new Error('No vault or derived key found');
}
// Decrypt the vault.
const decryptedVault = await EncryptionUtility.symmetricDecrypt(
encryptedVault,
derivedKey
);
// Initialize the SQLite client with the decrypted vault.
const sqliteClient = new SqliteClient();
await sqliteClient.initializeFromBase64(decryptedVault);
return sqliteClient;
}

View File

@@ -0,0 +1,109 @@
import './contentScript/style.css';
import { FormDetector } from '../utils/formDetector/FormDetector';
import { isAutoShowPopupEnabled, openAutofillPopup, removeExistingPopup } from './contentScript/Popup';
import { injectIcon, popupDebounceTimeHasPassed } from './contentScript/Form';
import { onMessage } from "webext-bridge/content-script";
import { BoolResponse as messageBoolResponse } from '../utils/types/messaging/BoolResponse';
import { defineContentScript } from 'wxt/sandbox';
import { createShadowRootUi } from 'wxt/client';
export default defineContentScript({
matches: ['<all_urls>'],
cssInjectionMode: 'ui',
allFrames: true,
matchAboutBlank: true,
runAt: 'document_start',
/**
* Main entry point for the content script.
*/
async main(ctx) {
if (ctx.isInvalid) {
return;
}
// Create a shadow root UI for isolation
const ui = await createShadowRootUi(ctx, {
name: 'aliasvault-ui',
position: 'inline',
anchor: 'body',
/**
* Handle mount.
*/
onMount(container) {
/**
* Handle input field focus.
*/
const handleFocusIn = async (e: FocusEvent) : Promise<void> => {
if (ctx.isInvalid) {
return;
}
// Check if element itself, html or body has av-disable attribute like av-disable="true"
const avDisable = (e.target as HTMLElement).getAttribute('av-disable') ?? document.body?.getAttribute('av-disable') ?? document.documentElement.getAttribute('av-disable');
if (avDisable === 'true') {
return;
}
const target = e.target as HTMLInputElement;
const textInputTypes = ['text', 'email', 'tel', 'password', 'search', 'url'];
if (target.tagName === 'INPUT' && textInputTypes.includes(target.type) && !target.dataset.aliasvaultIgnore) {
const formDetector = new FormDetector(document, target);
if (!formDetector.containsLoginForm()) {
return;
}
injectIcon(target, container);
// Only show popup if its enabled and debounce time has passed.
if (await isAutoShowPopupEnabled() && popupDebounceTimeHasPassed()) {
openAutofillPopup(target, container);
}
}
};
// Listen for input field focus in the main document
document.addEventListener('focusin', handleFocusIn);
// Listen for popstate events (back/forward navigation)
window.addEventListener('popstate', () => {
if (ctx.isInvalid) {
return;
}
removeExistingPopup(container);
});
// Listen for messages from the background script
onMessage('OPEN_AUTOFILL_POPUP', async (message: { data: { elementIdentifier: string } }) : Promise<messageBoolResponse> => {
const { data } = message;
const { elementIdentifier } = data;
if (!elementIdentifier) {
return { success: false, error: 'No element identifier provided' };
}
const target = document.getElementById(elementIdentifier) ?? document.getElementsByName(elementIdentifier)[0];
if (!(target instanceof HTMLInputElement)) {
return { success: false, error: 'Target element is not an input field' };
}
const formDetector = new FormDetector(document, target);
if (!formDetector.containsLoginForm(true)) {
return { success: false, error: 'No form found' };
}
injectIcon(target, container);
openAutofillPopup(target, container);
return { success: true };
});
},
});
// Mount the UI to create the shadow root
ui.autoMount();
},
});

View File

@@ -0,0 +1,63 @@
import { CombinedStopWords } from "@/utils/formDetector/FieldPatterns";
import { Credential } from "../../utils/types/Credential";
/**
* Filter credentials based on current URL and page context to determine which credentials to show
* in the autofill popup.
*/
export function filterCredentials(credentials: Credential[], currentUrl: string, pageTitle: string): Credential[] {
const urlObject = new URL(currentUrl);
const baseUrl = `${urlObject.protocol}//${urlObject.hostname}`;
// 1. Exact URL match
let filtered = credentials.filter(cred =>
cred.ServiceUrl?.toLowerCase() === currentUrl.toLowerCase()
);
// 2. Base URL match with fuzzy domain comparison if no exact matches
filtered = filtered.concat(credentials.filter(cred => {
if (!cred.ServiceUrl) {
return false;
}
try {
const credUrlObject = new URL(cred.ServiceUrl);
const currentUrlObject = new URL(baseUrl);
// Extract root domains by splitting on dots and taking last two parts
const credDomainParts = credUrlObject.hostname.toLowerCase().split('.');
const currentDomainParts = currentUrlObject.hostname.toLowerCase().split('.');
// Get root domain (last two parts, e.g., 'aliasvaul.net')
const credRootDomain = credDomainParts.slice(-2).join('.');
const currentRootDomain = currentDomainParts.slice(-2).join('.');
// Compare protocols and root domains
return credUrlObject.protocol === currentUrlObject.protocol &&
credRootDomain === currentRootDomain;
} catch {
return false;
}
}));
// 3. Page title word match if still no matches
if (filtered.length === 0 && pageTitle.length > 0) {
const titleWords = pageTitle.toLowerCase()
.split(/\s+/)
.filter(word =>
word.length > 3 && // Filter out words shorter than 4 characters
!CombinedStopWords.has(word.toLowerCase()) // Filter out generic words
);
filtered = credentials.filter(cred =>
titleWords.some(word =>
cred.ServiceName.toLowerCase().includes(word)
)
);
}
// Ensure we have unique credentials
const uniqueCredentials = Array.from(new Map(filtered.map(cred => [cred.Id, cred])).values());
// Show max 3 results
return uniqueCredentials.slice(0, 3);
}

View File

@@ -0,0 +1,221 @@
import { FormDetector } from "../../utils/formDetector/FormDetector";
import { FormFiller } from "../../utils/formDetector/FormFiller";
import { Credential } from "../../utils/types/Credential";
import { openAutofillPopup } from "./Popup";
/**
* Global timestamp to track popup debounce time.
* This is used to not show the popup again for a specific amount of time.
* Used after autofill events to prevent spamming the popup from automatic
* triggered browser events which can cause "focus" events to trigger.
*/
let popupDebounceTime = 0;
/**
* Check if popup can be shown based on debounce time.
*/
export function popupDebounceTimeHasPassed() : boolean {
if (Date.now() < popupDebounceTime) {
return false;
}
return true;
}
/**
* Hide popup for a specific amount of time.
*/
export function hidePopupFor(ms: number) : void {
popupDebounceTime = Date.now() + ms;
}
/**
* Fill credential into current form.
*
* @param credential - The credential to fill.
* @param input - The input element that triggered the popup. Required when filling credentials to know which form to fill.
*/
export function fillCredential(credential: Credential, input: HTMLInputElement) : void {
// Set debounce time to 800ms to prevent the popup from being shown again within 800ms because of autofill events.
hidePopupFor(800);
const formDetector = new FormDetector(document, input);
const form = formDetector.getForm();
if (!form) {
// No form found, so we can't fill anything.
return;
}
const formFiller = new FormFiller(form, triggerInputEvents);
formFiller.fillFields(credential);
}
/**
* Inject icon for a focused input element
*/
export function injectIcon(input: HTMLInputElement, container: HTMLElement): void {
const aliasvaultIconSvg = `<?xml version="1.0" encoding="UTF-8"?>
<svg enable-background="new 0 0 500 500" version="1.1" viewBox="0 0 500 500" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
<path d="m459.87 294.95c0.016205 5.4005 0.03241 10.801-0.35022 16.873-1.111 6.3392-1.1941 12.173-2.6351 17.649-10.922 41.508-36.731 69.481-77.351 83.408-7.2157 2.4739-14.972 3.3702-22.479 4.995-23.629 0.042205-47.257 0.11453-70.886 0.12027-46.762 0.011322-93.523-0.01416-140.95-0.43411-8.59-2.0024-16.766-2.8352-24.398-5.3326-21.595-7.0666-39.523-19.656-53.708-37.552-10.227-12.903-17.579-27.17-21.28-43.221-1.475-6.3967-2.4711-12.904-3.6852-19.361-0.051849-5.747-0.1037-11.494 0.26915-17.886 4.159-42.973 27.68-71.638 63.562-92.153 0-0.70761-0.001961-1.6988 3.12e-4 -2.69 0.022484-9.8293-1.3071-19.894 0.35664-29.438 3.2391-18.579 11.08-35.272 23.763-49.773 12.098-13.832 26.457-23.989 43.609-30.029 7.813-2.7512 16.14-4.0417 24.234-5.9948 7.392-0.025734 14.784-0.05146 22.835 0.32253 4.1959 0.95392 7.7946 1.2538 11.258 2.1053 17.16 4.2192 32.287 12.176 45.469 24.104 2.2558 2.0411 4.372 6.6241 9.621 3.868 16.839-8.8419 34.718-11.597 53.603-8.594 16.791 2.6699 31.602 9.4308 44.236 20.636 11.531 10.227 19.84 22.841 25.393 37.236 6.3436 16.445 10.389 33.163 6.0798 49.389 7.9587 8.9321 15.807 16.704 22.421 25.414 9.162 12.065 15.33 25.746 18.144 40.776 0.97046 5.1848 1.9111 10.375 2.8654 15.563m-71.597 71.012c5.5615-5.2284 12.002-9.7986 16.508-15.817 10.474-13.992 14.333-29.916 11.288-47.446-2.2496-12.95-8.1973-24.076-17.243-33.063-12.746-12.663-28.865-18.614-46.786-18.569-69.912 0.17712-139.82 0.56831-209.74 0.96176-15.922 0.089599-29.168 7.4209-39.685 18.296-14.45 14.944-20.408 33.343-16.655 54.368 2.2763 12.754 8.2167 23.748 17.158 32.66 13.299 13.255 30.097 18.653 48.728 18.651 59.321-0.005188 118.64 0.042358 177.96-0.046601 9.5912-0.014374 19.181-0.86588 28.773-0.88855 10.649-0.025146 19.978-3.825 29.687-9.1074z" fill="#EEC170"/>
<path d="m162.77 293c15.654 4.3883 20.627 22.967 10.304 34.98-5.3104 6.1795-14.817 8.3208-24.278 5.0472-7.0723-2.4471-12.332-10.362-12.876-17.933-1.0451-14.542 11.089-23.176 21.705-23.046 1.5794 0.019287 3.1517 0.61566 5.1461 0.95184z" fill="#EEC170"/>
<path d="m227.18 293.64c7.8499 2.3973 11.938 8.2143 13.524 15.077 1.8591 8.0439-0.44817 15.706-7.1588 21.121-6.7633 5.4572-14.417 6.8794-22.578 3.1483-8.2972-3.7933-12.836-10.849-12.736-19.438 0.1687-14.497 14.13-25.368 28.948-19.908z" fill="#EEC170"/>
<path d="m261.57 319.07c-2.495-14.418 4.6853-22.603 14.596-26.108 9.8945-3.4995 23.181 3.4303 26.267 13.779 4.6504 15.591-7.1651 29.064-21.665 28.161-8.5254-0.53088-17.202-6.5094-19.198-15.831z" fill="#EEC170"/>
<path d="m336.91 333.41c-9.0175-4.2491-15.337-14.349-13.829-21.682 3.0825-14.989 13.341-20.304 23.018-19.585 10.653 0.79141 17.93 7.407 19.765 17.547 1.9588 10.824-4.1171 19.939-13.494 23.703-5.272 2.1162-10.091 1.5086-15.46 0.017883z" fill="#EEC170"/>
</svg>`;
const ICON_HTML = `
<div class="av-input-icon">
<img src="data:image/svg+xml;base64,${btoa(aliasvaultIconSvg)}" style="width: 100%; height: 100%;" />
</div>
`;
// Generate unique ID if input doesn't have one
if (!input.id) {
input.id = `aliasvault-input-${Math.random().toString(36).substring(2, 11)}`;
}
// Create an overlay container at document level if it doesn't exist
let overlayContainer = container.querySelector('#aliasvault-overlay-container');
if (!overlayContainer) {
overlayContainer = document.createElement('div') as HTMLElement;
overlayContainer.id = 'aliasvault-overlay-container';
overlayContainer.className = 'av-overlay-container';
container.appendChild(overlayContainer);
}
// Create the icon element from the HTML template
const iconContainer = document.createElement('div');
iconContainer.innerHTML = ICON_HTML;
const icon = iconContainer.firstElementChild as HTMLElement;
icon.setAttribute('data-icon-for', input.id);
// Enable pointer events just for the icon
icon.style.pointerEvents = 'auto';
/**
* Update position of the icon.
*/
const updateIconPosition = () : void => {
const rect = input.getBoundingClientRect();
icon.style.position = 'fixed';
icon.style.top = `${rect.top + (rect.height - 24) / 2}px`;
icon.style.left = `${rect.right - 32}px`;
};
// Update position initially and on relevant events
updateIconPosition();
window.addEventListener('scroll', updateIconPosition, true);
window.addEventListener('resize', updateIconPosition);
// Add click event to trigger the autofill popup and refocus the input
icon.addEventListener('click', (e: MouseEvent) => {
e.preventDefault();
e.stopPropagation();
setTimeout(() => input.focus(), 0);
openAutofillPopup(input, container);
});
// Append the icon to the overlay container
overlayContainer.appendChild(icon);
// Fade in the icon
requestAnimationFrame(() => {
icon.style.opacity = '1';
});
/**
* Remove the icon when the input loses focus.
*/
const handleBlur = (): void => {
icon.style.opacity = '0';
setTimeout(() => {
icon.remove();
input.removeEventListener('blur', handleBlur);
input.removeEventListener('keydown', handleKeyPress);
window.removeEventListener('scroll', updateIconPosition, true);
window.removeEventListener('resize', updateIconPosition);
// Remove overlay container if it's empty
if (!overlayContainer.children.length) {
overlayContainer.remove();
}
}, 200);
};
/**
* Handle key press to dismiss icon.
*/
const handleKeyPress = (e: KeyboardEvent): void => {
// Dismiss on Enter, Escape, or Tab.
if (e.key === 'Enter' || e.key === 'Escape' || e.key === 'Tab') {
handleBlur();
}
};
input.addEventListener('blur', handleBlur);
input.addEventListener('keydown', handleKeyPress);
}
/**
* Trigger input events for an element to trigger form validation
* which some websites require before the "continue" button is enabled.
*/
function triggerInputEvents(element: HTMLInputElement | HTMLSelectElement, animate: boolean = true) : void {
// Add keyframe animation if animation is requested
if (animate) {
// Create an overlay div that will show the highlight effect
const overlay = document.createElement('div');
/**
* Update position of the overlay.
*/
const updatePosition = () : void => {
const rect = element.getBoundingClientRect();
overlay.style.cssText = `
position: fixed;
z-index: 999999991;
pointer-events: none;
top: ${rect.top}px;
left: ${rect.left}px;
width: ${rect.width}px;
height: ${rect.height}px;
background-color: rgba(244, 149, 65, 0.3);
border-radius: ${getComputedStyle(element).borderRadius};
animation: fadeOut 1.4s ease-out forwards;
`;
};
updatePosition();
// Add scroll event listener
window.addEventListener('scroll', updatePosition);
const style = document.createElement('style');
style.textContent = `
@keyframes fadeOut {
0% { opacity: 1; transform: scale(1.02); }
100% { opacity: 0; transform: scale(1); }
}
`;
document.head.appendChild(style);
document.body.appendChild(overlay);
// Remove overlay and cleanup after animation
setTimeout(() => {
window.removeEventListener('scroll', updatePosition);
overlay.remove();
style.remove();
}, 1400);
}
// Trigger events
element.dispatchEvent(new Event('input', { bubbles: true }));
element.dispatchEvent(new Event('change', { bubbles: true }));
if (element.type === 'radio') {
element.dispatchEvent(new MouseEvent('mousedown', { bubbles: true }));
element.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }));
element.dispatchEvent(new MouseEvent('click', { bubbles: true }));
}
}

View File

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,424 @@
/* AliasVault Content Script Styles */
body {
position: absolute;
}
/* Base Popup Styles */
.av-popup {
position: absolute;
z-index: 2147483646;
background-color: rgb(31, 41, 55);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
width: 320px;
border: 1px solid rgb(55, 65, 81);
border-radius: 4px;
max-width: 90vw;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
font-size: 14px;
color: #333;
overflow: hidden;
box-sizing: border-box;
margin-top: 4px;
}
/* Loading Popup Styles */
.av-loading-container {
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
gap: 8px;
}
.av-loading-spinner {
width: 20px;
height: 20px;
fill: none;
stroke: currentColor;
stroke-width: 2;
}
.av-loading-text {
font-size: 14px;
font-weight: 500;
line-height: normal;
color: #e5e7eb;
}
/* Credential List Styles */
.av-credential-list {
max-height: 180px;
overflow-y: auto;
scrollbar-width: thin;
scrollbar-color: #4b5563 #1f2937;
line-height: 1.3;
}
.av-credential-item {
cursor: pointer;
display: flex;
align-items: center;
gap: 8px;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
transition: background-color 0.2s ease;
border-radius: 4px;
width: 100%;
box-sizing: border-box;
text-align: left;
}
.av-credential-item:hover {
background-color: #2d3748;
}
.av-credential-info {
display: flex;
align-items: center;
gap: 16px;
flex-grow: 1;
padding: 10px 16px;
border-radius: 4px;
transition: background-color 0.2s ease;
min-width: 0;
}
.av-credential-logo {
width: 20px;
height: 20px;
}
.av-credential-text {
display: flex;
flex-direction: column;
flex-grow: 1;
min-width: 0;
margin-right: 8px;
}
.av-service-name {
font-weight: 500;
white-space: nowrap;
overflow: hidden;
font-size: 14px;
text-overflow: ellipsis;
color: #f3f4f6;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}
.av-service-details {
font-size: 0.85em;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
color: #9ca3af;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}
.av-popout-icon {
display: flex;
align-items: center;
padding: 4px;
margin-right: 16px;
opacity: 0.6;
border-radius: 4px;
flex-shrink: 0;
color: #ffffff;
transition: opacity 0.2s ease, background-color 0.2s ease, color 0.2s ease;
}
.av-popout-icon:hover {
opacity: 1;
background-color: #ffffff;
color: #000000;
}
.av-no-matches {
padding-left: 10px;
padding-top: 8px;
padding-bottom: 8px;
font-size: 14px;
color: #9ca3af;
font-style: italic;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
text-align: left;
}
/* Divider */
.av-divider {
height: 1px;
background: #374151;
margin-bottom: 8px;
}
/* Action Container */
.av-action-container {
display: flex;
padding-left: 8px;
padding-right: 8px;
padding-bottom: 8px;
gap: 8px;
}
/* Button Styles */
.av-button {
padding: 6px 12px;
border-radius: 4px;
background: #374151;
color: #e5e7eb;
font-size: 14px;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
cursor: pointer;
border: none;
display: flex;
align-items: center;
justify-content: center;
gap: 4px;
transition: background-color 0.2s ease;
}
.av-button:hover {
background-color: #4b5563;
}
.av-button-primary {
background-color: #374151;
}
.av-button-primary:hover {
background-color: #d68338;
}
.av-button-close {
padding: 6px;
}
.av-button-close:hover {
background-color: #dc2626;
color: #ffffff;
}
/* Search Input */
.av-search-input {
flex: 2;
border-radius: 4px;
background: #374151;
color: #e5e7eb;
font-size: 14px;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
border: 1px solid #4b5563;
outline: none;
line-height: 1;
text-align: center;
}
.av-search-input::placeholder {
color: #bdbebe;
}
.av-search-input:focus {
border-color: #2563eb;
box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.2);
}
/* Vault Locked Popup */
.av-vault-locked {
padding: 12px 16px;
position: relative;
}
.av-vault-locked:hover {
background-color: #374151;
}
.av-vault-locked-container {
display: flex;
align-items: center;
padding-right: 32px;
width: 100%;
transition: background-color 0.2s ease;
border-radius: 4px;
}
.av-vault-locked-message {
color: #d1d5db;
font-size: 14px;
flex-grow: 1;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}
.av-vault-locked-button {
background: none;
border: none;
cursor: pointer;
padding: 4px;
padding-right: 28px;
display: flex;
align-items: center;
justify-content: center;
color: #d68338;
border-radius: 4px;
margin-left: 8px;
}
.av-vault-locked-close {
position: absolute;
right: 8px;
top: 50%;
transform: translateY(-50%);
padding: 4px;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
z-index: 1;
border: 1px solid #6f6f6f;
}
/* Create Name Popup */
.av-create-popup-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 2147483647;
display: flex;
align-items: center;
justify-content: center;
}
.av-create-popup {
position: relative;
z-index: 1000000000;
background: #1f2937;
border: 1px solid #374151;
border-radius: 8px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1),
0 2px 4px -1px rgba(0, 0, 0, 0.06),
0 20px 25px -5px rgba(0, 0, 0, 0.1);
width: 400px;
max-width: 90vw;
transform: scale(0.95);
opacity: 0;
padding: 24px;
transition: transform 0.2s ease, opacity 0.2s ease;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
}
.av-create-popup.show {
transform: scale(1);
opacity: 1;
}
.av-create-popup-title {
margin: 0 0 16px 0;
font-size: 18px;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
font-weight: 600;
color: #f8f9fa;
}
.av-create-popup-input {
width: 100%;
padding: 8px 12px;
margin-bottom: 24px;
border: 1px solid #374151;
border-radius: 6px;
background: #374151;
color: #f8f9fa;
font-size: 14px;
transition: border-color 0.2s ease, box-shadow 0.2s ease;
box-sizing: border-box;
}
.av-create-popup-input:focus {
border-color: #2563eb;
box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
}
.av-create-popup-actions {
display: flex;
justify-content: flex-end;
gap: 12px;
}
.av-create-popup-cancel {
padding: 8px 16px;
border-radius: 6px;
border: 1px solid #374151;
background: transparent;
color: #f8f9fa;
cursor: pointer;
font-size: 14px;
transition: all 0.2s ease;
}
.av-create-popup-cancel:hover {
background: #374151;
}
.av-create-popup-save {
padding: 8px 16px;
border-radius: 6px;
border: none;
background: #d68338;
color: white;
cursor: pointer;
font-size: 14px;
transition: all 0.2s ease;
}
.av-create-popup-save:hover {
background: #c97731;
transform: translateY(-1px);
}
/* SVG Icons */
.av-icon {
width: 16px;
height: 16px;
fill: none;
stroke: currentColor;
stroke-width: 2;
}
.av-icon-lock {
width: 20px;
height: 20px;
fill: none;
stroke: currentColor;
stroke-width: 2;
stroke-linecap: round;
stroke-linejoin: round;
}
/* Form Icon Styles */
.av-overlay-container {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: 2147483640;
}
.av-input-icon {
display: flex;
align-items: center;
justify-content: center;
position: absolute;
cursor: pointer;
width: 24px;
height: 24px;
pointer-events: auto;
opacity: 0;
transition: opacity 0.2s ease-in-out;
}
@keyframes fadeOut {
0% { opacity: 1; transform: scale(1.02); }
100% { opacity: 0; transform: scale(1); }
}

View File

@@ -0,0 +1,112 @@
import React, { useState, useEffect } from 'react';
import { HashRouter as Router, Routes, Route } from 'react-router-dom';
import { useAuth } from './context/AuthContext';
import { useMinDurationLoading } from '../../hooks/useMinDurationLoading';
import Header from './components/Layout/Header';
import BottomNav from './components/Layout/BottomNav';
import AuthSettings from './pages/AuthSettings';
import CredentialsList from './pages/CredentialsList';
import EmailsList from './pages/EmailsList';
import LoadingSpinner from './components/LoadingSpinner';
import Home from './pages/Home';
import CredentialDetails from './pages/CredentialDetails';
import EmailDetails from './pages/EmailDetails';
import Settings from './pages/Settings';
import GlobalStateChangeHandler from './components/GlobalStateChangeHandler';
import { useLoading } from './context/LoadingContext';
import Logout from './pages/Logout';
import './style.css';
/**
* Route configuration.
*/
type RouteConfig = {
path: string;
element: React.ReactNode;
showBackButton?: boolean;
title?: string;
};
/**
* App component.
*/
const App: React.FC = () => {
const authContext = useAuth();
const { isInitialLoading } = useLoading();
const [isLoading, setIsLoading] = useMinDurationLoading(true, 150);
const [message, setMessage] = useState<string | null>(null);
// Add these route configurations
const routes: RouteConfig[] = [
{ path: '/', element: <Home />, showBackButton: false },
{ path: '/auth-settings', element: <AuthSettings />, showBackButton: true, title: 'Settings' },
{ path: '/credentials', element: <CredentialsList />, showBackButton: false },
{ path: '/credentials/:id', element: <CredentialDetails />, showBackButton: true, title: 'Credential details' },
{ path: '/emails', element: <EmailsList />, showBackButton: false },
{ path: '/emails/:id', element: <EmailDetails />, showBackButton: true, title: 'Email details' },
{ path: '/settings', element: <Settings />, showBackButton: false },
{ path: '/logout', element: <Logout />, showBackButton: false },
];
useEffect(() => {
if (!isInitialLoading) {
setIsLoading(false);
}
}, [isInitialLoading, setIsLoading]);
/**
* Print global message if it exists.
*/
useEffect(() => {
if (authContext.globalMessage) {
setMessage(authContext.globalMessage);
} else {
setMessage(null);
}
}, [authContext, authContext.globalMessage]);
return (
<Router>
<div className="min-h-screen min-w-[350px] bg-white dark:bg-gray-900 flex flex-col">
{isLoading && (
<div className="fixed inset-0 bg-white dark:bg-gray-900 z-50 flex items-center justify-center">
<LoadingSpinner />
</div>
)}
<GlobalStateChangeHandler />
<Header
routes={routes}
/>
<main
className="flex-1 overflow-y-auto bg-gray-100 dark:bg-gray-900"
style={{
paddingTop: '64px',
height: 'calc(100% - 120px)',
maxHeight: '600px',
}}
>
<div className="p-4 mb-16">
{message && (
<p className="text-red-500 mb-4">{message}</p>
)}
<Routes>
{routes.map((route) => (
<Route
key={route.path}
path={route.path}
element={route.element}
/>
))}
</Routes>
</div>
</main>
<BottomNav />
</div>
</Router>
);
};
export default App;

View File

@@ -0,0 +1,35 @@
import React from 'react';
type ButtonProps = {
onClick: () => void;
children: React.ReactNode;
type?: 'button' | 'submit' | 'reset';
variant?: 'primary' | 'secondary';
};
/**
* Button component
*/
const Button: React.FC<ButtonProps> = ({
onClick,
children,
type = 'button',
variant = 'primary'
}) => {
const colorClasses = {
primary: 'bg-primary-500 hover:bg-primary-600',
secondary: 'bg-gray-500 hover:bg-gray-600'
};
return (
<button
className={`${colorClasses[variant]} text-white font-medium rounded-lg px-4 py-2 text-sm w-full`}
onClick={onClick}
type={type}
>
{children}
</button>
);
};
export default Button;

View File

@@ -0,0 +1,172 @@
import React, { useState, useEffect } from 'react';
import { useWebApi } from '../context/WebApiContext';
import { useDb } from '../context/DbContext';
import EncryptionUtility from '../../../utils/EncryptionUtility';
import { MailboxEmail } from '../../../utils/types/webapi/MailboxEmail';
import { Link } from 'react-router-dom';
import { AppInfo } from '../../../utils/AppInfo';
import { storage } from 'wxt/storage';
type EmailPreviewProps = {
email: string;
}
/**
* This component shows a preview of the latest emails in the inbox.
*/
export const EmailPreview: React.FC<EmailPreviewProps> = ({ email }) => {
const [emails, setEmails] = useState<MailboxEmail[]>([]);
const [loading, setLoading] = useState(true);
const [lastEmailId, setLastEmailId] = useState<number>(0);
const [isSpamOk, setIsSpamOk] = useState(false);
const webApi = useWebApi();
const dbContext = useDb();
/**
* Checks if the email is a public domain.
*/
const isPublicDomain = async (emailAddress: string): Promise<boolean> => {
// Get metadata from storage
const publicEmailDomains = await storage.getItem('session:publicEmailDomains') as string[] ?? [];
return publicEmailDomains.some(domain => emailAddress.toLowerCase().endsWith(domain));
};
useEffect(() => {
/**
* Loads the latest emails from the server and decrypts them locally if needed.
*/
const loadEmails = async (): Promise<void> => {
try {
const isPublic = await isPublicDomain(email);
setIsSpamOk(isPublic);
if (isPublic) {
// For public domains (SpamOK), use the SpamOK API directly
const emailPrefix = email.split('@')[0];
const response = await fetch(`https://api.spamok.com/v2/EmailBox/${emailPrefix}`, {
headers: {
'X-Asdasd-Platform-Id': 'av-chrome',
'X-Asdasd-Platform-Version': AppInfo.VERSION,
}
});
const data = await response.json();
// Only show the latest 2 emails to save space in UI
const latestMails = data?.mails
?.toSorted((a: MailboxEmail, b: MailboxEmail) =>
new Date(b.dateSystem).getTime() - new Date(a.dateSystem).getTime())
?.slice(0, 2) ?? [];
if (loading && latestMails.length > 0) {
setLastEmailId(latestMails[0].id);
}
setEmails(latestMails);
} else {
// For private domains, use existing encrypted email logic
const response = await webApi.get(`EmailBox/${email}`);
const data = response as { mails: MailboxEmail[] };
// Only show the latest 2 emails to save space in UI
const latestMails = data.mails
.toSorted((a, b) => new Date(b.dateSystem).getTime() - new Date(a.dateSystem).getTime())
.slice(0, 2);
if (latestMails) {
// Loop through all emails and decrypt them locally
const decryptedEmails: MailboxEmail[] = await EncryptionUtility.decryptEmailList(
latestMails,
dbContext.sqliteClient!.getAllEncryptionKeys()
);
if (loading && decryptedEmails.length > 0) {
setLastEmailId(decryptedEmails[0].id);
}
setEmails(decryptedEmails);
}
}
} catch (err) {
console.error('Error loading emails:', err);
}
setLoading(false);
};
loadEmails();
// Set up auto-refresh interval
const interval = setInterval(loadEmails, 2000);
return () : void => clearInterval(interval);
}, [email, loading, webApi, dbContext]);
if (loading) {
return (
<div className="text-gray-500 dark:text-gray-400 mb-4">
<div className="flex items-center gap-2 mb-2">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white">Recent emails</h2>
<div className="w-2 h-2 bg-green-500 rounded-full animate-pulse" />
</div>
Loading emails...
</div>
);
}
if (emails.length === 0) {
return (
<div className="text-gray-500 dark:text-gray-400 mb-4">
<div className="flex items-center gap-2 mb-2">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white">Recent emails</h2>
<div className="w-2 h-2 bg-green-500 rounded-full animate-pulse" />
</div>
No emails received yet.
</div>
);
}
return (
<div className="space-y-2 mb-4">
<div className="flex items-center gap-2 mb-2">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white">Recent emails</h2>
<div className="w-2 h-2 bg-green-500 rounded-full animate-pulse" />
</div>
{emails.map((mail) => (
isSpamOk ? (
<a
key={mail.id}
href={`https://spamok.com/${email.split('@')[0]}/${mail.id}`}
target="_blank"
rel="noopener noreferrer"
className={`flex justify-between items-center p-2 ps-3 pe-3 rounded cursor-pointer bg-white dark:bg-gray-800 shadow hover:shadow-md transition-all border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 ${
mail.id > lastEmailId ? 'bg-yellow-50 dark:bg-yellow-900/30' : ''
}`}
>
<div className="truncate flex-1">
<span className="text-sm text-gray-900 dark:text-white">
{mail.subject.substring(0, 30)}{mail.subject.length > 30 ? '...' : ''}
</span>
</div>
<div className="text-xs text-gray-500 dark:text-gray-400 ml-2">
{new Date(mail.dateSystem).toLocaleDateString()}
</div>
</a>
) : (
<Link
key={mail.id}
to={`/emails/${mail.id}`}
className={`flex justify-between items-center p-2 ps-3 pe-3 rounded cursor-pointer bg-white dark:bg-gray-800 shadow hover:shadow-md transition-all border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 ${
mail.id > lastEmailId ? 'bg-yellow-50 dark:bg-yellow-900/30' : ''
}`}
>
<span className="truncate flex-1">
<span className="text-sm text-gray-900 dark:text-white">
{mail.subject.substring(0, 30)}{mail.subject.length > 30 ? '...' : ''}
</span>
</span>
<span className="text-xs text-gray-500 dark:text-gray-400 ml-2">
{new Date(mail.dateSystem).toLocaleDateString()}
</span>
</Link>
)
))}
</div>
);
};

View File

@@ -0,0 +1,90 @@
import React, { useState, useEffect } from 'react';
import { ClipboardCopyService } from '../utils/ClipboardCopyService';
/**
* Form input copy to clipboard props.
*/
type FormInputCopyToClipboardProps = {
id: string;
label: string;
value: string;
type?: 'text' | 'password';
}
const clipboardService = new ClipboardCopyService();
/**
* Form input copy to clipboard component.
*/
export const FormInputCopyToClipboard: React.FC<FormInputCopyToClipboardProps> = ({
id,
label,
value,
type = 'text'
}) => {
const [showPassword, setShowPassword] = useState(false);
const [copied, setCopied] = useState(false);
useEffect(() => {
const unsubscribe = clipboardService.subscribe((copiedId) : void => {
setCopied(copiedId === id);
});
return () : void => {
unsubscribe();
};
}, [id]);
/**
* Copy to clipboard.
*/
const copyToClipboard = async () : Promise<void> => {
try {
await navigator.clipboard.writeText(value);
clipboardService.setCopied(id);
// Reset copied state after 2 seconds
setTimeout(() => {
if (clipboardService.getCopiedId() === id) {
clipboardService.setCopied('');
}
}, 2000);
} catch (err) {
console.error('Failed to copy text:', err);
}
};
return (
<div>
<label htmlFor={id} className="block mb-2 text-sm font-medium text-gray-700 dark:text-gray-300">
{label}
</label>
<div className="relative">
<input
type={type === 'password' && !showPassword ? 'password' : 'text'}
id={id}
readOnly
value={value}
onClick={copyToClipboard}
className={`w-full px-3 py-2.5 bg-white border ${
copied ? 'border-green-500 border-2' : 'border-gray-300'
} text-gray-900 sm:text-sm rounded-lg shadow-sm focus:ring-primary-500 focus:border-primary-500 dark:bg-gray-700 dark:border-gray-600 dark:text-white dark:placeholder-gray-400`}
/>
<div className="absolute right-2 top-1/2 -translate-y-1/2 flex items-center gap-2">
{copied && (
<span className="text-green-500 dark:text-green-400">
Copied!
</span>
)}
{type === 'password' && (
<button
onClick={() => setShowPassword(!showPassword)}
className="px-3 py-1 text-sm text-gray-600 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white transition-colors duration-200"
>
{showPassword ? 'Hide' : 'Show'}
</button>
)}
</div>
</div>
</div>
);
};

View File

@@ -0,0 +1,40 @@
import React, { useEffect, useRef } from 'react';
import { useNavigate } from 'react-router-dom';
import { useAuth } from '../context/AuthContext';
/**
* Global state change handler component which listens for global state changes and e.g. redirects user to login
* page if login state changes.
*/
const GlobalStateChangeHandler: React.FC = () => {
const authContext = useAuth();
const navigate = useNavigate();
const lastLoginState = useRef(authContext.isLoggedIn);
const initialRender = useRef(true);
/**
* Listen for auth logged in changes and redirect to home page if logged in state changes to handle logins and logouts.
*/
useEffect(() => {
// Only navigate when auth state is different from the last state we acted on.
if (lastLoginState.current !== authContext.isLoggedIn) {
lastLoginState.current = authContext.isLoggedIn;
/**
* Skip the first auth state change to avoid redirecting when popup opens for the first time
* which already causes the auth state to change from false to true.
*/
if (initialRender.current) {
initialRender.current = false;
return;
}
// Redirect to home page if logged in state changes.
navigate('/');
}
}, [authContext.isLoggedIn]); // eslint-disable-line react-hooks/exhaustive-deps
return null;
};
export default GlobalStateChangeHandler;

View File

@@ -0,0 +1,89 @@
import React, { useState, useEffect } from 'react';
import { useNavigate, useLocation } from 'react-router-dom';
import { useAuth } from '../../context/AuthContext';
import { useDb } from '../../context/DbContext';
type TabName = 'credentials' | 'emails' | 'settings';
/**
* Bottom nav component.
*/
const BottomNav: React.FC = () => {
const authContext = useAuth();
const dbContext = useDb();
const navigate = useNavigate();
const location = useLocation();
const [currentTab, setCurrentTab] = useState<TabName>('credentials');
// Add effect to update currentTab based on route
useEffect(() => {
const path = location.pathname.substring(1) as TabName;
if (['credentials', 'emails', 'settings'].includes(path)) {
setCurrentTab(path);
}
}, [location]);
/**
* Handle tab change.
*/
const handleTabChange = (tab: TabName) : void => {
setCurrentTab(tab);
navigate(`/${tab}`);
};
if (!authContext.isLoggedIn || !dbContext.dbAvailable) {
return null;
}
// Detect if the user is coming from the unlock page with mode=inline_unlock.
const urlParams = new URLSearchParams(window.location.search);
const isInlineUnlockMode = urlParams.get('mode') === 'inline_unlock';
if (isInlineUnlockMode) {
// Do not show the bottom nav for inline unlock mode.
return null;
}
return (
<div className="fixed bottom-0 left-0 right-0 bg-white dark:bg-gray-800 border-t border-gray-200 dark:border-gray-700">
<div className="flex justify-around items-center h-14">
<button
onClick={() => handleTabChange('credentials')}
className={`flex flex-col items-center justify-center w-1/3 h-full ${
currentTab === 'credentials' ? 'text-primary-600 dark:text-primary-500' : 'text-gray-500 dark:text-gray-400'
}`}
>
<svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 7a2 2 0 012 2m4 0a6 6 0 01-7.743 5.743L11 17H9v2H7v2H4a1 1 0 01-1-1v-2.586a1 1 0 01.293-.707l5.964-5.964A6 6 0 1121 9z" />
</svg>
<span className="text-xs mt-1">Credentials</span>
</button>
<button
onClick={() => handleTabChange('emails')}
className={`flex flex-col items-center justify-center w-1/3 h-full ${
currentTab === 'emails' ? 'text-primary-600 dark:text-primary-500' : 'text-gray-500 dark:text-gray-400'
}`}
>
<svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 8l7.89 5.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z" />
</svg>
<span className="text-xs mt-1">Emails</span>
</button>
<button
onClick={() => handleTabChange('settings')}
className={`flex flex-col items-center justify-center w-1/3 h-full ${
currentTab === 'settings' ? 'text-primary-600 dark:text-primary-500' : 'text-gray-500 dark:text-gray-400'
}`}
>
<svg className="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" />
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 12a3 3 0 11-6 0 3 3 0 016 0z" />
</svg>
<span className="text-xs mt-1">Settings</span>
</button>
</div>
</div>
);
};
export default BottomNav;

View File

@@ -0,0 +1,140 @@
import React from 'react';
import { UserMenu } from './UserMenu';
import { useNavigate, useLocation } from 'react-router-dom';
import { useAuth } from '../../context/AuthContext';
import { AppInfo } from '../../../../utils/AppInfo';
import { storage } from 'wxt/storage';
/**
* Header props.
*/
type HeaderProps = {
routes?: {
path: string;
showBackButton?: boolean;
title?: string;
}[];
}
/**
* Header component.
*/
const Header: React.FC<HeaderProps> = ({
routes = []
}) => {
const authContext = useAuth();
const navigate = useNavigate();
const location = useLocation();
/**
* Open the client tab.
*/
const openClientTab = async () : Promise<void> => {
const settingClientUrl = await storage.getItem('local:clientUrl') as string;
let clientUrl = AppInfo.DEFAULT_CLIENT_URL;
if (settingClientUrl && settingClientUrl.length > 0) {
clientUrl = settingClientUrl;
}
window.open(clientUrl, '_blank');
};
// Updated route matching logic to handle URL parameters
const currentRoute = routes?.find(route => {
// Convert route pattern to regex
const pattern = route.path.replace(/:\w+/g, '[^/]+');
const regex = new RegExp(`^${pattern}$`);
return regex.test(location.pathname);
});
/**
* Handle settings.
*/
const handleSettings = () : void => {
navigate('/auth-settings');
};
/**
* Handle logo click.
*/
const logoClick = () : void => {
// If logged in, navigate to credentials.
if (authContext.isLoggedIn) {
navigate('/credentials');
} else {
// If not logged in, navigate to index.
navigate('/');
}
};
return (
<header className="fixed z-30 w-full bg-white border-b border-gray-200 dark:bg-gray-800 dark:border-gray-700">
<div className="flex items-center h-16 px-4">
{currentRoute?.showBackButton ? (
<button
id="back"
onClick={() => navigate(-1)}
className="flex items-center gap-2 hover:bg-gray-100 dark:hover:bg-gray-700 pr-2 pt-1.5 pb-1.5 rounded-lg group"
>
<div className="flex items-center">
<svg className="w-5 h-5 text-gray-500 group-hover:text-gray-900 dark:text-gray-400 dark:group-hover:text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
</svg>
{currentRoute.title && (
<h1 className="text-lg font-medium text-gray-900 dark:text-white ml-2">
{currentRoute.title}
</h1>
)}
</div>
</button>
) : (
<div className="flex items-center">
<button
onClick={() => logoClick()}
className="flex items-center hover:opacity-80 transition-opacity"
>
<img src="/assets/images/logo.svg" alt="AliasVault" className="h-8 w-8 mr-2" />
<h1 className="text-gray-900 dark:text-white text-xl font-bold">AliasVault</h1>
{/* Hide beta badge on Safari as it's not allowed to show non-production badges */}
{!import.meta.env.SAFARI && (
<span className="text-primary-500 text-[10px] ml-1 font-normal">BETA</span>
)}
</button>
</div>
)}
<div className="flex-grow" />
<div className="flex items-center">
{!currentRoute?.showBackButton ? (
<button
onClick={openClientTab}
className="p-2"
>
<svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4 text-gray-400" viewBox="0 0 20 20" fill="currentColor">
<path d="M11 3a1 1 0 100 2h2.586l-6.293 6.293a1 1 0 101.414 1.414L15 6.414V9a1 1 0 102 0V4a1 1 0 00-1-1h-5z" />
<path d="M5 5a2 2 0 00-2 2v8a2 2 0 002 2h8a2 2 0 002-2v-3a1 1 0 10-2 0v3H5V7h3a1 1 0 000-2H5z" />
</svg>
</button>
) : (<></>)}
</div>
{!authContext.isLoggedIn ? (
<button
id="settings"
onClick={(handleSettings)}
className="p-1 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-700"
>
<span className="sr-only">Settings</span>
<svg className="w-5 h-5" aria-hidden="true" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path fillRule="evenodd" d="M11.49 3.17c-.38-1.56-2.6-1.56-2.98 0a1.532 1.532 0 01-2.286.948c-1.372-.836-2.942.734-2.106 2.106.54.886.061 2.042-.947 2.287-1.561.379-1.561 2.6 0 2.978a1.532 1.532 0 01.947 2.287c-.836 1.372.734 2.942 2.106 2.106a1.532 1.532 0 012.287.947c.379 1.561 2.6 1.561 2.978 0a1.533 1.533 0 012.287-.947c1.372.836 2.942-.734 2.106-2.106a1.533 1.533 0 01.947-2.287c1.561-.379 1.561-2.6 0-2.978a1.532 1.532 0 01-.947-2.287c.836-1.372-.734-2.942-2.106-2.106a1.532 1.532 0 01-2.287-.947zM10 13a3 3 0 100-6 3 3 0 000 6z" clipRule="evenodd" />
</svg>
</button>
) : (
<UserMenu />
)}
</div>
</header>
);
};
export default Header;

View File

@@ -0,0 +1,91 @@
import React, { useState, useRef, useEffect } from 'react';
import { useAuth } from '../../context/AuthContext';
import { useNavigate } from 'react-router-dom';
import { useLoading } from '../../context/LoadingContext';
/**
* User menu component.
*/
export const UserMenu: React.FC = () => {
const authContext = useAuth();
const [isUserMenuOpen, setIsUserMenuOpen] = useState(false);
const menuRef = useRef<HTMLDivElement>(null);
const buttonRef = useRef<HTMLButtonElement>(null);
const navigate = useNavigate();
const { showLoading, hideLoading } = useLoading();
useEffect(() => {
/**
* Handle clicking outside the user menu.
*/
const handleClickOutside = (event: MouseEvent) : void => {
if (
menuRef.current &&
buttonRef.current &&
!menuRef.current.contains(event.target as Node) &&
!buttonRef.current.contains(event.target as Node)
) {
setIsUserMenuOpen(false);
}
};
document.addEventListener('mousedown', handleClickOutside);
return () : void => {
document.removeEventListener('mousedown', handleClickOutside);
};
}, []);
/**
* Toggle the user menu.
*/
const toggleUserMenu = () : void => {
setIsUserMenuOpen(!isUserMenuOpen);
};
/**
* Handle logging out.
*/
const onLogout = async () : Promise<void> => {
showLoading();
navigate('/logout', { replace: true });
hideLoading();
};
return (
<div className="relative flex items-center">
<div className="relative">
<button
ref={buttonRef}
onClick={toggleUserMenu}
className="flex items-center text-sm text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200"
>
<span className="sr-only">Open menu</span>
<svg className="w-6 h-6" aria-hidden="true" fill="currentColor" viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg">
<path fillRule="evenodd" d="M3 5a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 10a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1zM3 15a1 1 0 011-1h12a1 1 0 110 2H4a1 1 0 01-1-1z" clipRule="evenodd" />
</svg>
</button>
{isUserMenuOpen && (
<div
ref={menuRef}
className="absolute right-0 z-50 mt-2 w-48 py-1 bg-white rounded-lg shadow-lg dark:bg-gray-700 border border-gray-200 dark:border-gray-600"
>
<div className="px-4 py-3 border-b border-gray-200 dark:border-gray-600">
<span className="block text-sm font-semibold text-gray-900 dark:text-white">
{authContext.username}
</span>
</div>
<button
onClick={onLogout}
className="w-full text-left px-4 py-2 text-sm text-red-600 hover:bg-gray-100 dark:text-red-400 dark:hover:bg-gray-600"
>
Logout
</button>
</div>
)}
</div>
</div>
);
};
export default UserMenu;

View File

@@ -0,0 +1,39 @@
import React from 'react';
/**
* Loading spinner component used throughout the app for showing a loading spinner
* inline in the page.
*/
const LoadingSpinner: React.FC = () => {
const spinnerStyle: React.CSSProperties = {
width: '40px',
height: '40px',
borderRadius: '50%',
animation: 'spin 1s linear infinite',
};
const spinner = (
<>
<style>
{`
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
`}
</style>
<div
className="border-[4px] border-solid border-current/10 dark:border-white/10 border-t-current dark:border-t-white"
style={spinnerStyle}
/>
</>
);
return (
<div className="inline-flex items-center">
{spinner}
</div>
);
};
export default LoadingSpinner;

View File

@@ -0,0 +1,48 @@
import React from 'react';
import { useLoading } from '../context/LoadingContext';
/**
* Loading spinner full screen component used throughout the app for showing a loading spinner
* that covers the entire screen.
*/
const LoadingSpinnerFullScreen: React.FC = () => {
const { isLoading } = useLoading();
if (!isLoading) {
return null;
}
const spinnerStyle: React.CSSProperties = {
width: '40px',
height: '40px',
borderRadius: '50%',
animation: 'spin 1s linear infinite',
};
const spinner = (
<>
<style>
{`
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
`}
</style>
<div
className="border-[4px] border-solid border-current/10 dark:border-white/10 border-t-current dark:border-t-white"
style={spinnerStyle}
/>
</>
);
return (
<div className="fixed inset-0 w-full h-full z-50 bg-gray-200 dark:bg-gray-500 bg-opacity-90 flex items-center justify-center">
<div className="relative">
{spinner}
</div>
</div>
);
};
export default LoadingSpinnerFullScreen;

View File

@@ -0,0 +1,48 @@
import React, { useState, useEffect } from 'react';
import { useNavigate } from 'react-router-dom';
import { AppInfo } from '../../../utils/AppInfo';
import { storage } from 'wxt/storage';
/**
* Component for displaying the login server information.
*/
const LoginServerInfo: React.FC = () => {
const [baseUrl, setBaseUrl] = useState<string>('');
const navigate = useNavigate();
useEffect(() => {
/**
* Loads the base URL for the login server.
*/
const loadApiUrl = async () : Promise<void> => {
const apiUrl = await storage.getItem('local:apiUrl') as string;
setBaseUrl(apiUrl ?? AppInfo.DEFAULT_API_URL);
};
loadApiUrl();
}, []);
const isDefaultServer = !baseUrl || baseUrl === AppInfo.DEFAULT_API_URL;
const displayUrl = isDefaultServer ? 'aliasvault.net' : new URL(baseUrl).hostname;
/**
* Handles the click event for the login server information.
*/
const handleClick = () : void => {
navigate('/auth-settings');
};
return (
<div className="text-xs text-gray-600 dark:text-gray-400 mb-4">
(Connecting to{' '}
<button
onClick={handleClick}
type="button"
className="text-orange-500 hover:text-orange-600 dark:text-orange-400 dark:hover:text-orange-500 underline"
>
{displayUrl}
</button>)
</div>
);
};
export default LoginServerInfo;

View File

@@ -0,0 +1,34 @@
import React from 'react';
/**
* Reload button props.
*/
type ReloadButtonProps = {
onClick: () => void;
};
/**
* Reload button component.
*/
const ReloadButton: React.FC<ReloadButtonProps> = ({ onClick }) => {
return (
<div
className="px-2 items-center"
>
<div className="relative inline-flex items-center">
<button onClick={onClick} className="absolute p-2 hover:bg-gray-200 rounded-2xl">
<svg xmlns="http://www.w3.org/2000/svg" className="h-4 w-4 text-gray-400" viewBox="0 0 20 20" fill="currentColor">
<path fillRule="evenodd" d="M4 2a1 1 0 011 1v2.101a7.002 7.002 0 0111.601 2.566 1 1 0 11-1.885.666A5.002 5.002 0 005.999 7H9a1 1 0 010 2H4a1 1 0 01-1-1V3a1 1 0 011-1zm.008 9.057a1 1 0 011.276.61A5.002 5.002 0 0014.001 13H11a1 1 0 110-2h5a1 1 0 011 1v5a1 1 0 11-2 0v-2.101a7.002 7.002 0 01-11.601-2.566 1 1 0 01.61-1.276z" clipRule="evenodd" />
</svg>
</button>
<svg aria-hidden="true" className="inline w-8 h-8 text-gray-200 dark:text-gray-600" viewBox="0 0 100 101" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z" fill="currentColor" />
<path d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z" fill="currentFill" />
</svg>
</div>
<span className="sr-only">Loading...</span>
</div>
);
};
export default ReloadButton;

View File

@@ -0,0 +1,192 @@
import React, { useState, useEffect } from 'react';
import { useDb } from '../context/DbContext';
import { TotpCode } from '../../../utils/types/TotpCode';
import * as OTPAuth from 'otpauth';
type TotpViewerProps = {
credentialId: string;
}
/**
* This component shows TOTP codes for a credential.
*/
export const TotpViewer: React.FC<TotpViewerProps> = ({ credentialId }) => {
const [totpCodes, setTotpCodes] = useState<TotpCode[]>([]);
const [loading, setLoading] = useState(true);
const [currentCodes, setCurrentCodes] = useState<Record<string, string>>({});
const [copiedId, setCopiedId] = useState<string | null>(null);
const dbContext = useDb();
/**
* Gets the remaining seconds for the TOTP code.
*/
const getRemainingSeconds = (step = 30): number => {
const totp = new OTPAuth.TOTP({
secret: 'dummy', // We only need this for timing calculations
algorithm: 'SHA1',
digits: 6,
period: step
});
return totp.period - (Math.floor(Date.now() / 1000) % totp.period);
};
/**
* Gets the remaining percentage for the TOTP code.
*/
const getRemainingPercentage = (): number => {
const remaining = getRemainingSeconds();
// Invert the percentage so it counts down instead of up
return Math.floor(((30.0 - remaining) / 30.0) * 100);
};
/**
* Generates a TOTP code for a given secret key.
*/
const generateTotpCode = (secretKey: string): string => {
try {
const totp = new OTPAuth.TOTP({
secret: secretKey,
algorithm: 'SHA1',
digits: 6,
period: 30
});
return totp.generate();
} catch (error) {
console.error('Error generating TOTP code:', error);
return 'Error';
}
};
/**
* Copies a TOTP code to the clipboard.
*/
const copyToClipboard = async (code: string, id: string): Promise<void> => {
try {
await navigator.clipboard.writeText(code);
setCopiedId(id);
// Reset copied state after 2 seconds
setTimeout(() => {
setCopiedId(null);
}, 2000);
} catch (error) {
console.error('Failed to copy:', error);
}
};
useEffect(() => {
/**
* Loads the TOTP codes for the credential.
*/
const loadTotpCodes = async (): Promise<void> => {
if (!dbContext?.sqliteClient) {
return;
}
try {
const codes = dbContext.sqliteClient.getTotpCodesForCredential(credentialId);
setTotpCodes(codes);
} catch (error) {
console.error('Error loading TOTP codes:', error);
} finally {
setLoading(false);
}
};
loadTotpCodes();
}, [credentialId, dbContext?.sqliteClient]);
useEffect(() => {
/**
* Updates the current TOTP codes.
*/
const updateTotpCodes = (prevCodes: Record<string, string>): Record<string, string> => {
const newCodes: Record<string, string> = {};
totpCodes.forEach(code => {
const generatedCode = generateTotpCode(code.SecretKey);
// Only update if we have a valid code
if (generatedCode !== 'Error') {
newCodes[code.Id] = generatedCode;
} else {
// Keep the previous code if there's an error
newCodes[code.Id] = prevCodes[code.Id] ?? 'Error';
}
});
return newCodes;
};
// Generate initial codes
const initialCodes: Record<string, string> = {};
totpCodes.forEach(code => {
initialCodes[code.Id] = generateTotpCode(code.SecretKey);
});
setCurrentCodes(initialCodes);
// Set up interval to refresh codes
const intervalId = setInterval(() => {
setCurrentCodes(updateTotpCodes);
}, 1000);
// Clean up interval on unmount or when totpCodes change
return () : void => {
clearInterval(intervalId);
};
}, [totpCodes]);
if (loading) {
return (
<div className="text-gray-500 dark:text-gray-400 mb-4">
<h2 className="text-lg font-semibold text-gray-900 dark:text-white mb-2">Two-factor authentication</h2>
Loading TOTP codes...
</div>
);
}
if (totpCodes.length === 0) {
return null;
}
return (
<div className="mb-4">
<div className="space-y-2">
<h2 className="text-base font-semibold text-gray-900 dark:text-white">Two-factor authentication</h2>
<div className="grid grid-cols-1 gap-2">
{totpCodes.map(totpCode => (
<button
key={totpCode.Id}
className={`w-full text-left p-2 ps-3 pe-3 rounded bg-white dark:bg-gray-800 shadow hover:shadow-md transition-all border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700`}
onClick={() => copyToClipboard(currentCodes[totpCode.Id], totpCode.Id)}
aria-label={`Copy ${totpCode.Name} code`}
>
<div className="flex justify-between items-center gap-2">
<div className="flex items-center flex-1">
<h4 className="text-sm font-medium text-gray-900 dark:text-white">{totpCode.Name}</h4>
</div>
<div className="flex items-center gap-2">
<div className="flex flex-col items-end">
<span className="text-lg font-bold text-gray-900 dark:text-white">
{currentCodes[totpCode.Id]}
</span>
<div className="text-xs">
{copiedId === totpCode.Id ? (
<span className="text-green-600 dark:text-green-400">Copied!</span>
) : (
<span className="text-gray-500 dark:text-gray-400">{getRemainingSeconds()}s</span>
)}
</div>
</div>
<div className="w-1 h-6 bg-gray-200 rounded-full dark:bg-gray-600">
<div
className="bg-blue-600 rounded-full transition-all"
style={{ height: `${getRemainingPercentage()}%`, width: '100%' }}
/>
</div>
</div>
</div>
</button>
))}
</div>
</div>
</div>
);
};

View File

@@ -0,0 +1,126 @@
import React, { createContext, useContext, useState, useEffect, useMemo, useCallback } from 'react';
import { useDb } from './DbContext';
import { storage } from 'wxt/storage';
import { sendMessage } from 'webext-bridge/popup';
import { VAULT_LOCKED_DISMISS_UNTIL_KEY } from '@/entrypoints/contentScript/Popup';
type AuthContextType = {
isLoggedIn: boolean;
isInitialized: boolean;
username: string | null;
setAuthTokens: (username: string, accessToken: string, refreshToken: string) => Promise<void>;
login: () => Promise<void>;
logout: (errorMessage?: string) => Promise<void>;
globalMessage: string | null;
clearGlobalMessage: () => void;
}
/**
* Auth context.
*/
const AuthContext = createContext<AuthContextType | undefined>(undefined);
/**
* AuthProvider to provide the authentication state to the app that components can use.
*/
export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
const [isLoggedIn, setIsLoggedIn] = useState(false);
const [isInitialized, setIsInitialized] = useState(false);
const [username, setUsername] = useState<string | null>(null);
const [globalMessage, setGlobalMessage] = useState<string | null>(null);
const dbContext = useDb();
/**
* Check for tokens in chrome storage on initial load.
*/
useEffect(() => {
/**
* Initialize the authentication state.
*/
const initializeAuth = async () : Promise<void> => {
const accessToken = await storage.getItem('local:accessToken') as string;
const refreshToken = await storage.getItem('local:refreshToken') as string;
const username = await storage.getItem('local:username') as string;
if (accessToken && refreshToken && username) {
setUsername(username);
setIsLoggedIn(true);
}
setIsInitialized(true);
};
initializeAuth();
}, []);
/**
* Set auth tokens in chrome storage as part of the login process. After db is initialized, the login method should be called as well.
*/
const setAuthTokens = useCallback(async (username: string, accessToken: string, refreshToken: string) : Promise<void> => {
await storage.setItem('local:username', username);
await storage.setItem('local:accessToken', accessToken);
await storage.setItem('local:refreshToken', refreshToken);
setUsername(username);
}, []);
/**
* Set logged in status to true which refreshes the app.
*/
const login = useCallback(async () : Promise<void> => {
setIsLoggedIn(true);
// Clear dismiss until (which can be enabled after user has dimissed vault is locked popup) to ensure popup is shown.
await storage.setItem(VAULT_LOCKED_DISMISS_UNTIL_KEY, 0);
}, []);
/**
* Logout the user and clear the auth tokens from chrome storage.
*/
const logout = useCallback(async (errorMessage?: string) : Promise<void> => {
await sendMessage('CLEAR_VAULT', {}, 'background');
await storage.removeItems(['local:username', 'local:accessToken', 'local:refreshToken']);
dbContext?.clearDatabase();
// Set local storage global message that will be shown on the login page.
if (errorMessage) {
setGlobalMessage(errorMessage);
}
setUsername(null);
setIsLoggedIn(false);
}, [dbContext]);
/**
* Clear global message (called after displaying the message).
*/
const clearGlobalMessage = useCallback(() : void => {
setGlobalMessage(null);
}, []);
const contextValue = useMemo(() => ({
isLoggedIn,
isInitialized,
username,
setAuthTokens,
login,
logout,
globalMessage,
clearGlobalMessage,
}), [isLoggedIn, isInitialized, username, globalMessage, setAuthTokens, login, logout, clearGlobalMessage]);
return (
<AuthContext.Provider value={contextValue}>
{children}
</AuthContext.Provider>
);
};
/**
* Hook to use the AuthContext
*/
export const useAuth = () : AuthContextType => {
const context = useContext(AuthContext);
if (context === undefined) {
throw new Error('useAuth must be used within an AuthProvider');
}
return context;
};

View File

@@ -0,0 +1,151 @@
import React, { createContext, useContext, useState, useEffect, useCallback, useMemo } from 'react';
import SqliteClient from '../../../utils/SqliteClient';
import { VaultResponse } from '../../../utils/types/webapi/VaultResponse';
import EncryptionUtility from '../../../utils/EncryptionUtility';
import { VaultResponse as messageVaultResponse } from '../../../utils/types/messaging/VaultResponse';
import { sendMessage } from 'webext-bridge/popup';
type DbContextType = {
sqliteClient: SqliteClient | null;
dbInitialized: boolean;
dbAvailable: boolean;
initializeDatabase: (vaultResponse: VaultResponse, derivedKey: string) => Promise<void>;
clearDatabase: () => void;
vaultRevision: number;
publicEmailDomains: string[];
privateEmailDomains: string[];
}
const DbContext = createContext<DbContextType | undefined>(undefined);
/**
* DbProvider to provide the SQLite client to the app that components can use to make database queries.
*/
export const DbProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
/**
* SQLite client.
*/
const [sqliteClient, setSqliteClient] = useState<SqliteClient | null>(null);
/**
* Database initialization state. If true, the database has been initialized and the dbAvailable state is correct.
*/
const [dbInitialized, setDbInitialized] = useState(false);
/**
* Database availability state. If true, the database is available. If false, the database is not available and needs to be unlocked or retrieved again from the API.
*/
const [dbAvailable, setDbAvailable] = useState(false);
/**
* Public email domains.
*/
const [publicEmailDomains, setPublicEmailDomains] = useState<string[]>([]);
/**
* Vault revision.
*/
const [vaultRevision, setVaultRevision] = useState(0);
/**
* Private email domains.
*/
const [privateEmailDomains, setPrivateEmailDomains] = useState<string[]>([]);
const initializeDatabase = useCallback(async (vaultResponse: VaultResponse, derivedKey: string) => {
// Attempt to decrypt the blob.
const decryptedBlob = await EncryptionUtility.symmetricDecrypt(
vaultResponse.vault.blob,
derivedKey
);
// Initialize the SQLite client.
const client = new SqliteClient();
await client.initializeFromBase64(decryptedBlob);
setSqliteClient(client);
setDbInitialized(true);
setDbAvailable(true);
setPublicEmailDomains(vaultResponse.vault.publicEmailDomainList);
setPrivateEmailDomains(vaultResponse.vault.privateEmailDomainList);
setVaultRevision(vaultResponse.vault.currentRevisionNumber);
/*
* Store encrypted vault in background worker.
*/
sendMessage('STORE_VAULT', {
derivedKey: derivedKey,
vaultResponse: vaultResponse,
}, 'background');
}, []);
const checkStoredVault = useCallback(async () => {
try {
const response = await sendMessage('GET_VAULT', {}, 'background') as messageVaultResponse;
if (response?.vault) {
const client = new SqliteClient();
await client.initializeFromBase64(response.vault);
setSqliteClient(client);
setDbInitialized(true);
setDbAvailable(true);
setPublicEmailDomains(response.publicEmailDomains ?? []);
setPrivateEmailDomains(response.privateEmailDomains ?? []);
setVaultRevision(response.vaultRevisionNumber ?? 0);
} else {
setDbInitialized(true);
setDbAvailable(false);
}
} catch (error) {
console.error('Error retrieving vault from background:', error);
setDbInitialized(true);
setDbAvailable(false);
}
}, []);
/**
* Check if database is initialized and try to retrieve vault from background
*/
useEffect(() : void => {
if (!dbInitialized) {
checkStoredVault();
}
}, [dbInitialized, checkStoredVault]);
/**
* Clear database and remove from background worker, called when logging out.
*/
const clearDatabase = useCallback(() : void => {
setSqliteClient(null);
setDbInitialized(false);
sendMessage('CLEAR_VAULT', {}, 'background');
}, []);
const contextValue = useMemo(() => ({
sqliteClient,
dbInitialized,
dbAvailable,
initializeDatabase,
clearDatabase,
vaultRevision,
publicEmailDomains,
privateEmailDomains
}), [sqliteClient, dbInitialized, dbAvailable, initializeDatabase, clearDatabase, vaultRevision, publicEmailDomains, privateEmailDomains]);
return (
<DbContext.Provider value={contextValue}>
{children}
</DbContext.Provider>
);
};
/**
* Hook to use the DbContext
*/
export const useDb = () : DbContextType => {
const context = useContext(DbContext);
if (context === undefined) {
throw new Error('useDb must be used within a DbProvider');
}
return context;
};

View File

@@ -0,0 +1,71 @@
import React, { createContext, useContext, useState, useMemo } from 'react';
import LoadingSpinnerFullScreen from '../components/LoadingSpinnerFullScreen';
type LoadingContextType = {
isLoading: boolean;
showLoading: () => void;
hideLoading: () => void;
isInitialLoading: boolean;
setIsInitialLoading: (isInitialLoading: boolean) => void;
}
/**
* Loading context.
*/
const LoadingContext = createContext<LoadingContextType | undefined>(undefined);
/**
* Loading provider
*/
export const LoadingProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
/**
* Initial loading state for when extension is first loaded. This initial loading state is
* hidden by the component that is rendered when the extension is first loaded to prevent
* multiple loading spinners from being shown.
*/
const [isInitialLoading, setIsInitialLoading] = useState(true);
/**
* Loading state that can be used by other components during normal operation.
*/
const [isLoading, setIsLoading] = useState(false);
/**
* Show loading spinner
*/
const showLoading = (): void => setIsLoading(true);
/**
* Hide loading spinner
*/
const hideLoading = (): void => setIsLoading(false);
const value = useMemo(
() => ({
isLoading,
showLoading,
hideLoading,
isInitialLoading,
setIsInitialLoading,
}),
[isLoading, isInitialLoading]
);
return (
<LoadingContext.Provider value={value}>
<LoadingSpinnerFullScreen />
{children}
</LoadingContext.Provider>
);
};
/**
* Hook to use loading state
*/
export const useLoading = (): LoadingContextType => {
const context = useContext(LoadingContext);
if (context === undefined) {
throw new Error('useLoading must be used within a LoadingProvider');
}
return context;
};

View File

@@ -0,0 +1,134 @@
import React, { createContext, useContext, useState, useMemo, useEffect, useCallback } from 'react';
import { storage } from 'wxt/storage';
/**
* Theme type.
*/
type Theme = 'light' | 'dark' | 'system';
/**
* Theme preference key in storage.
*/
const THEME_PREFERENCE_KEY = 'local:theme';
/**
* Theme context type.
*/
type ThemeContextType = {
theme: Theme;
setTheme: (theme: Theme) => void;
isDarkMode: boolean;
}
/**
* Theme context.
*/
const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
/**
* Theme provider
*/
export const ThemeProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
/**
* Theme state that can be 'light', 'dark', or 'system'.
*/
const [theme, setTheme] = useState<Theme>('system');
/**
* Tracks whether dark mode is active (based on theme or system preference).
*/
const [isDarkMode, setIsDarkMode] = useState<boolean>(false);
useEffect(() => {
/**
* Load theme setting from storage.
*/
const loadTheme = async () : Promise<void> => {
const savedTheme = await getTheme();
setTheme(savedTheme);
};
loadTheme();
}, []);
/**
* Set the theme and save to storage.
*/
const updateTheme = useCallback((newTheme: Theme): void => {
setTheme(newTheme);
setStoredTheme(newTheme);
}, []);
/**
* Get the theme from storage.
*/
const getTheme = async (): Promise<Theme> => {
return (await storage.getItem(THEME_PREFERENCE_KEY) as Theme) || 'system';
};
/**
* Set the theme in storage.
*/
const setStoredTheme = async (theme: Theme): Promise<void> => {
await storage.setItem(THEME_PREFERENCE_KEY, theme);
};
/**
* Effect to apply theme to document and handle system preference changes
*/
useEffect(() => {
/**
* Update the dark mode status.
*/
const updateDarkMode = (): void => {
if (theme === 'system') {
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
setIsDarkMode(prefersDark);
document.documentElement.classList.toggle('dark', prefersDark);
} else {
const isDark = theme === 'dark';
setIsDarkMode(isDark);
document.documentElement.classList.toggle('dark', isDark);
}
};
// Initial update
updateDarkMode();
// Listen for system preference changes if using 'system' theme
if (theme === 'system') {
const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');
/**
* Update the dark mode status when the system preference changes.
*/
const handler = () : void => updateDarkMode();
mediaQuery.addEventListener('change', handler);
return () : void => mediaQuery.removeEventListener('change', handler);
}
}, [theme]);
const value = useMemo(
() => ({
theme,
setTheme: updateTheme,
isDarkMode,
}),
[theme, isDarkMode, updateTheme]
);
return (
<ThemeContext.Provider value={value}>
{children}
</ThemeContext.Provider>
);
};
/**
* Hook to use theme state
*/
export const useTheme = (): ThemeContextType => {
const context = useContext(ThemeContext);
if (context === undefined) {
throw new Error('useTheme must be used within a ThemeProvider');
}
return context;
};

View File

@@ -0,0 +1,50 @@
import React, { createContext, useContext, useEffect, useState } from 'react';
import { WebApiService } from '../../../utils/WebApiService';
import { useAuth } from './AuthContext';
const WebApiContext = createContext<WebApiService | null>(null);
/**
* WebApiProvider to provide the WebApiService to the app that components can use.
*/
export const WebApiProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
const { logout } = useAuth();
const [webApiService, setWebApiService] = useState<WebApiService | null>(null);
/**
* Initialize WebApiService
*/
useEffect(() : void => {
const service = new WebApiService(
(statusError: string | null) => {
if (statusError) {
logout(statusError);
} else {
logout();
}
}
);
setWebApiService(service);
}, [logout]);
if (!webApiService) {
return null;
}
return (
<WebApiContext.Provider value={webApiService}>
{children}
</WebApiContext.Provider>
);
};
/**
* Hook to use the WebApiService
*/
export const useWebApi = () : WebApiService => {
const context = useContext(WebApiContext);
if (!context) {
throw new Error('useWebApi must be used within a WebApiProvider');
}
return context;
};

View File

@@ -0,0 +1,14 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>AliasVault</title>
<link href="~/assets/tailwind.css" rel="stylesheet" />
<meta name="manifest.type" content="browser_action" />
</head>
<body class="bg-white dark:bg-gray-900">
<div id="root"></div>
<script type="module" src="./main.tsx"></script>
</body>
</html>

View File

@@ -0,0 +1,26 @@
import ReactDOM from 'react-dom/client';
import App from './App';
import { AuthProvider } from './context/AuthContext';
import { WebApiProvider } from './context/WebApiContext';
import { DbProvider } from './context/DbContext';
import { LoadingProvider } from './context/LoadingContext';
import { ThemeProvider } from './context/ThemeContext';
import { setupExpandedMode } from '../../utils/ExpandedMode';
// Run before React initializes to ensure the popup is always a fixed width except for when explicitly expanded.
setupExpandedMode();
const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement);
root.render(
<DbProvider>
<AuthProvider>
<WebApiProvider>
<LoadingProvider>
<ThemeProvider>
<App />
</ThemeProvider>
</LoadingProvider>
</WebApiProvider>
</AuthProvider>
</DbProvider>
);

View File

@@ -0,0 +1,179 @@
import React, { useState, useEffect } from 'react';
import { AppInfo } from '../../../utils/AppInfo';
import { storage } from 'wxt/storage';
import { GLOBAL_POPUP_ENABLED_KEY, DISABLED_SITES_KEY, VAULT_LOCKED_DISMISS_UNTIL_KEY } from '../../contentScript/Popup';
type ApiOption = {
label: string;
value: string;
};
const DEFAULT_OPTIONS: ApiOption[] = [
{ label: 'Aliasvault.net', value: AppInfo.DEFAULT_API_URL },
{ label: 'Self-hosted', value: 'custom' }
];
/**
* Auth settings page only shown when user is not logged in.
*/
const AuthSettings: React.FC = () => {
const [selectedOption, setSelectedOption] = useState<string>('');
const [customUrl, setCustomUrl] = useState<string>('');
const [customClientUrl, setCustomClientUrl] = useState<string>('');
const [isGloballyEnabled, setIsGloballyEnabled] = useState<boolean>(true);
useEffect(() => {
/**
* Load the stored settings from the storage.
*/
const loadStoredSettings = async () : Promise<void> => {
const apiUrl = await storage.getItem('local:apiUrl') as string;
const clientUrl = await storage.getItem('local:clientUrl') as string;
const globallyEnabled = await storage.getItem(GLOBAL_POPUP_ENABLED_KEY) !== false; // Default to true if not set
const dismissUntil = await storage.getItem(VAULT_LOCKED_DISMISS_UNTIL_KEY) as number;
if (dismissUntil) {
setIsGloballyEnabled(false);
} else {
setIsGloballyEnabled(globallyEnabled);
}
const matchingOption = DEFAULT_OPTIONS.find(opt => opt.value === apiUrl);
if (matchingOption) {
setSelectedOption(matchingOption.value);
} else if (apiUrl) {
setSelectedOption('custom');
setCustomUrl(apiUrl);
setCustomClientUrl(clientUrl ?? '');
} else {
setSelectedOption(DEFAULT_OPTIONS[0].value);
}
};
loadStoredSettings();
}, []);
/**
* Handle option change
*/
const handleOptionChange = async (e: React.ChangeEvent<HTMLSelectElement>) : Promise<void> => {
const value = e.target.value;
setSelectedOption(value);
if (value !== 'custom') {
await storage.setItem('local:apiUrl', '');
await storage.setItem('local:clientUrl', '');
}
};
/**
* Handle custom API URL change
*/
const handleCustomUrlChange = async (e: React.ChangeEvent<HTMLInputElement>) : Promise<void> => {
const value = e.target.value;
setCustomUrl(value);
await storage.setItem('local:apiUrl', value);
};
/**
* Handle custom client URL change
* @param e
*/
const handleCustomClientUrlChange = async (e: React.ChangeEvent<HTMLInputElement>) : Promise<void> => {
const value = e.target.value;
setCustomClientUrl(value);
await storage.setItem('local:clientUrl', value);
};
/**
* Toggle global popup.
*/
const toggleGlobalPopup = async () : Promise<void> => {
const newGloballyEnabled = !isGloballyEnabled;
await storage.setItem(GLOBAL_POPUP_ENABLED_KEY, newGloballyEnabled);
if (newGloballyEnabled) {
// Reset all disabled sites when enabling globally
await storage.setItem(DISABLED_SITES_KEY, []);
await storage.setItem(VAULT_LOCKED_DISMISS_UNTIL_KEY, 0);
}
setIsGloballyEnabled(newGloballyEnabled);
};
return (
<div className="p-4">
<div className="mb-6">
<label htmlFor="api-connection" className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-2">
API Connection
</label>
<select
value={selectedOption}
onChange={handleOptionChange}
className="w-full bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-500 focus:border-primary-500 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white"
>
{DEFAULT_OPTIONS.map(option => (
<option key={option.value} value={option.value}>
{option.label}
</option>
))}
</select>
</div>
{selectedOption === 'custom' && (
<>
<div className="mb-6">
<label htmlFor="custom-client-url" className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-2">
Custom client URL
</label>
<input
id="custom-client-url"
type="text"
value={customClientUrl}
onChange={handleCustomClientUrlChange}
placeholder="https://my-aliasvault-instance.com"
className="w-full bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-500 focus:border-primary-500 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white"
/>
</div>
<div className="mb-6">
<label htmlFor="custom-api-url" className="block text-sm font-medium text-gray-700 dark:text-gray-200 mb-2">
Custom API URL
</label>
<input
id="custom-api-url"
type="text"
value={customUrl}
onChange={handleCustomUrlChange}
placeholder="https://my-aliasvault-instance.com/api"
className="w-full bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-primary-500 focus:border-primary-500 p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white"
/>
</div>
</>
)}
{/* Autofill Popup Settings Section */}
<div className="mb-6">
<div className="flex flex-col gap-2">
<p className="text-sm font-medium text-gray-900 dark:text-white">Autofill popup</p>
<button
onClick={toggleGlobalPopup}
className={`px-4 py-2 rounded-md transition-colors ${
isGloballyEnabled
? 'bg-green-200 text-green-800 hover:bg-green-300 dark:bg-green-900/30 dark:text-green-400 dark:hover:bg-green-900/50'
: 'bg-red-200 text-red-800 hover:bg-red-300 dark:bg-red-900/30 dark:text-red-400 dark:hover:bg-red-900/50'
}`}
>
{isGloballyEnabled ? 'Enabled' : 'Disabled'}
</button>
</div>
</div>
<div className="text-center text-gray-400 dark:text-gray-600">
Version: {AppInfo.VERSION}
</div>
</div>
);
};
export default AuthSettings;

View File

@@ -0,0 +1,228 @@
import React, { useState, useEffect } from 'react';
import { useNavigate, useParams } from 'react-router-dom';
import { useDb } from '../context/DbContext';
import { Credential } from '../../../utils/types/Credential';
import { Buffer } from 'buffer';
import { FormInputCopyToClipboard } from '../components/FormInputCopyToClipboard';
import { EmailPreview } from '../components/EmailPreview';
import { TotpViewer } from '../components/TotpViewer';
import { useLoading } from '../context/LoadingContext';
/**
* Credential details page.
*/
const CredentialDetails: React.FC = () => {
const { id } = useParams();
const navigate = useNavigate();
const dbContext = useDb();
const [credential, setCredential] = useState<Credential | null>(null);
const { setIsInitialLoading } = useLoading();
/**
* Check if the current page is an expanded popup.
*/
const isPopup = () : boolean => {
const urlParams = new URLSearchParams(window.location.search);
return urlParams.get('expanded') === 'true';
};
/**
* Open the credential details in a new expanded popup.
*/
const openInNewPopup = () : void => {
const width = 380;
const height = 600;
const left = window.screen.width / 2 - width / 2;
const top = window.screen.height / 2 - height / 2;
window.open(
`popup.html?expanded=true#/credentials/${id}`,
'CredentialDetails',
`width=${width},height=${height},left=${left},top=${top},popup=true`
);
// Close the current tab
window.close();
};
/**
* Checks if the email domain is supported for email preview.
*
* @param email The email address to check
* @returns True if the domain is supported, false otherwise
*/
const isEmailDomainSupported = (email: string): boolean => {
// Extract domain from email
const domain = email.split('@')[1]?.toLowerCase();
if (!domain) {
return false;
}
// Check if domain is in public or private domains
const publicDomains = dbContext.publicEmailDomains ?? [];
const privateDomains = dbContext.privateEmailDomains ?? [];
// Check if the domain ends with any of the supported domains
return [...publicDomains, ...privateDomains].some(supportedDomain =>
domain === supportedDomain || domain.endsWith(`.${supportedDomain}`)
);
};
useEffect(() => {
// For popup windows, ensure we have proper history state for navigation
if (isPopup()) {
// Clear existing history and create fresh entries
window.history.replaceState({}, '', `popup.html#/credentials`);
window.history.pushState({}, '', `popup.html#/credentials/${id}`);
}
if (!dbContext?.sqliteClient || !id) {
return;
}
try {
const result = dbContext.sqliteClient.getCredentialById(id);
if (result) {
setCredential(result);
setIsInitialLoading(false);
} else {
console.error('Credential not found');
navigate('/credentials');
}
} catch (err) {
console.error('Error loading credential:', err);
}
}, [dbContext.sqliteClient, id, navigate, setIsInitialLoading]);
if (!credential) {
return <div>Loading...</div>;
}
return (
<div className="">
<div className="space-y-4 mb-4">
<div className="flex items-center justify-between mb-6">
<div className="flex items-center">
<img
src={credential.Logo ? `data:image/x-icon;base64,${Buffer.from(credential.Logo).toString('base64')}` : '/assets/images/service-placeholder.webp'}
alt={credential.ServiceName}
className="w-12 h-12 rounded-lg mr-4"
/>
<div>
<h1 className="text-2xl font-bold text-gray-900 dark:text-white">{credential.ServiceName}</h1>
{credential.ServiceUrl && (
<a
href={credential.ServiceUrl}
target="_blank"
rel="noopener noreferrer"
className="text-primary-600 hover:text-primary-700 dark:text-primary-400 dark:hover:text-primary-300"
>
{credential.ServiceUrl}
</a>
)}
</div>
</div>
<button
onClick={openInNewPopup}
className="text-gray-600 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white"
title="Open in new window"
>
<svg
className="w-5 h-5"
fill="none"
stroke="currentColor"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
>
<path
strokeLinecap="round"
strokeLinejoin="round"
strokeWidth={2}
d="M4 8V4m0 0h4M4 4l5 5m11-1V4m0 0h-4m4 0l-5 5M4 16v4m0 0h4m-4 0l5-5m11 5l-5-5m5 5v-4m0 4h-4"
/>
</svg>
</button>
</div>
{credential.Email && (
<>
{isEmailDomainSupported(credential.Email) && (
<EmailPreview
email={credential.Email}
/>
)}
</>
)}
<TotpViewer credentialId={credential.Id} />
</div>
<div className="grid gap-6">
<div className="space-y-4 lg:col-span-2 xl:col-span-1">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white">Login credentials</h2>
<FormInputCopyToClipboard
id="email"
label="Email"
value={credential.Email ?? ''}
/>
<FormInputCopyToClipboard
id="username"
label="Username"
value={credential.Username}
/>
<FormInputCopyToClipboard
id="password"
label="Password"
value={credential.Password}
type="password"
/>
<div className="space-y-4">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white">Alias</h2>
<FormInputCopyToClipboard
id="fullName"
label="Full Name"
value={`${credential.Alias.FirstName} ${credential.Alias.LastName}`}
/>
<FormInputCopyToClipboard
id="firstName"
label="First Name"
value={credential.Alias.FirstName}
/>
<FormInputCopyToClipboard
id="lastName"
label="Last Name"
value={credential.Alias.LastName}
/>
<FormInputCopyToClipboard
id="birthDate"
label="Birth Date"
value={credential.Alias.BirthDate ? new Date(credential.Alias.BirthDate).toISOString().split('T')[0] : ''}
/>
{credential.Alias.NickName && (
<FormInputCopyToClipboard
id="nickName"
label="Nickname"
value={credential.Alias.NickName}
/>
)}
</div>
</div>
{credential.Notes && (
<div className="space-y-4 lg:col-span-2 xl:col-span-1">
<h2 className="text-xl font-semibold text-gray-900 dark:text-white">Notes</h2>
<div className="p-4 bg-gray-50 rounded-lg dark:bg-gray-700">
<p className="text-gray-900 dark:text-gray-100 whitespace-pre-wrap">
{credential.Notes}
</p>
</div>
</div>
)}
</div>
</div>
);
};
export default CredentialDetails;

Some files were not shown because too many files have changed in this diff Show More