Compare commits

...
Author SHA1 Message Date
StandardNotes CI e47b6253c1 chore(release): publish
- @standardnotes/[email protected].5
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected].7
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected].6
 - @standardnotes/[email protected].8
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
2023-03-08 09:57:58 +00:00
Karol Sójko 7fc9182869 chore: remove files beta permission (#2247) 2023-03-08 10:30:29 +01:00
Karol SójkoandKarol Sójko 0c9ed13678 chore: add u2f permissions and features (#2246)
Co-authored-by: Karol Sójko <[email protected]>
2023-03-08 09:57:36 +01:00
StandardNotes CI 95358ec1d5 chore(release): publish
- @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
2023-03-07 17:34:30 +00:00
Mo a307e8a28c chore: associated domains 2023-03-07 11:01:35 -06:00
StandardNotes CI afcabc93eb chore(release): publish
- @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
2023-03-07 09:17:18 +00:00
Aman Harwara d30b1f8d15 chore: fix types 2023-03-07 14:18:43 +05:30
Aman Harwara 7a82f41585 chore: upgrade deps 2023-03-07 13:57:30 +05:30
StandardNotes CI c8f06ae65f chore(release): publish
- @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected].7
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
2023-03-07 00:25:43 +00:00
Karol Sójko cf5330d7cf feat-dev: add U2F iframe for desktop client authentication (#2236) 2023-03-06 17:52:35 -06:00
StandardNotes CI e5ca69fc8e chore(release): publish
- @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected].5
 - @standardnotes/[email protected].6
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
2023-03-03 16:55:22 +00:00
Mo 2a567ad052 refactor: demo params 2023-03-03 10:26:38 -06:00
StandardNotes CI c663482ea3 chore(release): publish
- @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected].5
 - @standardnotes/[email protected]
2023-03-02 13:07:23 +00:00
Karol Sójko 90f185059a chore(snjs): add error logs when not able to create session (#2240) 2023-03-02 13:39:20 +01:00
StandardNotes CI 5e1c8b90be chore(release): publish
- @standardnotes/[email protected].9
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected].9
2023-03-02 01:34:31 +00:00
Mo 0c30d9cf03 chore: fix markdown visual 2023-03-01 19:07:44 -06:00
StandardNotes CI 44bd6f90bd chore(release): publish
- @standardnotes/[email protected].4
 - @standardnotes/[email protected].8
 - @standardnotes/[email protected]
 - @standardnotes/[email protected].9
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected].6
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected].4
 - @standardnotes/[email protected].4
 - @standardnotes/[email protected]
 - @standardnotes/[email protected].5
 - @standardnotes/[email protected].8
2023-03-01 14:35:00 +00:00
Mo fd020af03f chore: upgrade sn deps 2023-03-01 08:06:14 -06:00
StandardNotes CI ab3740170e chore(release): publish
- @standardnotes/[email protected].7
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected].7
2023-03-01 09:55:48 +00:00
Aman Harwara 4ab2efd738 chore: trigger build 2023-03-01 14:30:39 +05:30
Aman Harwara 01d23de9eb Merge branch 'main' of github.com:standardnotes/app 2023-03-01 14:25:50 +05:30
Aman Harwara fc54677356 chore: fix android build 2023-03-01 14:25:40 +05:30
StandardNotes CI 1fb78b1667 chore(release): publish
- @standardnotes/[email protected].6
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected].6
2023-03-01 08:02:29 +00:00
Aman Harwara 66da4e62c6 Merge branch 'main' of github.com:standardnotes/app 2023-03-01 13:05:23 +05:30
Aman Harwara e3a3b859c1 chore: fix mobile release action ruby version 2023-03-01 13:05:12 +05:30
StandardNotes CI bc87eaedfc chore(release): publish
- @standardnotes/[email protected].5
 - @standardnotes/[email protected]
 - @standardnotes/[email protected]
 - @standardnotes/[email protected].5
