1
- import { AuthorizeResult , createClient } from "signify-polaris-web" ;
1
+ import { AuthorizeResult , createClient , CreateCredentialResult , ExtensionClient } from "signify-polaris-web" ;
2
2
import { FormEvent , useEffect , useState } from "react" ;
3
3
4
- const client = createClient ( ) ;
5
-
6
4
export function App ( ) {
7
5
const [ extensionId , setExtensionId ] = useState < string | false | null > ( null ) ;
8
6
const [ error , setError ] = useState < string | null > ( null ) ;
@@ -11,8 +9,14 @@ export function App() {
11
9
const [ pending , setPending ] = useState ( false ) ;
12
10
const [ url , setUrl ] = useState ( window . location . href ) ;
13
11
const [ method , setMethod ] = useState ( "GET" ) ;
12
+ const [ dataDigest , setDataDigest ] = useState ( '' ) ;
13
+ const [ digestAlgo , setDigestAlgo ] = useState ( 'SHA-256' ) ;
14
+ const [ attestCredResult , setAttestCredResult ] = useState < CreateCredentialResult | null > ( null ) ;
15
+ const [ extensionClient , setExtensionClient ] = useState < ExtensionClient | null > ( null )
14
16
15
17
useEffect ( ( ) => {
18
+ const client = createClient ( ) ;
19
+ setExtensionClient ( client )
16
20
client . isExtensionInstalled ( ) . then ( ( result ) => setExtensionId ( result ) ) ;
17
21
} , [ ] ) ;
18
22
@@ -23,7 +27,8 @@ export function App() {
23
27
setPending ( true ) ;
24
28
25
29
try {
26
- const result = await client . authorize ( { message : `Message ${ Date . now ( ) } ` } ) ;
30
+ const result = await extensionClient . authorize ( { message : `Message ${ Date . now ( ) } ` } ) ;
31
+ console . log ( 'authorize result: ' , result )
27
32
setAuthorizeResult ( result ) ;
28
33
} catch ( error ) {
29
34
setError ( error . message ?? "Something went wrong" ) ;
@@ -39,7 +44,8 @@ export function App() {
39
44
setHeaders ( null ) ;
40
45
41
46
try {
42
- const result = await client . signRequest ( { url, method } ) ;
47
+ const result = await extensionClient . signRequest ( { url, method } ) ;
48
+ console . log ( 'signRequest result: ' , result )
43
49
setHeaders ( result . headers ) ;
44
50
} catch ( error ) {
45
51
setError ( error . message ?? "Something went wrong" ) ;
@@ -48,6 +54,60 @@ export function App() {
48
54
}
49
55
}
50
56
57
+ async function handleAttestCredential ( ev : FormEvent ) {
58
+ ev . preventDefault ( ) ;
59
+ setError ( null ) ;
60
+ setPending ( true ) ;
61
+
62
+ try {
63
+ //// example of data attestation schema:
64
+ //// https://github.com/provenant-dev/public-schema/blob/main/attestation/attestation.schema.json
65
+ let schemaSaid = 'ENDcMNUZjag27T_GTxiCmB2kYstg_kqipqz39906E_FD'
66
+ let credData = { digest : dataDigest , digestAlgo : 'SHA-256' }
67
+ const result = await extensionClient . createDataAttestationCredential ( {
68
+ credData : credData ,
69
+ schemaSaid : schemaSaid
70
+ } ) ;
71
+ console . log ( 'create data attestation credential result: ' , result )
72
+ setAttestCredResult ( result ) ;
73
+
74
+ } catch ( error ) {
75
+ setError ( error . message ?? "Something went wrong" ) ;
76
+ } finally {
77
+ setPending ( false ) ;
78
+ }
79
+ }
80
+
81
+ async function handleDownloadCredential ( ev : FormEvent ) {
82
+ ev . preventDefault ( ) ;
83
+ setError ( null ) ;
84
+ setPending ( true ) ;
85
+
86
+
87
+ try {
88
+ let credSAID = attestCredResult ?. acdc ?. _ked ?. d
89
+ const credential = await extensionClient . getCredential ( credSAID , true ) ;
90
+ console . log ( 'get credential result: ' , credential )
91
+ if ( ! credential ?. credential ) {
92
+ setError ( "Unable to get credential" ) ;
93
+ return
94
+ }
95
+ const blob = new Blob ( [ credential . credential ] , { type : 'text/plain' } ) ;
96
+ const url = URL . createObjectURL ( blob ) ;
97
+ const link = document . createElement ( 'a' ) ;
98
+ link . href = url ;
99
+ link . download = 'attestation-credential.cesr' ;
100
+ link . click ( ) ;
101
+ URL . revokeObjectURL ( url ) ;
102
+
103
+ } catch ( error ) {
104
+ setError ( error . message ?? "Something went wrong" ) ;
105
+ } finally {
106
+ setPending ( false ) ;
107
+ }
108
+ }
109
+
110
+
51
111
return (
52
112
< div style = { { maxWidth : 800 , margin : "auto" } } >
53
113
< section >
@@ -63,13 +123,13 @@ export function App() {
63
123
< form id = "headers-form" onSubmit = { handleSignHeaders } >
64
124
< div >
65
125
< label htmlFor = "url" > URL</ label >
66
- < input id = "url" value = { url } onChange = { ( ev ) => setUrl ( ev . currentTarget . value ) } />
126
+ < input id = "url" value = { url } onChange = { ( ev ) => setUrl ( ev . currentTarget . value ) } style = { { marginLeft : '10px' } } />
67
127
</ div >
68
- < div >
128
+ < div style = { { marginTop : '10px' } } >
69
129
< label htmlFor = "method" > Method</ label >
70
- < input id = "method" value = { method } onChange = { ( ev ) => setMethod ( ev . currentTarget . value ) } />
130
+ < input id = "method" value = { method } onChange = { ( ev ) => setMethod ( ev . currentTarget . value ) } style = { { marginLeft : '10px' } } />
71
131
</ div >
72
- < div >
132
+ < div style = { { marginTop : '10px' } } >
73
133
< button type = "submit" disabled = { ! authorizeResult } >
74
134
Request Signed Headers
75
135
</ button >
@@ -104,6 +164,36 @@ export function App() {
104
164
</ code >
105
165
</ pre >
106
166
</ section >
167
+
168
+ < section >
169
+ < h1 > Create Data Attestation Credential</ h1 >
170
+ < form id = "headers-form" onSubmit = { handleAttestCredential } >
171
+ < div >
172
+ < label htmlFor = "dataDigest" > Data Digest</ label >
173
+ < input id = "dataDigest" value = { dataDigest } onChange = { ( ev ) => setDataDigest ( ev . currentTarget . value ) } style = { { marginLeft : '10px' } } />
174
+ </ div >
175
+ < div style = { { marginTop : '10px' } } >
176
+ < label htmlFor = "digestAlgo" > Digest Algorithm</ label >
177
+ < input id = "digestAlgo"
178
+ value = { digestAlgo }
179
+ onChange = { ( ev ) => setDigestAlgo ( ev . currentTarget . value ) }
180
+ style = { { marginLeft : '10px' } }
181
+ placeholder = "e.g. SHA-256"
182
+ />
183
+ </ div >
184
+ < div style = { { marginTop : '10px' } } >
185
+ < button type = "submit" disabled = { ! authorizeResult || ! dataDigest } >
186
+ Attest with Selected AID
187
+ </ button >
188
+ < button type = "submit"
189
+ disabled = { ! authorizeResult || ! attestCredResult }
190
+ style = { { marginLeft : '10px' } }
191
+ onClick = { handleDownloadCredential } >
192
+ Download Attestation Credential
193
+ </ button >
194
+ </ div >
195
+ </ form >
196
+ </ section >
107
197
</ div >
108
198
) ;
109
199
}
0 commit comments