@ibgib/web-gib 0.0.59 → 0.0.61
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AUTO-GENERATED-version.d.mts +1 -1
- package/dist/AUTO-GENERATED-version.mjs +1 -1
- package/dist/helpers.d.mts.map +1 -1
- package/dist/helpers.mjs +1 -0
- package/dist/helpers.mjs.map +1 -1
- package/dist/identity/device-delegate-helper.d.mts +43 -0
- package/dist/identity/device-delegate-helper.d.mts.map +1 -0
- package/dist/identity/device-delegate-helper.mjs +106 -0
- package/dist/identity/device-delegate-helper.mjs.map +1 -0
- package/dist/identity/device-delegate.respec.d.mts +2 -0
- package/dist/identity/device-delegate.respec.d.mts.map +1 -0
- package/dist/identity/device-delegate.respec.mjs +106 -0
- package/dist/identity/device-delegate.respec.mjs.map +1 -0
- package/dist/identity/identity-constants.mjs +2 -2
- package/dist/identity/identity-constants.mjs.map +1 -1
- package/dist/identity/identity-types.d.mts +4 -4
- package/dist/identity/identity-types.d.mts.map +1 -1
- package/dist/identity/keystone-sync-service.d.mts +18 -0
- package/dist/identity/keystone-sync-service.d.mts.map +1 -1
- package/dist/identity/keystone-sync-service.mjs +77 -1
- package/dist/identity/keystone-sync-service.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -2
- package/dist/index.mjs.map +1 -1
- package/dist/storage/storage-helpers.web.d.mts +9 -0
- package/dist/storage/storage-helpers.web.d.mts.map +1 -1
- package/dist/storage/storage-helpers.web.mjs +42 -0
- package/dist/storage/storage-helpers.web.mjs.map +1 -1
- package/dist/ui/component/identity/add-device/add-device.css +93 -17
- package/dist/ui/component/identity/add-device/add-device.d.mts +24 -7
- package/dist/ui/component/identity/add-device/add-device.d.mts.map +1 -1
- package/dist/ui/component/identity/add-device/add-device.html +97 -23
- package/dist/ui/component/identity/add-device/add-device.mjs +489 -198
- package/dist/ui/component/identity/add-device/add-device.mjs.map +1 -1
- package/dist/ui/component/identity/keystone-creator/keystone-creator.d.mts.map +1 -1
- package/dist/ui/component/identity/keystone-creator/keystone-creator.mjs +48 -61
- package/dist/ui/component/identity/keystone-creator/keystone-creator.mjs.map +1 -1
- package/dist/ui/component/identity/keystone-details/keystone-details.css +1 -1
- package/dist/ui/component/identity/keystone-details/keystone-details.d.mts +11 -8
- package/dist/ui/component/identity/keystone-details/keystone-details.d.mts.map +1 -1
- package/dist/ui/component/identity/keystone-details/keystone-details.html +29 -20
- package/dist/ui/component/identity/keystone-details/keystone-details.mjs +358 -97
- package/dist/ui/component/identity/keystone-details/keystone-details.mjs.map +1 -1
- package/dist/ui/component/identity/remove-device/remove-device.d.mts +1 -1
- package/dist/ui/component/identity/remove-device/remove-device.d.mts.map +1 -1
- package/dist/ui/component/identity/remove-device/remove-device.html +3 -3
- package/dist/ui/component/identity/remove-device/remove-device.mjs +7 -7
- package/dist/ui/component/identity/remove-device/remove-device.mjs.map +1 -1
- package/dist/ui/ui-constants.d.mts +1 -0
- package/dist/ui/ui-constants.d.mts.map +1 -1
- package/dist/ui/ui-constants.mjs +1 -0
- package/dist/ui/ui-constants.mjs.map +1 -1
- package/dist/ui/ui-types.d.mts +5 -0
- package/dist/ui/ui-types.d.mts.map +1 -1
- package/dist/util/device-helper.d.mts +30 -0
- package/dist/util/device-helper.d.mts.map +1 -0
- package/dist/util/device-helper.mjs +90 -0
- package/dist/util/device-helper.mjs.map +1 -0
- package/dist/util/device-helper.respec.d.mts +2 -0
- package/dist/util/device-helper.respec.d.mts.map +1 -0
- package/dist/util/device-helper.respec.mjs +83 -0
- package/dist/util/device-helper.respec.mjs.map +1 -0
- package/package.json +3 -3
- package/src/AUTO-GENERATED-version.mts +1 -1
- package/src/helpers.mts +1 -0
- package/src/identity/custodian-delegate-helper.mts.bak +7 -0
- package/src/identity/device-delegate-helper.mts +135 -0
- package/src/identity/device-delegate.respec.mts +125 -0
- package/src/identity/identity-constants.mts +2 -2
- package/src/identity/identity-types.mts +4 -4
- package/src/identity/keystone-sync-service.mts +95 -2
- package/src/index.mts +1 -2
- package/src/storage/storage-helpers.web.mts +47 -0
- package/src/ui/component/identity/add-device/add-device.css +93 -17
- package/src/ui/component/identity/add-device/add-device.html +97 -23
- package/src/ui/component/identity/add-device/add-device.mts +579 -208
- package/src/ui/component/identity/keystone-creator/keystone-creator.mts +55 -69
- package/src/ui/component/identity/keystone-details/keystone-details.css +1 -1
- package/src/ui/component/identity/keystone-details/keystone-details.html +29 -20
- package/src/ui/component/identity/keystone-details/keystone-details.mts +374 -106
- package/src/ui/component/identity/remove-device/remove-device.html +3 -3
- package/src/ui/component/identity/remove-device/remove-device.mts +8 -8
- package/src/ui/ui-constants.mts +1 -0
- package/src/ui/ui-types.mts +6 -0
- package/src/util/device-helper.mts +104 -0
- package/src/util/device-helper.respec.mts +90 -0
- package/dist/identity/custodian-delegate-helper.d.mts +0 -22
- package/dist/identity/custodian-delegate-helper.d.mts.map +0 -1
- package/dist/identity/custodian-delegate-helper.mjs +0 -50
- package/dist/identity/custodian-delegate-helper.mjs.map +0 -1
- package/src/identity/custodian-delegate-helper.mts +0 -61
|
@@ -10,11 +10,11 @@ import { getGibInfo } from "@ibgib/ts-gib/dist/V1/transforms/transform-helper.mj
|
|
|
10
10
|
import { KeystoneService_V1 } from "@ibgib/core-gib/dist/keystone/keystone-service-v1.mjs";
|
|
11
11
|
import { KeystoneProfileBuilder } from "@ibgib/core-gib/dist/keystone/policy/keystone-profile-builder.mjs";
|
|
12
12
|
import { updateSpecialIndex, } from "@ibgib/core-gib/dist/timeline/timeline-api.mjs";
|
|
13
|
-
import { toDto, getTjpAddr } from "@ibgib/core-gib/dist/common/other/ibgib-helper.mjs";
|
|
13
|
+
import { toDto, getTjpAddr, getTimelinesGroupedByTjp } from "@ibgib/core-gib/dist/common/other/ibgib-helper.mjs";
|
|
14
14
|
import { FlatIbGibGraph } from "@ibgib/core-gib/dist/common/other/graph-types.mjs";
|
|
15
15
|
import { validateEmail } from "@ibgib/core-gib/dist/keystone/keystone-helpers.mjs";
|
|
16
16
|
import { KEYSTONE_USERNAME_REGEXP, KEYSTONE_DESCRIPTION_REGEXP, KEYSTONE_VERB_SYNC, KEYSTONE_VERB_CONNECT } from "@ibgib/core-gib/dist/keystone/keystone-constants.mjs";
|
|
17
|
-
import { deriveDelegateSecret } from "@ibgib/core-gib/dist/keystone/
|
|
17
|
+
import { deriveDelegateSecret, createSyncDelegateKeystone } from "@ibgib/core-gib/dist/keystone/delegate/delegate-helpers.mjs";
|
|
18
18
|
|
|
19
19
|
import { getGlobalMetaspace_waitIfNeeded, } from "../../../../helpers.mjs";
|
|
20
20
|
import { IbGibDynamicComponentMetaBase, IbGibFormInstanceBase, } from "../../ibgib-dynamic-component-bases.mjs";
|
|
@@ -24,8 +24,9 @@ import {
|
|
|
24
24
|
} from "../../component-types.mjs";
|
|
25
25
|
import { getComponentCtorArg } from "../../../../app-bootstrap/init-orchestration.mjs";
|
|
26
26
|
import { getApiBridge } from "../../../../api/ibgib-api-bridge.mjs";
|
|
27
|
-
import {
|
|
27
|
+
import { getOrCreateDeviceDelegateSecret, setDeviceDelegateSecret } from "../../../../identity/device-delegate-helper.mjs";
|
|
28
28
|
import { executeSsoOAuthPopup } from "../../../../identity/sso-popup-helper.mjs";
|
|
29
|
+
import { generateDefaultDeviceTag } from "../../../../util/device-helper.mjs";
|
|
29
30
|
import { EVENT_IBGIB_IDENTITY_REQUEST_CHANGE, EVENT_IBGIB_UI_MESSAGE } from "../../../ui-constants.mjs";
|
|
30
31
|
import { alertUser, shadowRoot_getElementById } from "../../../../helpers.web.mjs";
|
|
31
32
|
|
|
@@ -307,25 +308,6 @@ export class KeystoneCreatorComponentInstance
|
|
|
307
308
|
animationEmoji: '🔑'
|
|
308
309
|
});
|
|
309
310
|
|
|
310
|
-
const delegateSecret = await deriveLocalCustodianDelegateSecret({ primaryTjpAddr });
|
|
311
|
-
const email = resLogin.userInfo?.email || '';
|
|
312
|
-
const username = email ? email.split('@')[0] : 'user';
|
|
313
|
-
const custodianSyncProfileName = process.env.KEYSTONE_PROFILE_CUSTODIAN_SYNC;
|
|
314
|
-
if (!custodianSyncProfileName || !custodianSyncProfileName.trim()) {
|
|
315
|
-
throw new Error('KEYSTONE_PROFILE_CUSTODIAN_SYNC environment variable is missing. Expected valid profile name like "sync-profile.dev" or "sync-profile.prod". (E: 4d5e6f7890123456789abcdef4)');
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
const delegateBuilder = KeystoneProfileBuilder.buildKeystone(custodianSyncProfileName.trim() as any)
|
|
319
|
-
.withUsername(`${username}-sync`)
|
|
320
|
-
.withDescription(`Sync Delegate for ${username}`)
|
|
321
|
-
.withDetails({
|
|
322
|
-
client: 'space-gib-web',
|
|
323
|
-
role: 'sync-delegate',
|
|
324
|
-
primaryTjpAddr,
|
|
325
|
-
custodianReqs,
|
|
326
|
-
});
|
|
327
|
-
|
|
328
|
-
const configs = await delegateBuilder.compileConfigs();
|
|
329
311
|
const metaspace = await getGlobalMetaspace_waitIfNeeded();
|
|
330
312
|
const space = await metaspace.getLocalUserSpace({ lock: false });
|
|
331
313
|
if (!space) {
|
|
@@ -333,14 +315,24 @@ export class KeystoneCreatorComponentInstance
|
|
|
333
315
|
return;
|
|
334
316
|
}
|
|
335
317
|
|
|
336
|
-
const
|
|
337
|
-
const
|
|
338
|
-
|
|
339
|
-
|
|
318
|
+
const delegateSecret = await getOrCreateDeviceDelegateSecret({ primaryTjpAddr });
|
|
319
|
+
const email = resLogin.userInfo?.email || '';
|
|
320
|
+
const username = email ? email.split('@')[0] : 'user';
|
|
321
|
+
const custodianSyncProfileName = process.env.KEYSTONE_PROFILE_CUSTODIAN_SYNC;
|
|
322
|
+
if (!custodianSyncProfileName || !custodianSyncProfileName.trim()) {
|
|
323
|
+
throw new Error('KEYSTONE_PROFILE_CUSTODIAN_SYNC environment variable is missing. Expected valid profile name like "sync-profile.dev" or "sync-profile.prod". (E: 4d5e6f7890123456789abcdef4)');
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
const delegateKeystone = await createSyncDelegateKeystone({
|
|
327
|
+
profileName: custodianSyncProfileName.trim() as any,
|
|
328
|
+
username,
|
|
329
|
+
deviceTag: generateDefaultDeviceTag(),
|
|
330
|
+
primaryTjpAddr,
|
|
331
|
+
delegateSecret,
|
|
332
|
+
custodianReqs,
|
|
333
|
+
additionalFrameDetails: { client: 'space-gib-web' },
|
|
340
334
|
metaspace,
|
|
341
335
|
space,
|
|
342
|
-
frameDetails: delegateBuilder.getFrameDetails(),
|
|
343
|
-
isPrimary: false
|
|
344
336
|
});
|
|
345
337
|
|
|
346
338
|
this.setStatus('Registering device delegate with custodian server...', 'info');
|
|
@@ -467,24 +459,6 @@ export class KeystoneCreatorComponentInstance
|
|
|
467
459
|
animationEmoji: '🔑'
|
|
468
460
|
});
|
|
469
461
|
|
|
470
|
-
const delegateSecret = await deriveLocalCustodianDelegateSecret({ primaryTjpAddr });
|
|
471
|
-
const username = email ? email.split('@')[0] : 'user';
|
|
472
|
-
const custodianSyncProfileName = process.env.KEYSTONE_PROFILE_CUSTODIAN_SYNC;
|
|
473
|
-
if (!custodianSyncProfileName || !custodianSyncProfileName.trim()) {
|
|
474
|
-
throw new Error('KEYSTONE_PROFILE_CUSTODIAN_SYNC environment variable is missing. Expected valid profile name like "sync-profile.dev" or "sync-profile.prod". (E: 4d5e6f7890123456789abcdef4)');
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
const delegateBuilder = KeystoneProfileBuilder.buildKeystone(custodianSyncProfileName.trim() as any)
|
|
478
|
-
.withUsername(`${username}-sync`)
|
|
479
|
-
.withDescription(`Sync Delegate for ${username}`)
|
|
480
|
-
.withDetails({
|
|
481
|
-
client: 'space-gib-web',
|
|
482
|
-
role: 'sync-delegate',
|
|
483
|
-
primaryTjpAddr,
|
|
484
|
-
custodianReqs,
|
|
485
|
-
});
|
|
486
|
-
|
|
487
|
-
const configs = await delegateBuilder.compileConfigs();
|
|
488
462
|
const metaspace = await getGlobalMetaspace_waitIfNeeded();
|
|
489
463
|
const space = await metaspace.getLocalUserSpace({ lock: false });
|
|
490
464
|
if (!space) {
|
|
@@ -492,14 +466,23 @@ export class KeystoneCreatorComponentInstance
|
|
|
492
466
|
return;
|
|
493
467
|
}
|
|
494
468
|
|
|
495
|
-
const
|
|
496
|
-
const
|
|
497
|
-
|
|
498
|
-
|
|
469
|
+
const delegateSecret = await getOrCreateDeviceDelegateSecret({ primaryTjpAddr });
|
|
470
|
+
const username = email ? email.split('@')[0] : 'user';
|
|
471
|
+
const custodianSyncProfileName = process.env.KEYSTONE_PROFILE_CUSTODIAN_SYNC;
|
|
472
|
+
if (!custodianSyncProfileName || !custodianSyncProfileName.trim()) {
|
|
473
|
+
throw new Error('KEYSTONE_PROFILE_CUSTODIAN_SYNC environment variable is missing. Expected valid profile name like "sync-profile.dev" or "sync-profile.prod". (E: 4d5e6f7890123456789abcdef4)');
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
const delegateKeystone = await createSyncDelegateKeystone({
|
|
477
|
+
profileName: custodianSyncProfileName.trim() as any,
|
|
478
|
+
username,
|
|
479
|
+
deviceTag: generateDefaultDeviceTag(),
|
|
480
|
+
primaryTjpAddr,
|
|
481
|
+
delegateSecret,
|
|
482
|
+
custodianReqs,
|
|
483
|
+
additionalFrameDetails: { client: 'space-gib-web' },
|
|
499
484
|
metaspace,
|
|
500
485
|
space,
|
|
501
|
-
frameDetails: delegateBuilder.getFrameDetails(),
|
|
502
|
-
isPrimary: false
|
|
503
486
|
});
|
|
504
487
|
|
|
505
488
|
// Register delegate with server
|
|
@@ -684,27 +667,22 @@ export class KeystoneCreatorComponentInstance
|
|
|
684
667
|
});
|
|
685
668
|
|
|
686
669
|
const delegateSecret = await deriveDelegateSecret({ masterSecret });
|
|
670
|
+
await setDeviceDelegateSecret({ primaryTjpAddr, delegateSecret });
|
|
671
|
+
|
|
687
672
|
const sovereignSyncProfileName = process.env.KEYSTONE_PROFILE_SOVEREIGN_SYNC;
|
|
688
673
|
if (!sovereignSyncProfileName || !sovereignSyncProfileName.trim()) {
|
|
689
674
|
throw new Error('KEYSTONE_PROFILE_SOVEREIGN_SYNC environment variable is missing. Expected valid profile name like "sync-profile.dev" or "sync-profile.prod". (E: 5e6f7890123456789abcdef5)');
|
|
690
675
|
}
|
|
691
676
|
|
|
692
|
-
const
|
|
693
|
-
.
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
});
|
|
700
|
-
const delegateConfigs = await delegateBuilder.compileConfigs();
|
|
701
|
-
|
|
702
|
-
const delegateKeystoneIbGib = await keystoneService.genesis({
|
|
703
|
-
masterSecret: delegateSecret,
|
|
704
|
-
configs: delegateConfigs,
|
|
677
|
+
const delegateKeystoneIbGib = await createSyncDelegateKeystone({
|
|
678
|
+
profileName: sovereignSyncProfileName.trim() as any,
|
|
679
|
+
username,
|
|
680
|
+
deviceTag: generateDefaultDeviceTag(),
|
|
681
|
+
primaryTjpAddr,
|
|
682
|
+
delegateSecret,
|
|
683
|
+
additionalFrameDetails: { client: 'space-gib-web' },
|
|
705
684
|
metaspace,
|
|
706
685
|
space,
|
|
707
|
-
frameDetails: delegateBuilder.getFrameDetails()
|
|
708
686
|
});
|
|
709
687
|
|
|
710
688
|
const delegateAddr = getIbGibAddr({ ibGib: delegateKeystoneIbGib });
|
|
@@ -921,9 +899,12 @@ export class KeystoneCreatorComponentInstance
|
|
|
921
899
|
// 0. Persist all frames of primary identity graph into local browser space
|
|
922
900
|
if (primaryGraph) {
|
|
923
901
|
const graphIbGibs = Object.values(primaryGraph) as IbGib_V1[];
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
902
|
+
await metaspace.put({ ibGibs: graphIbGibs, space });
|
|
903
|
+
const timelinesMap = getTimelinesGroupedByTjp({ ibGibs: graphIbGibs });
|
|
904
|
+
for (const tjpKey of Object.keys(timelinesMap)) {
|
|
905
|
+
for (const frame of timelinesMap[tjpKey]) {
|
|
906
|
+
await metaspace.registerNewIbGib({ ibGib: frame, space });
|
|
907
|
+
}
|
|
927
908
|
}
|
|
928
909
|
} else if (primaryKeystone) {
|
|
929
910
|
await metaspace.put({ ibGibs: [primaryKeystone], space });
|
|
@@ -1006,6 +987,11 @@ export class KeystoneCreatorComponentInstance
|
|
|
1006
987
|
this.setStatus(successMsg, "success");
|
|
1007
988
|
console.log(`${lc} ✓ ${successMsg}`);
|
|
1008
989
|
|
|
990
|
+
// 3.5 Sanitize secret input fields from DOM
|
|
991
|
+
if (this.elements?.inputSecret) {
|
|
992
|
+
this.elements.inputSecret.value = '';
|
|
993
|
+
}
|
|
994
|
+
|
|
1009
995
|
// 4. Dispatch UI navigation message to close creator and open identity manager
|
|
1010
996
|
window.dispatchEvent(new CustomEvent(EVENT_IBGIB_UI_MESSAGE, {
|
|
1011
997
|
detail: { action: 'show-identity-manager', addr: primaryTjpAddr },
|
|
@@ -60,7 +60,8 @@
|
|
|
60
60
|
<div id="delegates-card" class="card">
|
|
61
61
|
<h3>Registered Delegates</h3>
|
|
62
62
|
<div id="delegates-container" class="delegates-container">
|
|
63
|
-
<p class="description">Active sub-keystones authorized to perform
|
|
63
|
+
<p class="description">Active sub-keystones authorized to perform operations on behalf of this Domain
|
|
64
|
+
Identity.</p>
|
|
64
65
|
<table class="delegates-table">
|
|
65
66
|
<thead>
|
|
66
67
|
<tr>
|
|
@@ -80,7 +81,8 @@
|
|
|
80
81
|
<!-- SSO Identity Linking Card -->
|
|
81
82
|
<div id="sso-link-card" class="card hidden">
|
|
82
83
|
<h3>Identity Providers</h3>
|
|
83
|
-
<p class="description">Securely link or unlink external OAuth2 providers to delegate sync access to this
|
|
84
|
+
<p class="description">Securely link or unlink external OAuth2 providers to delegate sync access to this
|
|
85
|
+
identity.</p>
|
|
84
86
|
<div class="sso-toggle-group">
|
|
85
87
|
<!-- Google Card Toggle -->
|
|
86
88
|
<div id="btn-link-google" class="sso-toggle-card google" role="button" tabindex="0">
|
|
@@ -88,10 +90,14 @@
|
|
|
88
90
|
<div class="toggle-content">
|
|
89
91
|
<!-- Custom Google SVG Icon -->
|
|
90
92
|
<svg class="sso-icon" viewBox="0 0 24 24">
|
|
91
|
-
<path fill="#4285F4"
|
|
92
|
-
|
|
93
|
-
<path fill="#
|
|
94
|
-
|
|
93
|
+
<path fill="#4285F4"
|
|
94
|
+
d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z" />
|
|
95
|
+
<path fill="#34A853"
|
|
96
|
+
d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z" />
|
|
97
|
+
<path fill="#FBBC05"
|
|
98
|
+
d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.06H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.94l2.85-2.22.81-.63z" />
|
|
99
|
+
<path fill="#EA4335"
|
|
100
|
+
d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.06l3.66 2.84c.87-2.6 3.3-4.52 6.16-4.52z" />
|
|
95
101
|
</svg>
|
|
96
102
|
<span class="provider-label">Google</span>
|
|
97
103
|
<span class="toggle-state-text">Unlinked</span>
|
|
@@ -105,7 +111,8 @@
|
|
|
105
111
|
<div class="toggle-content">
|
|
106
112
|
<!-- Custom GitHub SVG Icon -->
|
|
107
113
|
<svg class="sso-icon" viewBox="0 0 24 24" fill="currentColor">
|
|
108
|
-
<path
|
|
114
|
+
<path
|
|
115
|
+
d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" />
|
|
109
116
|
</svg>
|
|
110
117
|
<span class="provider-label">GitHub</span>
|
|
111
118
|
<span class="toggle-state-text">Unlinked</span>
|
|
@@ -116,28 +123,30 @@
|
|
|
116
123
|
<div id="sso-status-msg" class="status-msg hidden"></div>
|
|
117
124
|
</div>
|
|
118
125
|
|
|
119
|
-
<!-- Change
|
|
120
|
-
<div id="change-
|
|
121
|
-
<h3>Change
|
|
122
|
-
<p class="description">Rotate your local
|
|
126
|
+
<!-- Change Password Card -->
|
|
127
|
+
<div id="change-password-card" class="card">
|
|
128
|
+
<h3>Change Password</h3>
|
|
129
|
+
<p class="description">Rotate your local password that drives this identity. This will cryptographically
|
|
130
|
+
evolve your primary
|
|
131
|
+
identity and all registered user-owned delegate keystones to the new password.</p>
|
|
123
132
|
<div class="form-row">
|
|
124
133
|
<div class="form-group">
|
|
125
|
-
<label for="input-current-
|
|
126
|
-
<input type="password" id="input-current-
|
|
134
|
+
<label for="input-current-password">Current Password</label>
|
|
135
|
+
<input type="password" id="input-current-password" placeholder="••••••••" class="form-input">
|
|
127
136
|
</div>
|
|
128
137
|
<div class="form-group">
|
|
129
|
-
<label for="input-new-
|
|
130
|
-
<input type="password" id="input-new-
|
|
138
|
+
<label for="input-new-password">New Password</label>
|
|
139
|
+
<input type="password" id="input-new-password" placeholder="••••••••" class="form-input">
|
|
131
140
|
</div>
|
|
132
141
|
<div class="form-group">
|
|
133
|
-
<label for="input-confirm-
|
|
134
|
-
<input type="password" id="input-confirm-
|
|
142
|
+
<label for="input-confirm-password">Confirm New Password</label>
|
|
143
|
+
<input type="password" id="input-confirm-password" placeholder="••••••••" class="form-input">
|
|
135
144
|
</div>
|
|
136
145
|
</div>
|
|
137
146
|
<div class="action-row">
|
|
138
|
-
<button id="btn-change-
|
|
147
|
+
<button id="btn-change-password" class="action-btn">Update Password</button>
|
|
139
148
|
</div>
|
|
140
|
-
<div id="change-
|
|
149
|
+
<div id="change-password-status" class="status-msg hidden"></div>
|
|
141
150
|
</div>
|
|
142
151
|
|
|
143
152
|
<!-- Raw Keystone Timeline Explorer -->
|
|
@@ -151,4 +160,4 @@
|
|
|
151
160
|
</div>
|
|
152
161
|
</div>
|
|
153
162
|
</div>
|
|
154
|
-
</div>
|
|
163
|
+
</div>
|