From 440c3e5420321e1a3bcfe409cf65b44fe45e1330 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson Date: Fri, 6 Mar 2020 08:38:52 -0600 Subject: [PATCH] feat: add ability to view secret key --- .github/workflows/bundle-sizes.yml | 35 ++++++++++ .github/workflows/main.yml | 2 +- package.json | 2 +- packages/app/.circleci/config.yml | 68 ------------------- packages/app/package.json | 2 +- packages/app/src/common/hooks/use-wallet.ts | 18 ++++- packages/app/src/common/track.ts | 29 +++++--- packages/app/src/components/routes.tsx | 4 +- .../app/src/pages/connect/choose-account.tsx | 30 +++++--- packages/app/src/pages/home.tsx | 21 +++++- packages/app/src/store/onboarding/types.ts | 2 + packages/connect/.circleci/config.yml | 30 -------- packages/connect/.github/workflows/main.yml | 14 ---- .../react/components/screen/screen-header.tsx | 21 +++--- packages/ui/.circleci/config.yml | 22 ------ packages/ui/.github/workflows/main.yml | 14 ---- yarn.lock | 8 +-- 17 files changed, 134 insertions(+), 188 deletions(-) create mode 100644 .github/workflows/bundle-sizes.yml delete mode 100644 packages/app/.circleci/config.yml delete mode 100644 packages/connect/.circleci/config.yml delete mode 100644 packages/connect/.github/workflows/main.yml delete mode 100644 packages/ui/.circleci/config.yml delete mode 100644 packages/ui/.github/workflows/main.yml diff --git a/.github/workflows/bundle-sizes.yml b/.github/workflows/bundle-sizes.yml new file mode 100644 index 0000000..35709dd --- /dev/null +++ b/.github/workflows/bundle-sizes.yml @@ -0,0 +1,35 @@ +name: Compressed Size + +on: [pull_request] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set Node Version + uses: actions/setup-node@v1 + with: + node-version: 12.16.1 + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + - uses: actions/cache@v1 + id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + - name: Monorepo Dependencies + run: yarn + - name: Lerna Bootstrap + run: yarn lerna bootstrap + - uses: preactjs/compressed-size-action@v1 + with: + repo-token: "${{ secrets.GITHUB_TOKEN }}" + build-script: "lerna run build --stream --scope @blockstack/connect" + pattern: '**/connect/dist/**/*.js' + diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d37ce07..9000362 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -56,7 +56,7 @@ jobs: - name: Lint run: yarn lint - name: Typecheck - run: yarn lerna run typecheck --parallel + run: yarn typecheck publish: needs: [test_keychain, codecheck] diff --git a/package.json b/package.json index 1d70a39..31626cc 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "typescript": "^3.8.2" }, "scripts": { - "typecheck": "lerna run typecheck", + "typecheck": "lerna run typecheck --parallel", "dev": "yarn lerna exec --parallel 'yarn dev' --scope test-app --scope @blockstack/app", "bootstrap": "yarn lerna exec --parallel 'yarn'", "build:libs": "yarn build:ui && yarn build:keychain && yarn build:connect", diff --git a/packages/app/.circleci/config.yml b/packages/app/.circleci/config.yml deleted file mode 100644 index 5a412da..0000000 --- a/packages/app/.circleci/config.yml +++ /dev/null @@ -1,68 +0,0 @@ -version: 2 -jobs: - build: - working_directory: ~/blockstack-app - docker: - - image: circleci/node:10.16.3-browsers - steps: - - checkout - - restore_cache: - # https://circleci.com/docs/2.0/caching/ - key: yarn-packages-{{ checksum "package.json" }} - - run: - name: Install Dependencies - command: yarn install --frozen-lockfile - - save_cache: - key: yarn-packages-{{ checksum "package.json" }} - paths: - - ./.cache/yarn - # TODO - get this cached so that you don't have to pull down the binaries each time - - run: - name: Update apt-get - working_directory: / - command: | - sudo apt-get update -y - - run: - name: Install Chrome headless dependencies - working_directory: / - command: | - sudo apt-get install -yq gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 \ - libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 \ - libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 \ - libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 \ - ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget - - run: - name: Lint Prettier - command: yarn lint:prettier - - run: - name: Lint ESLint - command: yarn lint:eslint - - run: - name: typecheck - command: yarn typecheck - - run: - name: test server - command: yarn dev - background: true - - run: - name: Create .env file - working_directory: ./tests/test-app/ - command: echo "SKIP_PREFLIGHT_CHECK=true" >> .env - - run: - name: Install test deps - working_directory: ./tests/test-app/ - command: yarn - - run: - name: Run test app - working_directory: ./tests/test-app/ - command: yarn start - background: true - - run: - name: test - command: yarn test - - run: - name: Build extension - command: yarn prod:ext && zip -r extension.zip dist - # https://circleci.com/docs/2.0/artifacts/ - - store_artifacts: - path: extension.zip diff --git a/packages/app/package.json b/packages/app/package.json index 8b0a518..26080c3 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -26,7 +26,7 @@ "@blockstack/connect": "^2.1.0", "@blockstack/keychain": "^0.3.1", "@blockstack/prettier-config": "^0.0.5", - "@blockstack/stats": "^0.5.4", + "@blockstack/stats": "^0.7.0", "@blockstack/ui": "^1.0.1", "@rehooks/document-title": "^1.0.1", "@types/react-router-dom": "^5.1.3", diff --git a/packages/app/src/common/hooks/use-wallet.ts b/packages/app/src/common/hooks/use-wallet.ts index 4b9c69b..2a2d2f3 100644 --- a/packages/app/src/common/hooks/use-wallet.ts +++ b/packages/app/src/common/hooks/use-wallet.ts @@ -7,14 +7,30 @@ import { selectIsSignedIn, } from '@store/wallet/selectors'; import { selectSecretKey } from '@store/onboarding/selectors'; +import { decrypt } from '@blockstack/keychain'; +import { DEFAULT_PASSWORD } from '@store/onboarding/types'; +import { useState, useEffect } from 'react'; export const useWallet = () => { const identities = useSelector(selectIdentities); const firstIdentity = useSelector(selectFirstIdentity); const wallet = useSelector(selectCurrentWallet); - const secretKey = useSelector(selectSecretKey); + const onboardingSecretKey = useSelector(selectSecretKey); const isRestoringWallet = useSelector(selectIsRestoringWallet); const isSignedIn = useSelector(selectIsSignedIn); + const [secretKey, setSecretKey] = useState(onboardingSecretKey); + + const fetchSecretKey = async () => { + if (!secretKey && wallet) { + const decryptedKey = await decrypt(wallet?.encryptedBackupPhrase, DEFAULT_PASSWORD); + setSecretKey(decryptedKey); + } + }; + + useEffect(() => { + // eslint-disable-next-line @typescript-eslint/no-floating-promises + fetchSecretKey(); + }, [onboardingSecretKey]); return { identities, firstIdentity, wallet, secretKey, isRestoringWallet, isSignedIn }; }; diff --git a/packages/app/src/common/track.ts b/packages/app/src/common/track.ts index 7c1fce6..f3492be 100644 --- a/packages/app/src/common/track.ts +++ b/packages/app/src/common/track.ts @@ -33,6 +33,8 @@ export const pageTrackingNameMap = { [ScreenPaths.RECOVERY_CODE]: 'Magic Recovery Code', [ScreenPaths.ADD_ACCOUNT]: ' Select Username', [ScreenPaths.REGISTRY_ERROR]: 'Username Registry Error', + [ScreenPaths.SETTINGS_KEY]: 'Settings: Secret Key', + [ScreenPaths.HOME]: 'App Home', }; export const titleNameMap = { @@ -45,28 +47,37 @@ export const titleNameMap = { [ScreenPaths.RECOVERY_CODE]: 'Enter your password', [ScreenPaths.ADD_ACCOUNT]: ' Select Username', [ScreenPaths.REGISTRY_ERROR]: 'Failed to register username', + [ScreenPaths.SETTINGS_KEY]: 'View your Secret Key', + [ScreenPaths.HOME]: 'Secret Key', }; export const doTrackScreenChange = (screen: ScreenPaths, decodedAuthRequest: DecodedAuthRequest | undefined) => { document.title = titleNameMap[screen]; const appURL = decodedAuthRequest ? new URL(decodedAuthRequest?.redirect_uri) : null; - page({ - name: pageTrackingNameMap[screen], - appName: decodedAuthRequest?.appDetails?.name, - appDomain: appURL?.host, - }); + // eslint-disable-next-line @typescript-eslint/no-misused-promises + setTimeout(async () => { + await page({ + name: pageTrackingNameMap[screen], + appName: decodedAuthRequest?.appDetails?.name, + appDomain: appURL?.host, + }); + }, 1); }; export const doTrack = (type: string, payload?: object) => { console.log('Tracking:', { type, payload }); - event({ - name: type, - ...payload, - }); + // eslint-disable-next-line @typescript-eslint/no-misused-promises + setTimeout(async () => { + await event({ + name: type, + ...payload, + }); + }, 1); }; export const setStatsConfig = () => { setConfig({ + useHash: true, host: STATS_URL, providers: [ { diff --git a/packages/app/src/components/routes.tsx b/packages/app/src/components/routes.tsx index 27b64b4..7a0e9ce 100644 --- a/packages/app/src/components/routes.tsx +++ b/packages/app/src/components/routes.tsx @@ -17,7 +17,6 @@ import { authenticationInit } from '@common/utils'; import { useAnalytics } from '@common/hooks/use-analytics'; import { useWallet } from '@common/hooks/use-wallet'; import { useOnboardingState } from '@common/hooks/use-onboarding-state'; - import { Routes as RoutesDom, Route, Navigate } from 'react-router-dom'; export const Routes: React.FC = () => { @@ -102,8 +101,9 @@ export const Routes: React.FC = () => { /> } /> - ;{/*Error/Misc*/} + {/*Error/Misc*/} } /> + doChangeScreen(ScreenPaths.HOME)} />} /> ); }; diff --git a/packages/app/src/pages/connect/choose-account.tsx b/packages/app/src/pages/connect/choose-account.tsx index 42fe364..1ecdfe0 100644 --- a/packages/app/src/pages/connect/choose-account.tsx +++ b/packages/app/src/pages/connect/choose-account.tsx @@ -1,33 +1,43 @@ import React from 'react'; -import { Screen, ScreenBody, Title, PoweredBy, ScreenFooter } from '@blockstack/connect'; -import { Box } from '@blockstack/ui'; +import { PoweredBy, Screen, ScreenBody, ScreenFooter, Title } from '@blockstack/connect'; +import { Box, PseudoBox, Text } from '@blockstack/ui'; import { ScreenHeader } from '@components/connected-screen-header'; import { Accounts } from '@components/accounts'; import { AppIcon } from '@components/app-icon'; import { useSelector } from 'react-redux'; -import { AppState } from '@store'; -import { selectAppName } from '@store/onboarding/selectors'; +import { AppState, store } from '@store'; +import { selectAppName, selectDecodedAuthRequest } from '@store/onboarding/selectors'; import { Drawer } from '@components/drawer'; -import { selectDecodedAuthRequest } from '@store/onboarding/selectors'; -import { store } from '@store'; -import { selectIdentities, selectCurrentWallet } from '@store/wallet/selectors'; +import { selectCurrentWallet, selectIdentities } from '@store/wallet/selectors'; import { ConfigApp } from '@blockstack/keychain/wallet'; import { Wallet } from '@blockstack/keychain'; import { gaiaUrl } from '@common/constants'; import { + CHOOSE_ACCOUNT_CHOSEN, CHOOSE_ACCOUNT_REUSE_WARNING, + CHOOSE_ACCOUNT_REUSE_WARNING_BACK, CHOOSE_ACCOUNT_REUSE_WARNING_CONTINUE, CHOOSE_ACCOUNT_REUSE_WARNING_DISABLED, - CHOOSE_ACCOUNT_REUSE_WARNING_BACK, - CHOOSE_ACCOUNT_CHOSEN, } from '@common/track'; import { useAnalytics } from '@common/hooks/use-analytics'; +import { ScreenPaths } from '@store/onboarding/types'; interface ChooseAccountProps { next: (identityIndex: number) => void; back?: () => void; } +const SettingsButton = () => { + const { doChangeScreen } = useAnalytics(); + return ( + doChangeScreen(ScreenPaths.HOME)}> + + Settings + + + ); +}; + export const ChooseAccount: React.FC = ({ next }) => { const { appName, identities, wallet } = useSelector((state: AppState) => ({ appName: selectAppName(state), @@ -100,7 +110,7 @@ export const ChooseAccount: React.FC = ({ next }) => { }} /> - + } /> ( ); +const SecretKeyButton = () => { + const { doChangeScreen } = useAnalytics(); + return ( + doChangeScreen(ScreenPaths.SETTINGS_KEY)}> + + View Secret Key + + + ); +}; + export const Home = () => { const dispatch = useDispatch(); const { identities } = useWallet(); @@ -36,7 +48,10 @@ export const Home = () => { return ( - + + + + {isSignedIn ? ( void; hideIcon?: boolean; hideLogo?: boolean; @@ -34,6 +35,7 @@ export const ScreenHeader = ({ title = 'Secret Key', hideIcon = false, hideLogo = false, + rightContent, ...rest }: ScreenHeaderProps) => { const { name, icon } = useAppDetails(); @@ -59,14 +61,17 @@ export const ScreenHeader = ({ justify="space-between" {...rest} > - - {!hideIcon ? : null} - {!hideIcon ? ( - - - - ) : null} - + + + {!hideIcon ? : null} + {!hideIcon ? ( + + + + ) : null} + + + {rightContent ? rightContent : null} ); diff --git a/packages/ui/.circleci/config.yml b/packages/ui/.circleci/config.yml deleted file mode 100644 index 83421bc..0000000 --- a/packages/ui/.circleci/config.yml +++ /dev/null @@ -1,22 +0,0 @@ -version: 2.1 -jobs: - build: - docker: - - image: circleci/node:10.16.3 - steps: - - checkout - - restore_cache: - name: Restore Yarn Package Cache - keys: - - yarn-packages-{{ checksum "yarn.lock" }} - - run: - name: Install Dependencies - command: yarn install --frozen-lockfile - - save_cache: - name: Save Yarn Package Cache - key: yarn-packages-{{ checksum "yarn.lock" }} - paths: - - ~/.cache/yarn - - run: - name: Formatted with Prettier - command: yarn lint:formatting diff --git a/packages/ui/.github/workflows/main.yml b/packages/ui/.github/workflows/main.yml deleted file mode 100644 index d346ef8..0000000 --- a/packages/ui/.github/workflows/main.yml +++ /dev/null @@ -1,14 +0,0 @@ -name: Compressed Size - -on: [pull_request] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - uses: preactjs/compressed-size-action@v1 - with: - repo-token: "${{ secrets.GITHUB_TOKEN }}" diff --git a/yarn.lock b/yarn.lock index c5f3f4f..8566d3b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1230,10 +1230,10 @@ resolved "https://registry.yarnpkg.com/@blockstack/prettier-config/-/prettier-config-0.0.5.tgz#871bd2a38b5bc9aabb1cefeeba6199cc64098957" integrity sha512-A+wfdVwD1Sxd/D3PPJI67Evo7q2fp15hCOFLB5jmzcS1MdN8BQdFm6j51Sti8xLN4qHmuYkicbFBUluGx2h63g== -"@blockstack/stats@^0.5.4": - version "0.5.4" - resolved "https://registry.yarnpkg.com/@blockstack/stats/-/stats-0.5.4.tgz#092ee64de324412688d227073f768907083cb6c4" - integrity sha512-tUHfEeXYF5QwVp3xZOPQzfH0Lr5GBc2tr/6M3/CH6GU/cHLRJ63cwiLpUj/3cnb+sYE+OYS00MtOfMsMUtVzug== +"@blockstack/stats@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@blockstack/stats/-/stats-0.7.0.tgz#be39d3e76c2a16c1cd1283aa702d1e20b5e04645" + integrity sha512-AS/UdJH/cJ7K8la3/TbQziEMlRrNI/4VEHSfYUsEzU7Nx892G6qE4uu/XvW9ycS0Jg2/TW2bjTnRijsyecaEJA== "@cnakazawa/watch@^1.0.3": version "1.0.4"