on master help sign in
keys: Activate flow uses same keygen as Home view
1951323tomholford
src/lib/useKeyfileGenerator.js → src/lib/useKeyfileGenerator.tsrenamed+31−13
@@ -18,20 +18,35 @@ import {
18} from './keys';
18} from './keys';
19import useCurrentPermissions from './useCurrentPermissions';
19import useCurrentPermissions from './useCurrentPermissions';
20import { convertToInt } from './convertToInt';
20import { convertToInt } from './convertToInt';
21+import { stripSigPrefix } from 'form/formatters';
22+
23+// overrideable defaults:
24+// seed - derived from wallet, mnemonic, or token (if posisble)
25+// point - the current pointCursor
26+interface useKeyfileGeneratorArgs {
27+ seed?: string;
28+ point?: number;
29+}
21
30
22−export default function useKeyfileGenerator(manualNetworkSeed) {
31+export default function useKeyfileGenerator({
32+ seed,
33+ point,
34+}: useKeyfileGeneratorArgs) {
23− const { urbitWallet, wallet, authMnemonic, authToken } = useWallet();
35+ const { urbitWallet, wallet, authMnemonic, authToken }: any = useWallet();
24− const { pointCursor } = usePointCursor();
36+ const { pointCursor }: any = usePointCursor();
25− const { getDetails } = usePointCache();
37+ const { syncDetails, getDetails }: any = usePointCache();
26
38
27 const [notice, setNotice] = useState('Deriving networking keys...');
39 const [notice, setNotice] = useState('Deriving networking keys...');
28 const [downloaded, setDownloaded] = useState(false);
40 const [downloaded, setDownloaded] = useState(false);
29 const [generating, setGenerating] = useState(true);
41 const [generating, setGenerating] = useState(true);
30− const [keyfile, setKeyfile] = useState(false);
42+ const [keyfile, setKeyfile] = useState<boolean | string>(false);
31−
32 const [code, setCode] = useState(false);
43 const [code, setCode] = useState(false);
33
44
34− const _point = need.point(pointCursor);
45+ const _point = point || need.point(pointCursor);
46+ useEffect(() => {
47+ syncDetails(_point);
48+ }, [_point, syncDetails]);
49+
35 const details = getDetails(_point);
50 const details = getDetails(_point);
36
51
37 const networkRevision = details.matchWith({
52 const networkRevision = details.matchWith({
@@ -56,8 +71,8 @@ export default function useKeyfileGenerator(manualNetworkSeed) {
56
71
57 const _details = need.details(details);
72 const _details = need.details(details);
58
73
59− const networkSeed = manualNetworkSeed
74+ const networkSeed = seed
60− ? Just(manualNetworkSeed)
75+ ? Just(seed)
61 : await attemptNetworkSeedDerivation({
76 : await attemptNetworkSeedDerivation({
62 urbitWallet,
77 urbitWallet,
63 wallet,
78 wallet,
@@ -88,14 +103,14 @@ export default function useKeyfileGenerator(manualNetworkSeed) {
88 return;
103 return;
89 }
104 }
90
105
91− setNotice();
106+ setNotice('');
92 setCode(generateCode(pair));
107 setCode(generateCode(pair));
93 setKeyfile(compileNetworkKey(pair, _point, networkRevision));
108 setKeyfile(compileNetworkKey(pair, _point, networkRevision));
94 setGenerating(false);
109 setGenerating(false);
95 }, [
110 }, [
96 networkRevision,
111 networkRevision,
97 hasNetworkKeys,
112 hasNetworkKeys,
98− manualNetworkSeed,
113+ seed,
99 urbitWallet,
114 urbitWallet,
100 wallet,
115 wallet,
101 authMnemonic,
116 authMnemonic,
@@ -106,11 +121,14 @@ export default function useKeyfileGenerator(manualNetworkSeed) {
106 ]);
121 ]);
107
122
108 const filename = useMemo(() => {
123 const filename = useMemo(() => {
109− return `${ob.patp(_point).slice(1)}-${networkRevision}.key`;
124+ return `${stripSigPrefix(ob.patp(_point))}-${networkRevision}.key`;
110− // TODO: ^ unifiy "remove tilde" calls
111 }, [_point, networkRevision]);
125 }, [_point, networkRevision]);
112
126
113 const download = useCallback(() => {
127 const download = useCallback(() => {
128+ if (typeof keyfile !== 'string') {
129+ return;
130+ }
131+
114 saveAs(
132 saveAs(
115 new Blob([keyfile], {
133 new Blob([keyfile], {
116 type: 'text/plain;charset=utf-8',
134 type: 'text/plain;charset=utf-8',
src/views/Activate/MasterKeyDownload.tsx+2−8
@@ -14,12 +14,11 @@ import { FadeableMasterKeyPresenter as MasterKeyPresenter } from './MasterKeyPre
14import { useActivateFlow } from './ActivateFlow';
14import { useActivateFlow } from './ActivateFlow';
15import ActivateView from './ActivateView';
15import ActivateView from './ActivateView';
16import { useLocalRouter } from 'lib/LocalRouter';
16import { useLocalRouter } from 'lib/LocalRouter';
17−import { compileNetworkKey } from 'lib/keys';
18−import { downloadWallet } from 'lib/invite';
19import PaperBuilder from 'components/PaperBuilder';
17import PaperBuilder from 'components/PaperBuilder';
20import { DEFAULT_FADE_TIMEOUT, MASTER_KEY_DURATION } from 'lib/constants';
18import { DEFAULT_FADE_TIMEOUT, MASTER_KEY_DURATION } from 'lib/constants';
21import { timeout } from 'lib/timeout';
19import { timeout } from 'lib/timeout';
22import View from 'components/View';
20import View from 'components/View';
21+import useKeyfileGenerator from 'lib/useKeyfileGenerator';
23
22
24const MasterKeyDownload = () => {
23const MasterKeyDownload = () => {
25 const {
24 const {
@@ -46,12 +45,7 @@ const MasterKeyDownload = () => {
46 Just: p => p.value.toFixed(),
45 Just: p => p.value.toFixed(),
47 });
46 });
48
47
49− const download = useCallback(async () => {
50− const netkey = compileNetworkKey(wallet.network.keys, point, 1);
51− //TODO could be deduplicated with useKeyfileGenerator's logic
48+ const { download } = useKeyfileGenerator({ point });
52− const filename = ob.patp(point).slice(1) + '-1.key';
53− await downloadWallet(paper.getOrElse([]), netkey, filename);
54− }, [paper, wallet, point]);
55
49
56 // sync paper value to activation state
50 // sync paper value to activation state
57 useEffect(
51 useEffect(
src/views/UrbitID/DownloadKeys.js+1−1
@@ -26,7 +26,7 @@ export default function AdminRedownload() {
26 const _urbitWallet = need.wallet(urbitWallet);
26 const _urbitWallet = need.wallet(urbitWallet);
27 const point = need.point(pointCursor);
27 const point = need.point(pointCursor);
28
28
29− const { keyfile, filename } = useKeyfileGenerator();
29+ const { keyfile, filename } = useKeyfileGenerator({});
30
30
31 const [paper, setPaper] = useState(Nothing());
31 const [paper, setPaper] = useState(Nothing());
32 const [downloaded, setDownloaded] = useState(false);
32 const [downloaded, setDownloaded] = useState(false);
src/views/UrbitID/Home.tsx+1−1
@@ -43,7 +43,7 @@ export default function UrbitIDHome() {
43 return null;
43 return null;
44 }
44 }
45 }, [urbitWallet]);
45 }, [urbitWallet]);
46− const { keyfile, filename } = useKeyfileGenerator();
46+ const { keyfile, filename } = useKeyfileGenerator({});
47 const [paper, setPaper] = useState(Nothing());
47 const [paper, setPaper] = useState(Nothing());
48
48
49 const downloadKeys = useCallback(() => {
49 const downloadKeys = useCallback(() => {
src/views/UrbitOS/Home.tsx+1−1
@@ -42,7 +42,7 @@ export default function UrbitOSHome() {
42 names,
42 names,
43 ]);
43 ]);
44
44
45− const { bind: keyBind, code } = useKeyfileGenerator();
45+ const { bind: keyBind, code } = useKeyfileGenerator({});
46
46
47 return (
47 return (
48 <Window className="os-home">
48 <Window className="os-home">
src/views/UrbitOS/NetworkKeys.tsx+1−1
@@ -72,7 +72,7 @@ function useSetKeys(
72 generating: keyfileGenerating,
72 generating: keyfileGenerating,
73 filename,
73 filename,
74 bind: keyfileBind,
74 bind: keyfileBind,
75− } = useKeyfileGenerator(manualNetworkSeed);
75+ } = useKeyfileGenerator({ seed: manualNetworkSeed });
76
76
77 const buildNetworkSeed = useCallback(
77 const buildNetworkSeed = useCallback(
78 async manualSeed => {
78 async manualSeed => {