2023-03-01 07:34:54 +00:00
Aman Harwara c70c1e9139 chore: trigger build 2023-03-01 12:36:02 +05:30
90 changed files with 1005 additions and 379 deletions
@@ -30,6 +30,8 @@ jobs:
- run: yarn build:mobile
- name: Ruby Setup for Fastlane
uses: ruby/setup-ruby@v1
with:
working-directory: 'packages/mobile'
- name: fastlane
uses: maierj/[email protected]
env:
@@ -88,6 +90,8 @@ jobs:
run: echo "${{ secrets.APPSTORE_CONNECT_KEY }}" > ios/Authkey.p8
- name: Ruby Setup for Fastlane
uses: ruby/setup-ruby@v1
with:
working-directory: 'packages/mobile'
- name: Setup fastlane
uses: maierj/[email protected]
env:
+1 -1
View File
@@ -1 +1 @@
2.7.5
2.7.6
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.25.5](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-08)
**Note:** Version bump only for package @standardnotes/api
## [1.25.4](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/api
## [1.25.3](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/api
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/api",
"version": "1.25.3",
"version": "1.25.5",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -36,12 +36,12 @@
"typescript": "*"
},
"dependencies": {
"@standardnotes/common": "^1.46.4",
"@standardnotes/common": "^1.46.6",
"@standardnotes/domain-core": "^1.11.3",
"@standardnotes/encryption": "workspace:*",
"@standardnotes/models": "workspace:*",
"@standardnotes/responses": "workspace:*",
"@standardnotes/security": "^1.7.5",
"@standardnotes/security": "^1.7.6",
"@standardnotes/utils": "workspace:*",
"reflect-metadata": "^0.1.13"
}
+44
View File
@@ -3,6 +3,50 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.105.15](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-08)
**Note:** Version bump only for package @standardnotes/desktop
## [3.105.14](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)
**Note:** Version bump only for package @standardnotes/desktop
## [3.105.13](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)
**Note:** Version bump only for package @standardnotes/desktop
## [3.105.12](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)
**Note:** Version bump only for package @standardnotes/desktop
## [3.105.11](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-03)
**Note:** Version bump only for package @standardnotes/desktop
## [3.105.10](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-02)
**Note:** Version bump only for package @standardnotes/desktop
## [3.105.9](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-02)
**Note:** Version bump only for package @standardnotes/desktop
## [3.105.8](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/desktop
## [3.105.7](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/desktop
## [3.105.6](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/desktop
## [3.105.5](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/desktop
## [3.105.4](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/desktop
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "@standardnotes/desktop",
"main": "./app/dist/index.js",
"version": "3.105.4",
"version": "3.105.15",
"license": "AGPL-3.0-or-later",
"author": "Standard Notes.",
"private": true,
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.21.19](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-08)
**Note:** Version bump only for package @standardnotes/encryption
## [1.21.18](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/encryption
## [1.21.17](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/encryption
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/encryption",
"version": "1.21.17",
"version": "1.21.19",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -35,7 +35,7 @@
"typescript": "*"
},
"dependencies": {
"@standardnotes/common": "^1.46.4",
"@standardnotes/common": "^1.46.6",
"@standardnotes/models": "workspace:*",
"@standardnotes/responses": "workspace:*",
"@standardnotes/sncrypto-common": "workspace:*",
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.58.10](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-08)
**Note:** Version bump only for package @standardnotes/features
## [1.58.9](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/features
## [1.58.8](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-02-15)
**Note:** Version bump only for package @standardnotes/features
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/features",
"version": "1.58.8",
"version": "1.58.10",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -25,9 +25,9 @@
"test": "jest"
},
"dependencies": {
"@standardnotes/common": "^1.46.4",
"@standardnotes/common": "^1.46.6",
"@standardnotes/domain-core": "^1.11.3",
"@standardnotes/security": "^1.7.5",
"@standardnotes/security": "^1.7.6",
"reflect-metadata": "^0.1.13"
},
"devDependencies": {
@@ -15,6 +15,7 @@ export enum FeatureIdentifier {
SmartFilters = 'org.standardnotes.smart-filters',
TagNesting = 'org.standardnotes.tag-nesting',
TwoFactorAuth = 'org.standardnotes.two-factor-auth',
UniversalSecondFactor = 'org.standardnotes.universal-second-factor',
SubscriptionSharing = 'org.standardnotes.subscription-sharing',
AutobiographyTheme = 'org.standardnotes.theme-autobiography',
@@ -11,6 +11,12 @@ export function serverFeatures(): ServerFeatureDescription[] {
identifier: FeatureIdentifier.TwoFactorAuth,
permission_name: PermissionName.TwoFactorAuth,
},
{
availableInSubscriptions: [SubscriptionName.ProPlan],
name: 'U2F authentication',
identifier: FeatureIdentifier.UniversalSecondFactor,
permission_name: PermissionName.UniversalSecondFactor,
},
{
availableInSubscriptions: [SubscriptionName.ProPlan],
name: 'Unlimited note history',
@@ -10,7 +10,6 @@ export enum PermissionName {
DailyEmailBackup = 'server:daily-email-backup',
DailyGDriveBackup = 'server:daily-gdrive-backup',
DailyOneDriveBackup = 'server:daily-onedrive-backup',
FilesBeta = 'app:files-beta',
Files = 'app:files',
FilesMaximumStorageTier = 'server:files-max-storage-tier',
FilesLowStorageTier = 'server:files-low-storage-tier',
@@ -38,6 +37,7 @@ export enum PermissionName {
TitaniumTheme = 'theme:titanium',
TokenVaultEditor = 'editor:token-vault',
TwoFactorAuth = 'server:two-factor-auth',
UniversalSecondFactor = 'server:universal-second-factor',
SubscriptionSharing = 'server:subscription-sharing',
SuperEditor = 'editor:super-editor',
}
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.28.24](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-08)
**Note:** Version bump only for package @standardnotes/filepicker
## [1.28.23](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/filepicker
## [1.28.22](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/filepicker
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/filepicker",
"version": "1.28.22",
"version": "1.28.24",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -26,7 +26,7 @@
"typescript": "*"
},
"dependencies": {
"@standardnotes/common": "^1.46.4",
"@standardnotes/common": "^1.46.6",
"@standardnotes/files": "workspace:*",
"@standardnotes/utils": "workspace:*",
"@types/wicg-file-system-access": "^2020.9.5",
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.14.34](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-08)
**Note:** Version bump only for package @standardnotes/files
## [1.14.33](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/files
## [1.14.32](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/files
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/files",
"version": "1.14.32",
"version": "1.14.34",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
+1
View File
@@ -0,0 +1 @@
2.7.6
+44
View File
@@ -3,6 +3,50 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.51.46](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-08)
**Note:** Version bump only for package @standardnotes/mobile
## [3.51.45](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)
**Note:** Version bump only for package @standardnotes/mobile
## [3.51.44](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)
**Note:** Version bump only for package @standardnotes/mobile
## [3.51.43](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)
**Note:** Version bump only for package @standardnotes/mobile
## [3.51.42](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-03)
**Note:** Version bump only for package @standardnotes/mobile
## [3.51.41](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-02)
**Note:** Version bump only for package @standardnotes/mobile
## [3.51.40](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-02)
**Note:** Version bump only for package @standardnotes/mobile
## [3.51.39](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/mobile
## [3.51.38](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/mobile
## [3.51.37](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/mobile
## [3.51.36](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/mobile
## [3.51.35](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/mobile
+3 -3
View File
@@ -282,13 +282,13 @@ PLATFORMS
ruby
DEPENDENCIES
cocoapods (~> 1.11, >= 1.11.2)
cocoapods (~> 1.11, >= 1.11.3)
fastlane
fastlane-plugin-bundletool
xcode-install
RUBY VERSION
ruby 2.7.5p203
ruby 2.7.6p219
BUNDLED WITH
2.3.15
2.3.25
@@ -2,12 +2,10 @@ package com.standardnotes;
import android.app.Application;
import android.app.Activity;
import android.content.Context;
import android.webkit.WebView;
import com.facebook.react.PackageList;
import com.facebook.react.ReactApplication;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint;
@@ -15,7 +13,6 @@ import com.facebook.react.defaults.DefaultReactNativeHost;
import com.facebook.soloader.SoLoader;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import com.facebook.react.modules.network.OkHttpClientProvider;
@@ -4,7 +4,7 @@
* <p>This source code is licensed under the MIT license found in the LICENSE file in the root
* directory of this source tree.
*/
package com.rndiffapp;
package com.standardnotes;
import android.content.Context;
import com.facebook.react.ReactInstanceManager;
/**
+2 -2
View File
@@ -637,7 +637,7 @@ EXTERNAL SOURCES:
:path: "../node_modules/react-native/ReactCommon/yoga"
SPEC CHECKSUMS:
boost: 57d2868c099736d80fcd648bf211b4431e51a558
boost: a7c83b31436843459a1961bfd74b96033dc77234
CocoaAsyncSocket: 065fd1e645c7abab64f7a6a2007a48038fdc6a99
DoubleConversion: 5189b271737e1565bdce30deb4a08d647e3f5f54
FBLazyVector: 60195509584153283780abdac5569feffb8f08cc
@@ -658,7 +658,7 @@ SPEC CHECKSUMS:
MMKV: 9c4663aa7ca255d478ff10f2f5cb7d17c1651ccd
MMKVCore: 89f5c8a66bba2dcd551779dea4d412eeec8ff5bb
OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c
RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1
RCT-Folly: 0080d0a6ebf2577475bda044aa59e2ca1f909cda
RCTRequired: bec48f07daf7bcdc2655a0cde84e07d24d2a9e2a
RCTTypeSafety: 171394eebacf71e1cfad79dbfae7ee8fc16ca80a
React: d7433ccb6a8c36e4cbed59a73c0700fc83c3e98a
@@ -2,6 +2,10 @@
<!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.developer.associated-domains</key>
<array>
<string>webcredentials:app.standardnotes.com</string>
</array>
<key>com.apple.developer.default-data-protection</key>
<string>NSFileProtectionComplete</string>
</dict>
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/mobile",
"version": "3.51.35",
"version": "3.51.46",
"author": "Standard Notes.",
"private": true,
"license": "AGPL-3.0-or-later",
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.43.7](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-08)
**Note:** Version bump only for package @standardnotes/models
## [1.43.6](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/models
## [1.43.5](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/models
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/models",
"version": "1.43.5",
"version": "1.43.7",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -22,7 +22,7 @@
"test": "jest"
},
"dependencies": {
"@standardnotes/common": "^1.46.4",
"@standardnotes/common": "^1.46.6",
"@standardnotes/features": "workspace:*",
"@standardnotes/responses": "workspace:*",
"@standardnotes/utils": "workspace:^",
+44
View File
@@ -3,6 +3,50 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.4.189](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-08)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.188](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.187](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.186](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.185](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-03)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.184](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-02)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.183](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-02)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.182](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.181](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.180](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.179](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/releases
## [1.4.178](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/releases
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/releases",
"version": "1.4.178",
"version": "1.4.189",
"license": "AGPL-3.0-or-later",
"main": "dist/releases.json",
"types": "dist/index.d.ts",
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.13.11](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-08)
**Note:** Version bump only for package @standardnotes/responses
## [1.13.10](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/responses
## [1.13.9](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/responses
+3 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/responses",
"version": "1.13.9",
"version": "1.13.11",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -33,9 +33,9 @@
"typescript": "*"
},
"dependencies": {
"@standardnotes/common": "^1.46.4",
"@standardnotes/common": "^1.46.6",
"@standardnotes/features": "workspace:*",
"@standardnotes/security": "^1.7.5",
"@standardnotes/security": "^1.7.6",
"reflect-metadata": "^0.1.13"
}
}
+12
View File
@@ -3,6 +3,18 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.57.6](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-08)
**Note:** Version bump only for package @standardnotes/services
## [1.57.5](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-03)
**Note:** Version bump only for package @standardnotes/services
## [1.57.4](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/services
## [1.57.3](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/services
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/services",
"version": "1.57.3",
"version": "1.57.6",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -2,13 +2,12 @@ import { UserRegistrationResponseBody } from '@standardnotes/api'
import { ProtocolVersion } from '@standardnotes/common'
import { SNRootKey } from '@standardnotes/encryption'
import { RootKeyInterface } from '@standardnotes/models'
import { ClientDisplayableError, SessionBody, SignInResponse, User, HttpResponse } from '@standardnotes/responses'
import { SessionBody, SignInResponse, User, HttpResponse } from '@standardnotes/responses'
import { Base64String } from '@standardnotes/sncrypto-common'
import { SessionManagerResponse } from './SessionManagerResponse'
export interface SessionsClientInterface {
createDemoShareToken(): Promise<Base64String | ClientDisplayableError>
populateSessionFromDemoShareToken(token: Base64String): Promise<void>
getUser(): User | undefined
isCurrentSessionReadOnly(): boolean | undefined
+20
View File
@@ -3,6 +3,26 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.166.8](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-08)
**Note:** Version bump only for package @standardnotes/snjs
## [2.166.7](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)
**Note:** Version bump only for package @standardnotes/snjs
## [2.166.6](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-03)
**Note:** Version bump only for package @standardnotes/snjs
## [2.166.5](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-02)
**Note:** Version bump only for package @standardnotes/snjs
## [2.166.4](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/snjs
## [2.166.3](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/snjs
+10 -12
View File
@@ -79,7 +79,6 @@ import {
DecryptedItemInterface,
EncryptedItemInterface,
Environment,
HistoryEntry,
ItemStream,
Platform,
} from '@standardnotes/models'
@@ -90,7 +89,7 @@ import { SNLog } from '../Log'
import { ChallengeResponse, ListedClientInterface } from '../Services'
import { ApplicationConstructorOptions, FullyResolvedApplicationOptions } from './Options/ApplicationOptions'
import { ApplicationOptionsDefaults } from './Options/Defaults'
import { LegacySession, MapperInterface, Session, UseCaseInterface } from '@standardnotes/domain-core'
import { LegacySession, MapperInterface, Session } from '@standardnotes/domain-core'
import { SessionStorageMapper } from '@Lib/Services/Mapping/SessionStorageMapper'
import { LegacySessionStorageMapper } from '@Lib/Services/Mapping/LegacySessionStorageMapper'
import { SignInWithRecoveryCodes } from '@Lib/Domain/UseCase/SignInWithRecoveryCodes/SignInWithRecoveryCodes'
@@ -102,7 +101,6 @@ import { DeleteAuthenticator } from '@Lib/Domain/UseCase/DeleteAuthenticator/Del
import { ListRevisions } from '@Lib/Domain/UseCase/ListRevisions/ListRevisions'
import { GetRevision } from '@Lib/Domain/UseCase/GetRevision/GetRevision'
import { DeleteRevision } from '@Lib/Domain/UseCase/DeleteRevision/DeleteRevision'
import { RevisionMetadata } from '@Lib/Domain/Revision/RevisionMetadata'
import { GetAuthenticatorAuthenticationResponse } from '@Lib/Domain/UseCase/GetAuthenticatorAuthenticationResponse/GetAuthenticatorAuthenticationResponse'
/** How often to automatically sync, in milliseconds */
@@ -266,39 +264,39 @@ export class SNApplication implements ApplicationInterface, AppGroupManagedAppli
return this.subscriptionManager
}
get signInWithRecoveryCodes(): UseCaseInterface<void> {
get signInWithRecoveryCodes(): SignInWithRecoveryCodes {
return this._signInWithRecoveryCodes
}
get getRecoveryCodes(): UseCaseInterface<string> {
get getRecoveryCodes(): GetRecoveryCodes {
return this._getRecoveryCodes
}
get addAuthenticator(): UseCaseInterface<void> {
get addAuthenticator(): AddAuthenticator {
return this._addAuthenticator
}
get listAuthenticators(): UseCaseInterface<Array<{ id: string; name: string }>> {
get listAuthenticators(): ListAuthenticators {
return this._listAuthenticators
}
get deleteAuthenticator(): UseCaseInterface<void> {
get deleteAuthenticator(): DeleteAuthenticator {
return this._deleteAuthenticator
}
get getAuthenticatorAuthenticationResponse(): UseCaseInterface<Record<string, unknown>> {
get getAuthenticatorAuthenticationResponse(): GetAuthenticatorAuthenticationResponse {
return this._getAuthenticatorAuthenticationResponse
}
get listRevisions(): UseCaseInterface<Array<RevisionMetadata>> {
get listRevisions(): ListRevisions {
return this._listRevisions
}
get getRevision(): UseCaseInterface<HistoryEntry> {
get getRevision(): GetRevision {
return this._getRevision
}
get deleteRevision(): UseCaseInterface<void> {
get deleteRevision(): DeleteRevision {
return this._deleteRevision
}
@@ -1,16 +1,21 @@
import { HistoryEntry } from '@standardnotes/models'
import { UseCaseInterface } from '@standardnotes/domain-core'
import { RevisionMetadata } from '../Revision/RevisionMetadata'
import { AddAuthenticator } from './AddAuthenticator/AddAuthenticator'
import { GetRecoveryCodes } from './GetRecoveryCodes/GetRecoveryCodes'
import { SignInWithRecoveryCodes } from './SignInWithRecoveryCodes/SignInWithRecoveryCodes'
import { ListAuthenticators } from './ListAuthenticators/ListAuthenticators'
import { DeleteAuthenticator } from './DeleteAuthenticator/DeleteAuthenticator'
import { GetAuthenticatorAuthenticationResponse } from './GetAuthenticatorAuthenticationResponse/GetAuthenticatorAuthenticationResponse'
import { ListRevisions } from './ListRevisions/ListRevisions'
import { GetRevision } from './GetRevision/GetRevision'
import { DeleteRevision } from './DeleteRevision/DeleteRevision'
export interface UseCaseContainerInterface {
get signInWithRecoveryCodes(): UseCaseInterface<void>
get getRecoveryCodes(): UseCaseInterface<string>
get addAuthenticator(): UseCaseInterface<void>
get listAuthenticators(): UseCaseInterface<Array<{ id: string; name: string }>>
get deleteAuthenticator(): UseCaseInterface<void>
get getAuthenticatorAuthenticationResponse(): UseCaseInterface<Record<string, unknown>>
get listRevisions(): UseCaseInterface<Array<RevisionMetadata>>
get getRevision(): UseCaseInterface<HistoryEntry>
get deleteRevision(): UseCaseInterface<void>
get signInWithRecoveryCodes(): SignInWithRecoveryCodes
get getRecoveryCodes(): GetRecoveryCodes
get addAuthenticator(): AddAuthenticator
get listAuthenticators(): ListAuthenticators
get deleteAuthenticator(): DeleteAuthenticator
get getAuthenticatorAuthenticationResponse(): GetAuthenticatorAuthenticationResponse
get listRevisions(): ListRevisions
get getRevision(): GetRevision
get deleteRevision(): DeleteRevision
}
+16
View File
@@ -1,2 +1,18 @@
export * from './Revision/Revision'
export * from './Revision/RevisionMetadata'
export * from './UseCase/AddAuthenticator/AddAuthenticator'
export * from './UseCase/AddAuthenticator/AddAuthenticatorDTO'
export * from './UseCase/DeleteAuthenticator/DeleteAuthenticator'
export * from './UseCase/DeleteAuthenticator/DeleteAuthenticatorDTO'
export * from './UseCase/DeleteRevision/DeleteRevision'
export * from './UseCase/DeleteRevision/DeleteRevisionDTO'
export * from './UseCase/GetAuthenticatorAuthenticationResponse/GetAuthenticatorAuthenticationResponse'
export * from './UseCase/GetAuthenticatorAuthenticationResponse/GetAuthenticatorAuthenticationResponseDTO'
export * from './UseCase/GetRecoveryCodes/GetRecoveryCodes'
export * from './UseCase/GetRevision/GetRevision'
export * from './UseCase/GetRevision/GetRevisionDTO'
export * from './UseCase/ListAuthenticators/ListAuthenticators'
export * from './UseCase/ListRevisions/ListRevisions'
export * from './UseCase/ListRevisions/ListRevisionsDTO'
export * from './UseCase/SignInWithRecoveryCodes/SignInWithRecoveryCodes'
export * from './UseCase/SignInWithRecoveryCodes/SignInWithRecoveryCodesDTO'
@@ -44,8 +44,8 @@ import {
HttpSuccessResponse,
} from '@standardnotes/responses'
import { CopyPayloadWithContentOverride } from '@standardnotes/models'
import { LegacySession, MapperInterface, Session, SessionToken } from '@standardnotes/domain-core'
import { KeyParamsFromApiResponse, SNRootKeyParams, SNRootKey, CreateNewRootKey } from '@standardnotes/encryption'
import { LegacySession, MapperInterface, Result, Session, SessionToken } from '@standardnotes/domain-core'
import { KeyParamsFromApiResponse, SNRootKeyParams, SNRootKey } from '@standardnotes/encryption'
import { Subscription } from '@standardnotes/security'
import * as Common from '@standardnotes/common'
@@ -640,32 +640,6 @@ export class SNSessionManager
}
}
public async createDemoShareToken(): Promise<Base64String | ClientDisplayableError> {
const session = this.getSession()
if (!session) {
return new ClientDisplayableError('Cannot generate share token without active session')
}
if (!(session instanceof Session)) {
return new ClientDisplayableError('Cannot generate share token with non-token session')
}
const keyParams = (await this.protocolService.getRootKeyParams()) as SNRootKeyParams
const payload: ShareToken = {
accessToken: session.accessToken.value,
refreshToken: session.refreshToken.value,
accessExpiration: session.accessToken.expiresAt,
refreshExpiration: session.refreshToken.expiresAt,
readonlyAccess: true,
masterKey: this.protocolService.getRootKey()?.masterKey as string,
keyParams: keyParams.content,
user: this.getSureUser(),
host: this.apiService.getHost(),
}
return this.protocolService.crypto.base64Encode(JSON.stringify(payload))
}
private decodeDemoShareToken(token: Base64String): ShareToken {
const jsonString = this.protocolService.crypto.base64Decode(token)
return JSON.parse(jsonString)
@@ -674,25 +648,7 @@ export class SNSessionManager
public async populateSessionFromDemoShareToken(token: Base64String): Promise<void> {
const sharePayload = this.decodeDemoShareToken(token)
const rootKey = CreateNewRootKey({
masterKey: sharePayload.masterKey,
keyParams: sharePayload.keyParams,
version: sharePayload.keyParams.version,
})
const user = sharePayload.user
const session = this.createSession(
sharePayload.accessToken,
sharePayload.accessExpiration,
sharePayload.refreshToken,
sharePayload.refreshExpiration,
sharePayload.readonlyAccess,
)
if (session !== null) {
await this.populateSession(rootKey, user, session, sharePayload.host)
}
await this.signIn(sharePayload.email, sharePayload.password, false, true)
}
private async populateSession(
@@ -724,17 +680,26 @@ export class SNSessionManager
rootKey: SNRootKey
wrappingKey?: SNRootKey
}): Promise<void> {
const session = this.createSession(
const sessionOrError = this.createSession(
dto.session.access_token,
dto.session.access_expiration,
dto.session.refresh_token,
dto.session.refresh_expiration,
dto.session.readonly_access,
)
if (sessionOrError.isFailed()) {
console.error(sessionOrError.getError())
if (session !== null) {
await this.populateSession(dto.rootKey, dto.user, session, this.apiService.getHost(), dto.wrappingKey)
return
}
await this.populateSession(
dto.rootKey,
dto.user,
sessionOrError.getValue(),
this.apiService.getHost(),
dto.wrappingKey,
)
}
/**
@@ -755,16 +720,25 @@ export class SNSessionManager
await this.populateSession(rootKey, user, sessionOrError.getValue(), this.apiService.getHost(), wrappingKey)
}
} else if (data.session) {
const session = this.createSession(
const sessionOrError = this.createSession(
data.session.access_token,
data.session.access_expiration,
data.session.refresh_token,
data.session.refresh_expiration,
data.session.readonly_access,
)
if (session !== null && user) {
await this.populateSession(rootKey, user, session, this.apiService.getHost(), wrappingKey)
if (sessionOrError.isFailed()) {
console.error(sessionOrError.getError())
return
}
if (!user) {
console.error('No user in response')
return
}
await this.populateSession(rootKey, user, sessionOrError.getValue(), this.apiService.getHost(), wrappingKey)
}
}
@@ -774,25 +748,25 @@ export class SNSessionManager
refreshTokenValue: string,
refreshExpiration: number,
readonlyAccess: boolean,
): Session | null {
): Result<Session> {
const accessTokenOrError = SessionToken.create(accessTokenValue, accessExpiration)
if (accessTokenOrError.isFailed()) {
return null
return Result.fail(`Could not create session: ${accessTokenOrError.getError()}`)
}
const accessToken = accessTokenOrError.getValue()
const refreshTokenOrError = SessionToken.create(refreshTokenValue, refreshExpiration)
if (refreshTokenOrError.isFailed()) {
return null
return Result.fail(`Could not create session: ${refreshTokenOrError.getError()}`)
}
const refreshToken = refreshTokenOrError.getValue()
const sessionOrError = Session.create(accessToken, refreshToken, readonlyAccess)
if (sessionOrError.isFailed()) {
return null
return Result.fail(`Could not create session: ${sessionOrError.getError()}`)
}
return sessionOrError.getValue()
return Result.ok(sessionOrError.getValue())
}
override getDiagnostics(): Promise<DiagnosticInfo | undefined> {
@@ -1,10 +1,6 @@
import { User } from '@standardnotes/responses'
import { AnyKeyParamsContent } from '@standardnotes/common'
import { RawSessionPayload } from './Sessions/Types'
export type ShareToken = RawSessionPayload & {
masterKey: string
keyParams: AnyKeyParamsContent
user: User
host: string
email: string
password: string
}
-3
View File
@@ -13,10 +13,7 @@ export * from '@standardnotes/encryption'
export * from '@standardnotes/features'
export * from '@standardnotes/files'
export * from '@standardnotes/models'
export * from '@standardnotes/responses'
export { ErrorTag } from '@standardnotes/responses'
export * from '@standardnotes/services'
export * from '@standardnotes/settings'
export * from '@standardnotes/utils'
-113
View File
@@ -1,113 +0,0 @@
/* eslint-disable no-undef */
import * as Factory from './lib/factory.js'
chai.use(chaiAsPromised)
const expect = chai.expect
describe('session sharing', function () {
this.timeout(Factory.TenSecondTimeout)
beforeEach(async function () {
localStorage.clear()
this.context = await Factory.createAppContext()
await this.context.launch()
this.application = this.context.application
this.email = this.context.email
this.password = this.context.password
await Factory.registerUserToApplication({
application: this.application,
email: this.email,
password: this.password,
})
})
afterEach(async function () {
await this.context.deinit()
this.context = undefined
this.application = undefined
localStorage.clear()
})
it('share token payloads should include neccessary params', async function () {
const token = await this.application.sessions.createDemoShareToken()
const payload = await this.application.sessions.decodeDemoShareToken(token)
const expectedKeys = [
'accessToken',
'refreshToken',
'accessExpiration',
'refreshExpiration',
'readonlyAccess',
'masterKey',
'keyParams',
'user',
'host',
]
for (const key of expectedKeys) {
expect(payload[key]).to.not.be.undefined
}
})
it('populating session from share token should allow pulling in new items', async function () {
const token = await this.application.sessions.createDemoShareToken()
await Factory.createSyncedNote(this.application, 'demo title', 'demo text')
const otherContext = await Factory.createAppContext()
await otherContext.launch()
const otherApplication = otherContext.application
expect(otherApplication.items.getItems(ContentType.Note).length).to.equal(0)
await otherApplication.sessions.populateSessionFromDemoShareToken(token)
await otherApplication.sync.sync()
const notes = otherApplication.items.getItems(ContentType.Note)
expect(notes.length).to.equal(1)
const note = notes[0]
expect(note.title).to.equal('demo title')
expect(note.text).to.equal('demo text')
await otherContext.deinit()
})
/**
* Demo session tokens can only be created manually via raw SQL entry on the DB side.
* There is no API to create share tokens. Therefore, the share token below is made from
* a copy of the master session, which is not readonly.
*/
it.skip('populating session from share token should not allow making changes', async function () {
const token = await this.application.sessions.createDemoShareToken()
await Factory.createSyncedNote(this.application, 'demo title', 'demo text')
const otherContext = await Factory.createAppContext()
await otherContext.launch()
const otherApplication = otherContext.application
await otherApplication.sessions.populateSessionFromDemoShareToken(token)
await otherApplication.sync.sync()
const note = otherApplication.items.getItems(ContentType.Note)[0]
const syncResponse = otherContext.awaitNextSyncEvent(SyncEvent.SingleRoundTripSyncCompleted)
await otherApplication.mutator.changeAndSaveItem(note, (mutator) => {
mutator.title = 'unauthorized change'
})
const result = await syncResponse
expect(result.rawResponse.unsaved_items.length).to.equal(1)
})
})
-1
View File
@@ -84,7 +84,6 @@
<script type="module" src="history.test.js"></script>
<script type="module" src="actions.test.js"></script>
<script type="module" src="preferences.test.js"></script>
<script type="module" src="session-sharing.test.js"></script>
<script type="module" src="files.test.js"></script>
<script type="module" src="session.test.js"></script>
<script type="module" src="subscriptions.test.js"></script>
+5 -5
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/snjs",
"version": "2.166.3",
"version": "2.166.8",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -36,17 +36,17 @@
"@babel/core": "*",
"@babel/preset-env": "*",
"@standardnotes/api": "workspace:*",
"@standardnotes/common": "^1.46.4",
"@standardnotes/common": "^1.46.6",
"@standardnotes/domain-core": "^1.11.3",
"@standardnotes/domain-events": "^2.106.0",
"@standardnotes/domain-events": "^2.108.1",
"@standardnotes/encryption": "workspace:*",
"@standardnotes/features": "workspace:*",
"@standardnotes/files": "workspace:*",
"@standardnotes/models": "workspace:*",
"@standardnotes/responses": "workspace:*",
"@standardnotes/security": "^1.7.5",
"@standardnotes/security": "^1.7.6",
"@standardnotes/services": "workspace:*",
"@standardnotes/settings": "^1.19.0",
"@standardnotes/settings": "^1.19.1",
"@standardnotes/sncrypto-common": "workspace:*",
"@standardnotes/sncrypto-web": "workspace:*",
"@standardnotes/utils": "workspace:*",
+20
View File
@@ -3,6 +3,26 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.24.34](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-08)
**Note:** Version bump only for package @standardnotes/ui-services
## [1.24.33](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)
**Note:** Version bump only for package @standardnotes/ui-services
## [1.24.32](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)
**Note:** Version bump only for package @standardnotes/ui-services
## [1.24.31](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-03)
**Note:** Version bump only for package @standardnotes/ui-services
## [1.24.30](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/ui-services
## [1.24.29](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
### Bug Fixes
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/ui-services",
"version": "1.24.29",
"version": "1.24.34",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -15,7 +15,7 @@
"test": "jest spec"
},
"dependencies": {
"@standardnotes/common": "^1.46.4",
"@standardnotes/common": "^1.46.6",
"@standardnotes/features": "workspace:^",
"@standardnotes/filepicker": "workspace:^",
"@standardnotes/services": "workspace:^",
@@ -73,7 +73,7 @@ export class ArchiveManager {
async getZippedDecryptedItemsBlob(data: BackupFile) {
const zip = await import('@zip.js/zip.js')
const zipWriter = new zip.ZipWriter(new zip.BlobWriter('application/zip'))
const zipWriter = new zip.ZipWriter<Blob>(new zip.BlobWriter('application/zip'))
const items = data.items
const blob = new Blob([JSON.stringify(data, null, 2)], {
@@ -116,7 +116,7 @@ export class ArchiveManager {
async zipData(data: ZippableData): Promise<Blob> {
const zip = await import('@zip.js/zip.js')
const writer = new zip.ZipWriter(new zip.BlobWriter('application/zip'))
const writer = new zip.ZipWriter<Blob>(new zip.BlobWriter('application/zip'))
const filenameCounts: Record<string, number> = {}
@@ -0,0 +1,3 @@
export const ValidAppViewRoutes = ['u2f'] as const
export type AppViewRouteParam = typeof ValidAppViewRoutes[number]
@@ -4,4 +4,5 @@ export enum RootQueryParam {
DemoToken = 'demo-token',
AcceptSubscriptionInvite = 'accept-subscription-invite',
UserRequest = 'user-request',
AppViewRoute = 'route',
}
@@ -1,5 +1,6 @@
import { UserRequestType } from '@standardnotes/common'
import { PreferenceId } from './../Preferences/PreferenceId'
import { AppViewRouteParam, ValidAppViewRoutes } from './Params/AppViewRouteParams'
import { DemoParams } from './Params/DemoParams'
import { OnboardingParams } from './Params/OnboardingParams'
import { PurchaseParams } from './Params/PurchaseParams'
@@ -78,6 +79,18 @@ export class RouteParser implements RouteParserInterface {
}
}
get appViewRouteParam(): AppViewRouteParam | undefined {
this.checkForProperRouteType(RouteType.AppViewRoute)
const appViewRoute = this.searchParams.get(RootQueryParam.AppViewRoute) as AppViewRouteParam
if (!ValidAppViewRoutes.includes(appViewRoute)) {
return
}
return this.searchParams.get(RootQueryParam.AppViewRoute) as AppViewRouteParam
}
private checkForProperRouteType(type: RouteType): void {
if (this.parsedType !== type) {
throw new Error('Accessing invalid params')
@@ -99,6 +112,7 @@ export class RouteParser implements RouteParserInterface {
[RootQueryParam.DemoToken, RouteType.Demo],
[RootQueryParam.AcceptSubscriptionInvite, RouteType.AcceptSubscriptionInvite],
[RootQueryParam.UserRequest, RouteType.UserRequest],
[RootQueryParam.AppViewRoute, RouteType.AppViewRoute],
])
for (const rootQueryParam of rootQueryParametersMap.keys()) {
@@ -1,3 +1,4 @@
import { AppViewRouteParam } from './Params/AppViewRouteParams'
import { DemoParams } from './Params/DemoParams'
import { OnboardingParams } from './Params/OnboardingParams'
import { PurchaseParams } from './Params/PurchaseParams'
@@ -13,5 +14,6 @@ export interface RouteParserInterface {
get onboardingParams(): OnboardingParams
get subscriptionInviteParams(): SubscriptionInviteParams
get userRequestParams(): UserRequestParams
get appViewRouteParam(): AppViewRouteParam | undefined
get type(): RouteType
}
@@ -5,5 +5,6 @@ export enum RouteType {
AcceptSubscriptionInvite = 'accept-subscription-invite',
UserRequest = 'user-request',
Demo = 'demo',
AppViewRoute = 'route',
None = 'none',
}
+4
View File
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.16.5](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/utils
## [1.16.4](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-01-24)
**Note:** Version bump only for package @standardnotes/utils
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/utils",
"version": "1.16.4",
"version": "1.16.5",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -25,7 +25,7 @@
"test": "jest spec"
},
"dependencies": {
"@standardnotes/common": "^1.46.4",
"@standardnotes/common": "^1.46.6",
"dompurify": "^2.4.1",
"lodash": "^4.17.21",
"reflect-metadata": "^0.1.13"
+44
View File
@@ -3,6 +3,50 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [3.150.15](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-08)
**Note:** Version bump only for package @standardnotes/web
## [3.150.14](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)
**Note:** Version bump only for package @standardnotes/web
## [3.150.13](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)
**Note:** Version bump only for package @standardnotes/web
## [3.150.12](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)
**Note:** Version bump only for package @standardnotes/web
## [3.150.11](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-03)
**Note:** Version bump only for package @standardnotes/web
## [3.150.10](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-02)
**Note:** Version bump only for package @standardnotes/web
## [3.150.9](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-02)
**Note:** Version bump only for package @standardnotes/web
## [3.150.8](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/web
## [3.150.7](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/web
## [3.150.6](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/web
## [3.150.5](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/web
## [3.150.4](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)
**Note:** Version bump only for package @standardnotes/web
+121
View File
@@ -1,5 +1,126 @@
{
"versions": [
{
"version": "3.150.15",
"title": "[3.150.15](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-08)",
"date": null,
"body": "**Note:** Version bump only for package @standardnotes/web",
"parsed": {
"_": [
"Note: Version bump only for package @standardnotes/web"
]
}
},
{
"version": "3.150.14",
"title": "[3.150.14](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)",
"date": null,
"body": "**Note:** Version bump only for package @standardnotes/web",
"parsed": {
"_": [
"Note: Version bump only for package @standardnotes/web"
]
}
},
{
"version": "3.150.13",
"title": "[3.150.13](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)",
"date": null,
"body": "**Note:** Version bump only for package @standardnotes/web",
"parsed": {
"_": [
"Note: Version bump only for package @standardnotes/web"
]
}
},
{
"version": "3.150.12",
"title": "[3.150.12](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-07)",
"date": null,
"body": "**Note:** Version bump only for package @standardnotes/web",
"parsed": {
"_": [
"Note: Version bump only for package @standardnotes/web"
]
}
},
{
"version": "3.150.11",
"title": "[3.150.11](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-03)",
"date": null,
"body": "**Note:** Version bump only for package @standardnotes/web",
"parsed": {
"_": [
"Note: Version bump only for package @standardnotes/web"
]
}
},
{
"version": "3.150.10",
"title": "[3.150.10](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-02)",
"date": null,
"body": "**Note:** Version bump only for package @standardnotes/web",
"parsed": {
"_": [
"Note: Version bump only for package @standardnotes/web"
]
}
},
{
"version": "3.150.9",
"title": "[3.150.9](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-02)",
"date": null,
"body": "**Note:** Version bump only for package @standardnotes/web",
"parsed": {
"_": [
"Note: Version bump only for package @standardnotes/web"
]
}
},
{
"version": "3.150.8",
"title": "[3.150.8](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)",
"date": null,
"body": "**Note:** Version bump only for package @standardnotes/web",
"parsed": {
"_": [
"Note: Version bump only for package @standardnotes/web"
]
}
},
{
"version": "3.150.7",
"title": "[3.150.7](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)",
"date": null,
"body": "**Note:** Version bump only for package @standardnotes/web",
"parsed": {
"_": [
"Note: Version bump only for package @standardnotes/web"
]
}
},
{
"version": "3.150.6",
"title": "[3.150.6](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)",
"date": null,
"body": "**Note:** Version bump only for package @standardnotes/web",
"parsed": {
"_": [
"Note: Version bump only for package @standardnotes/web"
]
}
},
{
"version": "3.150.5",
"title": "[3.150.5](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)",
"date": null,
"body": "**Note:** Version bump only for package @standardnotes/web",
"parsed": {
"_": [
"Note: Version bump only for package @standardnotes/web"
]
}
},
{
"version": "3.150.4",
"title": "[3.150.4](https://github.com/standardnotes/app/compare/@standardnotes/[email protected]...@standardnotes/[email protected]) (2023-03-01)",
+7 -7
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/web",
"version": "3.150.4",
"version": "3.150.15",
"license": "AGPL-3.0-or-later",
"main": "dist/app.js",
"author": "Standard Notes.",
@@ -38,6 +38,7 @@
"@reach/listbox": "^0.18.0",
"@reach/tooltip": "^0.18.0",
"@reach/visually-hidden": "^0.18.0",
"@simplewebauthn/browser": "^7.1.0",
"@standardnotes/authenticator": "^2.3.9",
"@standardnotes/autobiography-theme": "^1.2.7",
"@standardnotes/bold-editor": "^1.6.4",
@@ -51,7 +52,7 @@
"@standardnotes/markdown-hybrid": "^1.7.7",
"@standardnotes/markdown-math": "^1.4.2",
"@standardnotes/markdown-minimal": "^1.3.0",
"@standardnotes/markdown-visual": "^1.0.7",
"@standardnotes/markdown-visual": "^1.3.2",
"@standardnotes/midnight-theme": "^1.4.6",
"@standardnotes/rich-text": "^1.8.7",
"@standardnotes/simple-task-editor": "^1.3.10",
@@ -87,8 +88,8 @@
"lint-staged": ">=13",
"mini-css-extract-plugin": "^2.7.2",
"minimatch": "^5.1.1",
"mobx": "^6.7.0",
"mobx-react-lite": "^3.4.0",
"mobx": "^6.8.0",
"mobx-react-lite": "^3.4.2",
"node-sass": "^8.0.0",
"npm-check-updates": "*",
"postcss": "^8.4.19",
@@ -100,9 +101,9 @@
"react-dom": "^18.2.0",
"react-refresh": "^0.14.0",
"sass-loader": "*",
"styled-components": "^5.3.6",
"styled-components": "^5.3.8",
"svg-jest": "^1.0.1",
"tailwindcss": "^3.2.4",
"tailwindcss": "^3.2.7",
"ts-jest": "^29.0.3",
"ts-loader": "^9.4.2",
"typescript": "*",
@@ -116,7 +117,6 @@
},
"dependencies": {
"@lexical/headless": "0.8.1",
"@simplewebauthn/browser": "^7.0.0",
"contactjs": "2.1.5"
}
}
@@ -0,0 +1,7 @@
{
"webcredentials": {
"apps": [
"HKF9BXSN95.com.standardnotes.standardnotes"
]
}
}
+9
View File
@@ -36,6 +36,8 @@ import { WebApplication } from './Application/Application'
import { createRoot, Root } from 'react-dom/client'
import { ElementIds } from './Constants/ElementIDs'
import { setDefaultMonospaceFont } from './setDefaultMonospaceFont'
import { RouteParser, RouteType } from '@standardnotes/ui-services'
import U2FAuthIframe from './Components/U2FAuthIframe/U2FAuthIframe'
let keyCount = 0
const getKey = () => {
@@ -71,6 +73,13 @@ const startApplication: StartApplication = async function startApplication(
setDefaultMonospaceFont(device.platform)
const route = new RouteParser(window.location.href)
if (route.type === RouteType.AppViewRoute && route.appViewRouteParam === 'u2f') {
root.render(<U2FAuthIframe />)
return
}
root.render(
<ApplicationGroupView
key={getKey()}
@@ -426,6 +426,18 @@ export class WebApplication extends SNApplication implements WebApplicationInter
this.getViewControllerManager().accountMenuController.setShow(true)
}
hideAccountMenu(): void {
this.getViewControllerManager().accountMenuController.setShow(false)
}
/**
* Full U2F clients are only web browser clients. They support adding and removing keys as well as authentication.
* The desktop and mobile clients cannot support adding keys.
*/
get isFullU2FClient(): boolean {
return this.environment === Environment.Web
}
geDefaultEditorIdentifier(currentTag?: SNTag): EditorIdentifier {
return (
currentTag?.preferences?.editorIdentifier ||
@@ -90,7 +90,11 @@ const ApplicationView: FunctionComponent<Props> = ({ application, mainApplicatio
return
}
void application.user.populateSessionFromDemoShareToken(token)
const status = application.status.addMessage('Preparing demo...')
void application.user.populateSessionFromDemoShareToken(token).then(() => {
application.status.removeMessage(status)
application.hideAccountMenu()
})
}, [application])
const onAppLaunch = useCallback(() => {
@@ -4,6 +4,7 @@ import { RefObject, useState } from 'react'
import Button from '../Button/Button'
import Icon from '../Icon/Icon'
import { InputValue } from './InputValue'
import U2FPromptIframeContainer from './U2FPromptIframeContainer'
type Props = {
application: WebApplication
@@ -17,6 +18,18 @@ const U2FPrompt = ({ application, onValueChange, prompt, buttonRef, contextData
const [authenticatorResponse, setAuthenticatorResponse] = useState<Record<string, unknown> | null>(null)
const [error, setError] = useState('')
if (!application.isFullU2FClient) {
return (
<U2FPromptIframeContainer
contextData={contextData}
apiHost={application.getHost() || window.defaultSyncServer}
onResponse={(response) => {
onValueChange(response, prompt)
}}
/>
)
}
return (
<div className="min-w-76">
{error && <div className="text-red-500">{error}</div>}
@@ -27,18 +40,18 @@ const U2FPrompt = ({ application, onValueChange, prompt, buttonRef, contextData
onClick={async () => {
if (!contextData || contextData.username === undefined) {
setError('No username provided')
return
}
const authenticatorResponseOrError = await application.getAuthenticatorAuthenticationResponse.execute({
username: contextData.username,
username: contextData.username as string,
})
if (authenticatorResponseOrError.isFailed()) {
setError(authenticatorResponseOrError.getError())
return
}
const authenticatorResponse = authenticatorResponseOrError.getValue()
setAuthenticatorResponse(authenticatorResponse)
@@ -0,0 +1,66 @@
import { log, LoggingDomain } from '@/Logging'
import { isDev } from '@/Utils'
import { useEffect, useRef } from 'react'
type Props = {
contextData?: Record<string, unknown>
onResponse: (response: string) => void
apiHost: string
}
const U2F_IFRAME_ORIGIN = isDev ? 'http://localhost:3001/?route=u2f' : 'https://app.standardnotes.com/?route=u2f'
const U2FPromptIframeContainer = ({ contextData, onResponse, apiHost }: Props) => {
const iframeRef = useRef<HTMLIFrameElement>(null)
useEffect(() => {
const messageHandler = (event: MessageEvent) => {
log(LoggingDomain.U2F, 'Native client received message', event)
const eventDoesNotComeFromU2FIFrame = event.origin !== new URL(U2F_IFRAME_ORIGIN).origin
if (eventDoesNotComeFromU2FIFrame) {
log(
LoggingDomain.U2F,
'Not sending data to U2F iframe; origin does not match',
event.origin,
new URL(U2F_IFRAME_ORIGIN).origin,
)
return
}
if (event.data.mountedAuthView) {
if (iframeRef.current?.contentWindow) {
log(LoggingDomain.U2F, 'Sending contextData to U2F iframe', contextData)
iframeRef.current.contentWindow.postMessage(
{ username: (contextData as Record<string, unknown>).username, apiHost },
U2F_IFRAME_ORIGIN,
)
}
return
}
if (event.data.assertionResponse) {
log(LoggingDomain.U2F, 'Received assertion response from U2F iframe', event.data.assertionResponse)
onResponse(event.data.assertionResponse)
}
}
window.addEventListener('message', messageHandler)
return () => {
window.removeEventListener('message', messageHandler)
}
}, [contextData, onResponse, apiHost])
return (
<iframe
ref={iframeRef}
src={U2F_IFRAME_ORIGIN}
className="h-40 w-full"
title="U2F"
allow="publickey-credentials-get"
id="u2f"
/>
)
}
export default U2FPromptIframeContainer
@@ -1,5 +1,5 @@
import { classNames } from '@standardnotes/utils'
import { forwardRef, Fragment, Ref } from 'react'
import { forwardRef, Fragment, KeyboardEventHandler, Ref, useCallback } from 'react'
import { DecoratedInputProps } from './DecoratedInputProps'
const getClassNames = (hasLeftDecorations: boolean, hasRightDecorations: boolean, roundedFull?: boolean) => {
@@ -31,6 +31,7 @@ const DecoratedInput = forwardRef(
onFocus,
onKeyDown,
onKeyUp,
onEnter,
placeholder = '',
right,
type = 'text',
@@ -38,6 +39,7 @@ const DecoratedInput = forwardRef(
value,
defaultValue,
roundedFull,
autofocus = false,
}: DecoratedInputProps,
ref: Ref<HTMLInputElement>,
) => {
@@ -45,6 +47,16 @@ const DecoratedInput = forwardRef(
const hasRightDecorations = Boolean(right?.length)
const computedClassNames = getClassNames(hasLeftDecorations, hasRightDecorations, roundedFull)
const handleKeyUp: KeyboardEventHandler = useCallback(
(e) => {
if (e.key === 'Enter') {
onEnter?.()
}
onKeyUp?.(e)
},
[onKeyUp, onEnter],
)
return (
<div
className={classNames(
@@ -63,6 +75,7 @@ const DecoratedInput = forwardRef(
<input
autoComplete={autocomplete ? 'on' : 'off'}
autoFocus={autofocus}
className={`${computedClassNames.input} ${disabled ? computedClassNames.disabled : ''} ${className?.input}`}
data-lpignore={type !== 'password' ? true : false}
disabled={disabled}
@@ -71,7 +84,7 @@ const DecoratedInput = forwardRef(
onChange={(e) => onChange && onChange((e.target as HTMLInputElement).value)}
onFocus={onFocus}
onKeyDown={onKeyDown}
onKeyUp={onKeyUp}
onKeyUp={handleKeyUp}
placeholder={placeholder}
ref={ref}
title={title}
@@ -2,6 +2,7 @@ import { FocusEventHandler, KeyboardEventHandler, ReactNode } from 'react'
export type DecoratedInputProps = {
autocomplete?: boolean
autofocus?: boolean
spellcheck?: boolean
className?: {
container?: string
@@ -17,6 +18,7 @@ export type DecoratedInputProps = {
onFocus?: FocusEventHandler
onKeyDown?: KeyboardEventHandler
onKeyUp?: KeyboardEventHandler
onEnter?: () => void
placeholder?: string
right?: ReactNode[]
title?: string
@@ -1,6 +1,6 @@
import { FunctionComponent, useCallback, useState } from 'react'
import { observer } from 'mobx-react-lite'
import { UseCaseInterface } from '@standardnotes/snjs'
import { AddAuthenticator } from '@standardnotes/snjs'
import DecoratedInput from '@/Components/Input/DecoratedInput'
import { UserProvider } from '@/Components/Preferences/Providers'
@@ -9,7 +9,7 @@ import { MutuallyExclusiveMediaQueryBreakpoints, useMediaQuery } from '@/Hooks/u
type Props = {
userProvider: UserProvider
addAuthenticator: UseCaseInterface<void>
addAuthenticator: AddAuthenticator
onDeviceAddingModalToggle: (show: boolean) => void
onDeviceAdded: () => Promise<void>
}
@@ -82,11 +82,22 @@ const U2FAddDeviceView: FunctionComponent<Props> = ({
},
]}
>
<div className="w-25 h-25 flex items-center justify-center bg-info">...Some Cool Device Picture Here...</div>
<div className="flex flex-grow flex-col gap-2">
<DecoratedInput className={{ container: 'w-92 ml-4' }} value={deviceName} onChange={handleDeviceNameChange} />
<div className="flex px-4 py-4">
<div className="ml-4 flex flex-grow flex-col gap-1">
<label htmlFor="u2f-device-name" className="mb-2 text-sm font-semibold">
Device Name
</label>
<DecoratedInput
autofocus
id="u2f-device-name"
className={{ container: 'w-92' }}
value={deviceName}
onChange={handleDeviceNameChange}
onEnter={handleAddDeviceClick}
/>
{errorMessage && <div className="mt-1.5 text-danger">{errorMessage}</div>}
</div>
</div>
{errorMessage && <div className="text-error">{errorMessage}</div>}
</Modal>
)
}
@@ -3,17 +3,27 @@ import { observer } from 'mobx-react-lite'
import { Text } from '@/Components/Preferences/PreferencesComponents/Content'
import { UserProvider } from '@/Components/Preferences/Providers'
import { useApplication } from '@/Components/ApplicationProvider'
type Props = {
userProvider: UserProvider
}
const U2FDescription: FunctionComponent<Props> = ({ userProvider }) => {
const application = useApplication()
if (userProvider.getUser() === undefined) {
return <Text>Sign in or register for an account to configure U2F.</Text>
}
return <Text>Authenticate with a U2F hardware device.</Text>
return (
<div>
<Text>Authenticate with a U2F hardware device such as Yubikey.</Text>
{!application.isFullU2FClient && (
<Text className="italic">Please visit the web app in order to add a U2F Device.</Text>
)}
</div>
)
}
export default observer(U2FDescription)
@@ -1,9 +1,10 @@
import { FunctionComponent, useCallback } from 'react'
import { observer } from 'mobx-react-lite'
import { Text } from '@/Components/Preferences/PreferencesComponents/Content'
import { Subtitle } from '@/Components/Preferences/PreferencesComponents/Content'
import { WebApplication } from '@/Application/Application'
import Button from '@/Components/Button/Button'
import Icon from '@/Components/Icon/Icon'
type Props = {
application: WebApplication
@@ -31,24 +32,25 @@ const U2FDevicesList: FunctionComponent<Props> = ({ application, devices, onErro
)
return (
<div className="flex flex-row items-center">
<div>
{devices.length > 0 && (
<div className="flex flex-grow flex-col">
<div>
<Text>Devices:</Text>
<>
<Subtitle>Devices</Subtitle>
<div className="flex flex-grow flex-col divide-y divide-border">
{devices.map((device) => (
<div className="flex items-center py-2" key={`device-${device.id}`}>
<Icon type="security" />
<div className="ml-2 mr-auto text-sm">{device.name}</div>
<Button
small
key={device.id}
label="Delete"
onClick={async () => handleDeleteButtonOnClick(device.id)}
></Button>
</div>
))}
</div>
{devices.map((device) => (
<div key="device-{device.id}">
<Text>{device.name}</Text>
<Button
key={device.id}
primary={true}
label="Delete"
onClick={async () => handleDeleteButtonOnClick(device.id)}
></Button>
</div>
))}
</div>
</>
)}
</div>
)
@@ -10,10 +10,10 @@ type Props = {
const U2FTitle: FunctionComponent<Props> = ({ userProvider }) => {
if (userProvider.getUser() === undefined) {
return <Title>Universal 2nd Factor authentication not available</Title>
return <Title>Universal 2nd factor authentication not available</Title>
}
return <Title>Universal 2nd Factor authentication</Title>
return <Title>Universal 2nd Factor Authentication</Title>
}
export default observer(U2FTitle)
@@ -11,6 +11,7 @@ import U2FDescription from './U2FDescription'
import Button from '@/Components/Button/Button'
import U2FAddDeviceView from '../U2FAddDeviceView'
import U2FDevicesList from './U2FDevicesList'
import ModalOverlay from '@/Components/Modal/ModalOverlay'
type Props = {
application: WebApplication
@@ -45,34 +46,36 @@ const U2FView: FunctionComponent<Props> = ({ application, userProvider }) => {
<>
<PreferencesGroup>
<PreferencesSegment>
<div className="flex flex-row items-center">
<div className="flex flex-grow flex-col">
<U2FTitle userProvider={userProvider} />
<U2FDescription userProvider={userProvider} />
</div>
<PreferencesSegment>
<Button label="Add Device" primary onClick={handleAddDeviceClick} />
</PreferencesSegment>
<div className="flex flex-col">
<U2FTitle userProvider={userProvider} />
<U2FDescription userProvider={userProvider} />
</div>
</PreferencesSegment>
<PreferencesSegment>
{error && <div className="text-red-500">{error}</div>}
<PreferencesSegment classes="mt-2">
{error && <div className="text-danger">{error}</div>}
<U2FDevicesList
application={application}
devices={devices}
onError={setError}
onDeviceDeleted={loadAuthenticatorDevices}
/>
<Button
className="mt-1"
disabled={!application.isFullU2FClient}
label="Add Device"
primary
onClick={handleAddDeviceClick}
/>
</PreferencesSegment>
</PreferencesGroup>
{showDeviceAddingModal && (
<ModalOverlay isOpen={showDeviceAddingModal}>
<U2FAddDeviceView
onDeviceAddingModalToggle={setShowDeviceAddingModal}
onDeviceAdded={loadAuthenticatorDevices}
userProvider={userProvider}
addAuthenticator={application.addAuthenticator}
/>
)}
</ModalOverlay>
</>
)
}
@@ -0,0 +1,109 @@
import { useCallback, useEffect, useState } from 'react'
import Button from '../Button/Button'
import { startAuthentication } from '@simplewebauthn/browser'
import { log, LoggingDomain } from '@/Logging'
/**
* An iframe for use in the desktop and mobile application that allows them to load app.standardnotes.com to perform
* U2F authentication. Web applications do not need this iframe, as they can perform U2F authentication directly.
*/
const U2FAuthIframe = () => {
const [username, setUsername] = useState('')
const [apiHost, setApiHost] = useState<string | null>(null)
const [source, setSource] = useState<MessageEvent['source'] | null>(null)
const NATIVE_CLIENT_ORIGIN = 'file://'
useEffect(() => {
window.parent.postMessage(
{
mountedAuthView: true,
},
NATIVE_CLIENT_ORIGIN,
)
}, [])
useEffect(() => {
const messageHandler = (event: MessageEvent) => {
log(LoggingDomain.U2F, 'U2F iframe received message', event)
const eventDoesNotComeFromNativeClient = event.origin !== NATIVE_CLIENT_ORIGIN
if (eventDoesNotComeFromNativeClient) {
log(LoggingDomain.U2F, 'Not setting username; origin does not match', event.origin, NATIVE_CLIENT_ORIGIN)
return
}
if (event.data.username) {
setUsername(event.data.username)
setApiHost(event.data.apiHost)
setSource(event.source)
}
}
window.addEventListener('message', messageHandler)
return () => {
window.removeEventListener('message', messageHandler)
}
}, [])
const [info, setInfo] = useState('')
const [error, setError] = useState('')
const beginAuthentication = useCallback(async () => {
setInfo('')
setError('')
try {
if (!username || !source) {
throw new Error('No username provided')
}
const response = await fetch(`${apiHost}/v1/authenticators/generate-authentication-options`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
username,
}),
})
const jsonResponse = await response.json()
if (!jsonResponse.data || !jsonResponse.data.options) {
throw new Error('No options returned from server')
}
setInfo('Waiting for U2F device...')
const assertionResponse = await startAuthentication(jsonResponse.data.options)
;(source as WindowProxy).postMessage(
{
assertionResponse,
},
NATIVE_CLIENT_ORIGIN,
)
setInfo('Authentication successful!')
} catch (error) {
if (!error) {
return
}
setError(error.toString())
console.error(error.toString())
}
}, [source, username, apiHost])
return (
<div className="flex h-full w-full flex-col items-center justify-center gap-2">
<div className="mb-2 text-center">Insert your U2F device, then press the button below to authenticate.</div>
<Button onClick={beginAuthentication}>Authenticate</Button>
<div className="mt-2">
<div>{info}</div>
<div className="text-danger">{error}</div>
</div>
</div>
)
}
export default U2FAuthIframe
+2
View File
@@ -11,6 +11,7 @@ export enum LoggingDomain {
BlockEditor,
Purchasing,
Panes,
U2F,
}
const LoggingStatus: Record<LoggingDomain, boolean> = {
@@ -23,6 +24,7 @@ const LoggingStatus: Record<LoggingDomain, boolean> = {
[LoggingDomain.BlockEditor]: false,
[LoggingDomain.Purchasing]: false,
[LoggingDomain.Panes]: false,
[LoggingDomain.U2F]: false,
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
+127 -78
View File
@@ -4622,10 +4622,10 @@ __metadata:
languageName: node
linkType: hard
"@simplewebauthn/browser@npm:^7.0.0":
version: 7.0.0
resolution: "@simplewebauthn/browser@npm:7.0.0"
checksum: eb8d7e2d923649c116275cc9bfbabfa27a180cd33dbf9d6a28c7aa9460ea79cd25204c9a7d76ed8cc24764da4a09b5939209aa30e9b295b9d54e497bb9b652a4
"@simplewebauthn/browser@npm:^7.1.0":
version: 7.1.0
resolution: "@simplewebauthn/browser@npm:7.1.0"
checksum: 925e26607536cd9223e474229df216cc32bc06fac569f27e03c6d31ff502f3dbf6f5a9500caaa37a9abf1632fc99fd582a6596672b7f5468920a74618e1aec6e
languageName: node
linkType: hard
@@ -4697,12 +4697,12 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/api@workspace:packages/api"
dependencies:
"@standardnotes/common": ^1.46.4
"@standardnotes/common": ^1.46.6
"@standardnotes/domain-core": ^1.11.3
"@standardnotes/encryption": "workspace:*"
"@standardnotes/models": "workspace:*"
"@standardnotes/responses": "workspace:*"
"@standardnotes/security": ^1.7.5
"@standardnotes/security": ^1.7.6
"@standardnotes/utils": "workspace:*"
"@types/jest": ^29.2.3
"@types/lodash": ^4.14.189
@@ -4817,6 +4817,15 @@ __metadata:
languageName: node
linkType: hard
"@standardnotes/common@npm:^1.46.6":
version: 1.46.6
resolution: "@standardnotes/common@npm:1.46.6"
dependencies:
reflect-metadata: ^0.1.13
checksum: 295f0765e81f3f6054c1eed596be2b48266ee651efdf8d7bb2eadcf1e22312b286872a163342f4c32de4fceea4ff67dabf2d64a1041723716bd30658c502bd81
languageName: node
linkType: hard
"@standardnotes/component-relay@github:standardnotes/component-relay#839ff5db9bc92db9d42cad8d202ddc4df729597d, @standardnotes/component-relay@standardnotes/component-relay#839ff5db9bc92db9d42cad8d202ddc4df729597d":
version: 2.3.0
resolution: "@standardnotes/component-relay@https://github.com/standardnotes/component-relay.git#commit=839ff5db9bc92db9d42cad8d202ddc4df729597d"
@@ -4900,14 +4909,13 @@ __metadata:
languageName: node
linkType: hard
"@standardnotes/domain-events@npm:^2.106.0":
version: 2.106.0
resolution: "@standardnotes/domain-events@npm:2.106.0"
"@standardnotes/domain-events@npm:^2.108.1":
version: 2.108.1
resolution: "@standardnotes/domain-events@npm:2.108.1"
dependencies:
"@standardnotes/features": ^1.58.1
"@standardnotes/predicates": 1.6.4
"@standardnotes/security": 1.7.5
checksum: db98a6b4ef5181a02862a3989df2d8f0a4929044456583c9ffda767c31c5dec676a4da82d1fe581ffc6e35a977a05b071a2a8646fee2a4bdbdf1b265ccbb70d8
"@standardnotes/predicates": 1.6.5
"@standardnotes/security": 1.7.6
checksum: 492bec98838664c3033041df5d25d610e8e8fb0a69358f8dc660fe4a5cb65a9fa3ee6b62829af2edcd1d59640c66926a0c72f0ae0cbdb1804292b6ec02485f9d
languageName: node
linkType: hard
@@ -4942,7 +4950,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/encryption@workspace:packages/encryption"
dependencies:
"@standardnotes/common": ^1.46.4
"@standardnotes/common": ^1.46.6
"@standardnotes/config": 2.4.3
"@standardnotes/models": "workspace:*"
"@standardnotes/responses": "workspace:*"
@@ -4961,24 +4969,6 @@ __metadata:
languageName: unknown
linkType: soft
"@standardnotes/features@^1.58.1, @standardnotes/features@workspace:*, @standardnotes/features@workspace:^, @standardnotes/features@workspace:packages/features":
version: 0.0.0-use.local
resolution: "@standardnotes/features@workspace:packages/features"
dependencies:
"@standardnotes/common": ^1.46.4
"@standardnotes/domain-core": ^1.11.3
"@standardnotes/security": ^1.7.5
"@types/jest": ^29.2.3
"@typescript-eslint/eslint-plugin": "*"
eslint: "*"
eslint-plugin-prettier: "*"
jest: ^29.3.1
reflect-metadata: ^0.1.13
ts-jest: ^29.0.3
typescript: 4.9.3
languageName: unknown
linkType: soft
"@standardnotes/features@npm:1.54.0":
version: 1.54.0
resolution: "@standardnotes/features@npm:1.54.0"
@@ -4991,11 +4981,29 @@ __metadata:
languageName: node
linkType: hard
"@standardnotes/features@workspace:*, @standardnotes/features@workspace:^, @standardnotes/features@workspace:packages/features":
version: 0.0.0-use.local
resolution: "@standardnotes/features@workspace:packages/features"
dependencies:
"@standardnotes/common": ^1.46.6
"@standardnotes/domain-core": ^1.11.3
"@standardnotes/security": ^1.7.6
"@types/jest": ^29.2.3
"@typescript-eslint/eslint-plugin": "*"
eslint: "*"
eslint-plugin-prettier: "*"
jest: ^29.3.1
reflect-metadata: ^0.1.13
ts-jest: ^29.0.3
typescript: 4.9.3
languageName: unknown
linkType: soft
"@standardnotes/filepicker@workspace:*, @standardnotes/filepicker@workspace:^, @standardnotes/filepicker@workspace:packages/filepicker":
version: 0.0.0-use.local
resolution: "@standardnotes/filepicker@workspace:packages/filepicker"
dependencies:
"@standardnotes/common": ^1.46.4
"@standardnotes/common": ^1.46.6
"@standardnotes/files": "workspace:*"
"@standardnotes/utils": "workspace:*"
"@types/jest": ^29.2.3
@@ -5110,10 +5118,13 @@ __metadata:
languageName: node
linkType: hard
"@standardnotes/markdown-visual@npm:^1.0.7":
version: 1.0.7
resolution: "@standardnotes/markdown-visual@npm:1.0.7"
checksum: 8827893f0953beb03ff6da77304968dfdf9a7144022c770947b56de16aee006ce9550cdf114fa2751bc836b0092924f2dd352049b91d6d67c0fd12b88b36d74c
"@standardnotes/markdown-visual@npm:^1.3.2":
version: 1.3.2
resolution: "@standardnotes/markdown-visual@npm:1.3.2"
dependencies:
"@standardnotes/editor-kit": "github:standardnotes/editor-kit#50ffb15c935a297b082eb00ffd031adc05080d7f"
"@standardnotes/styles": 1.6.1
checksum: 1c97c0baead932688ba01c0446a2995cd7c304aba7d00a0de280b87ad027c31c84b3be19199ed4779632767fcd16271db304c083dfe886f28864c32d3386c187
languageName: node
linkType: hard
@@ -5179,7 +5190,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/models@workspace:packages/models"
dependencies:
"@standardnotes/common": ^1.46.4
"@standardnotes/common": ^1.46.6
"@standardnotes/features": "workspace:*"
"@standardnotes/responses": "workspace:*"
"@standardnotes/utils": "workspace:^"
@@ -5196,10 +5207,10 @@ __metadata:
languageName: unknown
linkType: soft
"@standardnotes/predicates@npm:1.6.4":
version: 1.6.4
resolution: "@standardnotes/predicates@npm:1.6.4"
checksum: 6d7235896a6d591f6e33d2d0b89c58850d357095d26e1d74264db1d77164a8f1f6673f4095c660719992f2aa8411cfbfe79781f004c3eb2aa82a761e34827f60
"@standardnotes/predicates@npm:1.6.5":
version: 1.6.5
resolution: "@standardnotes/predicates@npm:1.6.5"
checksum: 6bdd927062f8dcbd65f99b93d48bbbbcbe0c525517a5b5827c90a8b22286c99a95c0bb1cdda401e4fe5940e02a04b03e8616596d479d52bad1c783d9953e8d0b
languageName: node
linkType: hard
@@ -5226,9 +5237,9 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/responses@workspace:packages/responses"
dependencies:
"@standardnotes/common": ^1.46.4
"@standardnotes/common": ^1.46.6
"@standardnotes/features": "workspace:*"
"@standardnotes/security": ^1.7.5
"@standardnotes/security": ^1.7.6
"@types/jest": ^29.2.3
"@typescript-eslint/eslint-plugin": "*"
eslint: "*"
@@ -5249,13 +5260,13 @@ __metadata:
languageName: node
linkType: hard
"@standardnotes/security@npm:1.7.5, @standardnotes/security@npm:^1.7.5":
version: 1.7.5
resolution: "@standardnotes/security@npm:1.7.5"
"@standardnotes/security@npm:1.7.6, @standardnotes/security@npm:^1.7.6":
version: 1.7.6
resolution: "@standardnotes/security@npm:1.7.6"
dependencies:
jsonwebtoken: ^9.0.0
reflect-metadata: ^0.1.13
checksum: 69d180d25936cad64ee19d8932aedff60b91f4a25f96084e0a686b228773aba856f50c3da265d426d64160dff28f20d9d7980a625bce00fc6a47416caa4e130e
checksum: 1d6f2c74e0a69ab8693880e7e1d71e167a43a9f23ff9bd0434db8aadc41ae779841d53905fea0498350dab58df16ec319184dc42ff2dcef8d559ce8f2589ce9c
languageName: node
linkType: hard
@@ -5270,6 +5281,16 @@ __metadata:
languageName: node
linkType: hard
"@standardnotes/security@npm:^1.7.5":
version: 1.7.5
resolution: "@standardnotes/security@npm:1.7.5"
dependencies:
jsonwebtoken: ^9.0.0
reflect-metadata: ^0.1.13
checksum: 69d180d25936cad64ee19d8932aedff60b91f4a25f96084e0a686b228773aba856f50c3da265d426d64160dff28f20d9d7980a625bce00fc6a47416caa4e130e
languageName: node
linkType: hard
"@standardnotes/services@workspace:*, @standardnotes/services@workspace:^, @standardnotes/services@workspace:packages/services":
version: 0.0.0-use.local
resolution: "@standardnotes/services@workspace:packages/services"
@@ -5296,12 +5317,12 @@ __metadata:
languageName: unknown
linkType: soft
"@standardnotes/settings@npm:^1.19.0":
version: 1.19.0
resolution: "@standardnotes/settings@npm:1.19.0"
"@standardnotes/settings@npm:^1.19.1":
version: 1.19.1
resolution: "@standardnotes/settings@npm:1.19.1"
dependencies:
reflect-metadata: ^0.1.13
checksum: 85816e5d25e2a4cfe014dbe371bc30902b1bb194f5d3c021fe754678ff9bd693255f1d209a66c4375334b1edd40a8f4133480a20a85b88859b3cfbff1a570cc9
checksum: d99d49d4401ac8c973284d8637195c0441e6f73b7e01e9eb4ab14feb27c6d2e928a493d944ed67ea1d6f229bf5ea839b5dd667c373b917aed321bb32972daacb
languageName: node
linkType: hard
@@ -5372,17 +5393,17 @@ __metadata:
"@babel/core": "*"
"@babel/preset-env": "*"
"@standardnotes/api": "workspace:*"
"@standardnotes/common": ^1.46.4
"@standardnotes/common": ^1.46.6
"@standardnotes/domain-core": ^1.11.3
"@standardnotes/domain-events": ^2.106.0
"@standardnotes/domain-events": ^2.108.1
"@standardnotes/encryption": "workspace:*"
"@standardnotes/features": "workspace:*"
"@standardnotes/files": "workspace:*"
"@standardnotes/models": "workspace:*"
"@standardnotes/responses": "workspace:*"
"@standardnotes/security": ^1.7.5
"@standardnotes/security": ^1.7.6
"@standardnotes/services": "workspace:*"
"@standardnotes/settings": ^1.19.0
"@standardnotes/settings": ^1.19.1
"@standardnotes/sncrypto-common": "workspace:*"
"@standardnotes/sncrypto-web": "workspace:*"
"@standardnotes/utils": "workspace:*"
@@ -5500,7 +5521,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/ui-services@workspace:packages/ui-services"
dependencies:
"@standardnotes/common": ^1.46.4
"@standardnotes/common": ^1.46.6
"@standardnotes/features": "workspace:^"
"@standardnotes/filepicker": "workspace:^"
"@standardnotes/services": "workspace:^"
@@ -5522,7 +5543,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/utils@workspace:packages/utils"
dependencies:
"@standardnotes/common": ^1.46.4
"@standardnotes/common": ^1.46.6
"@types/dompurify": ^2.4.0
"@types/jest": ^29.2.3
"@types/jsdom": ^20.0.1
@@ -5561,7 +5582,7 @@ __metadata:
"@reach/listbox": ^0.18.0
"@reach/tooltip": ^0.18.0
"@reach/visually-hidden": ^0.18.0
"@simplewebauthn/browser": ^7.0.0
"@simplewebauthn/browser": ^7.1.0
"@standardnotes/authenticator": ^2.3.9
"@standardnotes/autobiography-theme": ^1.2.7
"@standardnotes/bold-editor": ^1.6.4
@@ -5575,7 +5596,7 @@ __metadata:
"@standardnotes/markdown-hybrid": ^1.7.7
"@standardnotes/markdown-math": ^1.4.2
"@standardnotes/markdown-minimal": ^1.3.0
"@standardnotes/markdown-visual": ^1.0.7
"@standardnotes/markdown-visual": ^1.3.2
"@standardnotes/midnight-theme": ^1.4.6
"@standardnotes/rich-text": ^1.8.7
"@standardnotes/simple-task-editor": ^1.3.10
@@ -5612,8 +5633,8 @@ __metadata:
lint-staged: ">=13"
mini-css-extract-plugin: ^2.7.2
minimatch: ^5.1.1
mobx: ^6.7.0
mobx-react-lite: ^3.4.0
mobx: ^6.8.0
mobx-react-lite: ^3.4.2
node-sass: ^8.0.0
npm-check-updates: "*"
postcss: ^8.4.19
@@ -5625,9 +5646,9 @@ __metadata:
react-dom: ^18.2.0
react-refresh: ^0.14.0
sass-loader: "*"
styled-components: ^5.3.6
styled-components: ^5.3.8
svg-jest: ^1.0.1
tailwindcss: ^3.2.4
tailwindcss: ^3.2.7
ts-jest: ^29.0.3
ts-loader: ^9.4.2
typescript: "*"
@@ -17115,9 +17136,9 @@ __metadata:
languageName: node
linkType: hard
"mobx-react-lite@npm:^3.4.0":
version: 3.4.0
resolution: "mobx-react-lite@npm:3.4.0"
"mobx-react-lite@npm:^3.4.2":
version: 3.4.2
resolution: "mobx-react-lite@npm:3.4.2"
peerDependencies:
mobx: ^6.1.0
react: ^16.8.0 || ^17 || ^18
@@ -17126,7 +17147,7 @@ __metadata:
optional: true
react-native:
optional: true
checksum: 9294e127e281c8b37ec7bcaf17de479f50519e6ad485b58d7b991291900511541a5a718653759d3cf6503462c70325d025e1c2ed376d4584fb1b2d3aac9d9b48
checksum: d3648f7c4f6e3923458b533b7c987397542f33f2905467fdf6e63fcdfa6c51f2c60a5a3ebf72a9d2b326a6c4876932c4312dd4ae2253cf1fc4b02ad586e94aa6
languageName: node
linkType: hard
@@ -17137,6 +17158,13 @@ __metadata:
languageName: node
linkType: hard
"mobx@npm:^6.8.0":
version: 6.8.0
resolution: "mobx@npm:6.8.0"
checksum: f09bb079292ea59023a7e35a9c73ed577e3de9a0175ec3d5a2adc8192e2e3a352b29ec0981ee06d1d63f701f81bb7fc6cc19fd9089edf84a754a8a75ef00ef7f
languageName: node
linkType: hard
"modify-values@npm:^1.0.0":
version: 1.0.1
resolution: "modify-values@npm:1.0.1"
@@ -19015,6 +19043,16 @@ __metadata:
languageName: node
linkType: hard
"postcss-selector-parser@npm:^6.0.11":
version: 6.0.11
resolution: "postcss-selector-parser@npm:6.0.11"
dependencies:
cssesc: ^3.0.0
util-deprecate: ^1.0.2
checksum: 0b01aa9c2d2c8dbeb51e9b204796b678284be9823abc8d6d40a8b16d4149514e922c264a8ed4deb4d6dbced564b9be390f5942c058582d8656351516d6c49cde
languageName: node
linkType: hard
"postcss-value-parser@npm:^4.0.0, postcss-value-parser@npm:^4.0.2, postcss-value-parser@npm:^4.1.0, postcss-value-parser@npm:^4.2.0":
version: 4.2.0
resolution: "postcss-value-parser@npm:4.2.0"
@@ -19022,6 +19060,17 @@ __metadata:
languageName: node
linkType: hard
"postcss@npm:^8.0.9":
version: 8.4.21
resolution: "postcss@npm:8.4.21"
dependencies:
nanoid: ^3.3.4
picocolors: ^1.0.0
source-map-js: ^1.0.2
checksum: e39ac60ccd1542d4f9d93d894048aac0d686b3bb38e927d8386005718e6793dbbb46930f0a523fe382f1bbd843c6d980aaea791252bf5e176180e5a4336d9679
languageName: node
linkType: hard
"postcss@npm:^8.4.18, postcss@npm:^8.4.19":
version: 8.4.19
resolution: "postcss@npm:8.4.19"
@@ -21796,9 +21845,9 @@ __metadata:
languageName: node
linkType: hard
"styled-components@npm:^5.3.6":
version: 5.3.6
resolution: "styled-components@npm:5.3.6"
"styled-components@npm:^5.3.8":
version: 5.3.8
resolution: "styled-components@npm:5.3.8"
dependencies:
"@babel/helper-module-imports": ^7.0.0
"@babel/traverse": ^7.4.5
@@ -21814,7 +21863,7 @@ __metadata:
react: ">= 16.8.0"
react-dom: ">= 16.8.0"
react-is: ">= 16.8.0"
checksum: 68eac1e451be81d66739cf86de8ec9e72f46e7584aa359271761a2437468210bd7cf0a864281fc97dab08c32b35e6bf7513dc8b4104ed6b196cf8d65674dd289
checksum: 60148083f4057cd0dd4ad555e82800ec4ec4b8822fd81645f084e9beebf91420f4c9c75875b44933755d32ec97c46be6b79ca0c23578e5a731e3399e6ea0d901
languageName: node
linkType: hard
@@ -21925,9 +21974,9 @@ __metadata:
languageName: node
linkType: hard
"tailwindcss@npm:^3.2.4":
version: 3.2.4
resolution: "tailwindcss@npm:3.2.4"
"tailwindcss@npm:^3.2.7":
version: 3.2.7
resolution: "tailwindcss@npm:3.2.7"
dependencies:
arg: ^5.0.2
chokidar: ^3.5.3
@@ -21943,12 +21992,12 @@ __metadata:
normalize-path: ^3.0.0
object-hash: ^3.0.0
picocolors: ^1.0.0
postcss: ^8.4.18
postcss: ^8.0.9
postcss-import: ^14.1.0
postcss-js: ^4.0.0
postcss-load-config: ^3.1.4
postcss-nested: 6.0.0
postcss-selector-parser: ^6.0.10
postcss-selector-parser: ^6.0.11
postcss-value-parser: ^4.2.0
quick-lru: ^5.1.1
resolve: ^1.22.1
@@ -21957,7 +22006,7 @@ __metadata:
bin:
tailwind: lib/cli.js
tailwindcss: lib/cli.js
checksum: ec187d180c722ec4f57537f2216c7b21269b525f12aaf353cea464d939c3e6286a1221eb3e1206e45d1f015f296171309ad4d9952899b0245cd07d9500a9401f
checksum: 819446bf67acea1fc738f345d80f328b7bb6e6ef4b24070249a11219307045881cf97baed6258cbdcede7fa18886e9c9c41fd0fa087b3e987cf2948560a2f164
languageName: node
linkType: hard