1
1
<script lang="ts">
2
2
import {defineComponent } from ' vue'
3
- import init , {generate_security_box , get_user_sig , register } from " meta-secret-web-cli" ;
4
- import type {DeviceInfo , UserSecurityBox , UserSignature } from " @/model/models" ;
3
+ import init , {generate_security_box , get_user_sig , get_vault , register } from " meta-secret-web-cli" ;
4
+ import {
5
+ type DeviceInfo ,
6
+ RegistrationStatus ,
7
+ type UserSecurityBox ,
8
+ type UserSignature ,
9
+ VaultInfoStatus
10
+ } from " @/model/models" ;
5
11
6
12
interface User {
7
13
securityBox? : UserSecurityBox ,
@@ -26,10 +32,15 @@ export default defineComponent({
26
32
return {
27
33
user: defaultUser ,
28
34
userId: ' ' ,
29
- passwordStorage: defaultPasswordStorage
35
+ joinComponent: false ,
36
+ passwordStorage: defaultPasswordStorage ,
30
37
}
31
38
},
32
39
mounted() {
40
+ if (localStorage .userId ) {
41
+ this .userId = localStorage .userId ;
42
+ }
43
+
33
44
if (localStorage .user ) {
34
45
this .user = localStorage .user ;
35
46
}
@@ -39,10 +50,13 @@ export default defineComponent({
39
50
}
40
51
},
41
52
53
+ /**
54
+ * https://v2.vuejs.org/v2/cookbook/client-side-storage.html
55
+ */
42
56
watch: {
43
57
user(newUser ) {
44
- localStorage .user = newUser ;
45
- }
58
+ localStorage .user = JSON . stringify ( newUser ) ;
59
+ },
46
60
},
47
61
48
62
methods: {
@@ -53,21 +67,59 @@ export default defineComponent({
53
67
deviceName: " d1"
54
68
}
55
69
56
- let securityBox = generate_security_box (" test_vault_web " );
70
+ let securityBox = generate_security_box (this . userId );
57
71
let userSig = get_user_sig (securityBox , device );
72
+ console .log (" generated user sig: " , userSig );
58
73
59
74
this .user = {
60
75
securityBox: securityBox ,
61
76
userSig: userSig
62
77
};
78
+ this .initUser ();
63
79
64
- let registrationStatus = await register (userSig );
65
- console .log (" Registration status : " , registrationStatus );
80
+ let vault = await get_vault (userSig );
81
+ console .log (" vault : " , JSON . stringify ( vault ) );
66
82
83
+ if (vault .data .vaultInfo === VaultInfoStatus .NotFound ) {
84
+ await this .userRegistration ();
85
+ }
67
86
87
+ // Unknown status means, user is not a member of a vault
88
+ if (vault .data .vaultInfo === VaultInfoStatus .Unknown ) {
89
+ // join to the vault or choose another vault name
90
+ this .joinComponent = true ;
91
+ }
68
92
})
69
93
},
70
94
95
+ async join() {
96
+ init ().then (async () => {
97
+ // send join request
98
+ console .log (" js user sig: " , JSON .parse (localStorage .user ).userSig );
99
+ return await this .userRegistration ();
100
+ })
101
+ },
102
+
103
+ async userRegistration() {
104
+ let userSig = JSON .parse (localStorage .user ).userSig ;
105
+ alert (" User registration with: " + userSig );
106
+
107
+ let registrationStatus = await register (userSig );
108
+ console .log (" registration status: " , registrationStatus .data );
109
+ switch (registrationStatus .data ) {
110
+ case RegistrationStatus .Registered :
111
+ // register button gets unavailable, userId kept in local storage
112
+ alert (" Your vault has been registered" );
113
+ return ;
114
+ case RegistrationStatus .AlreadyExists :
115
+ alert (" Join request has been sent, please wait for approval" );
116
+ return ;
117
+ default :
118
+ alert (" Unknown error!!!!! Unknown registration status! Invalid response from server" );
119
+ return ;
120
+ }
121
+ },
122
+
71
123
addPassword() {
72
124
console .log (" Add password into a distributed storage" );
73
125
@@ -84,8 +136,23 @@ export default defineComponent({
84
136
this .passwordStorage .shares .push (share1 );
85
137
},
86
138
87
- alert() {
88
- alert (' yay' );
139
+ cleanUpUser() {
140
+ localStorage .setItem (' userId' , ' ' );
141
+ },
142
+
143
+ isNewUser() {
144
+ if (localStorage .userId ) {
145
+ if (localStorage .userId !== ' ' ) {
146
+ return false ;
147
+ }
148
+ }
149
+
150
+ return true ;
151
+ },
152
+
153
+ initUser() {
154
+ localStorage .userId = this .userId ;
155
+ localStorage .user = JSON .stringify (this .user );
89
156
}
90
157
}
91
158
})
@@ -104,28 +171,52 @@ export default defineComponent({
104
171
105
172
<div class =" py-4" ></div >
106
173
107
- <div class =" container flex items-center justify-center max-w-md border-b border-t py-2 px-4" >
108
- <label >@</label >
109
- <input
110
- class =" appearance-none bg-transparent border-none w-full text-gray-700 mr-3 py-1 px-2 leading-tight focus:outline-none"
111
- type =" text"
112
- placeholder =" user_id"
113
- aria-label =" Full name"
114
- v-model =" userId"
115
- >
116
- <button
117
- class =" flex-shrink-0 bg-teal-500 hover:bg-teal-700 border-teal-500 hover:border-teal-700 text-sm border-4 text-white py-1 px-2 rounded"
118
- type =" button"
119
- @click =" generateUser"
120
- >
121
- Register
122
- </button >
174
+ <div >
175
+ <div class =" container flex items-center max-w-md py-2" >
176
+ <label >User:</label >
177
+ </div >
178
+
179
+ <div class =" container flex items-center justify-center max-w-md border-b border-t border-l border-r py-2 px-4" >
180
+ <label >@</label >
181
+ <input
182
+ class =" appearance-none bg-transparent border-none w-full text-gray-700 mr-3 py-1 px-2 leading-tight focus:outline-none"
183
+ type =" text"
184
+ placeholder =" user_id"
185
+ aria-label =" Full name"
186
+ v-model =" userId"
187
+ v-bind:disabled =" !isNewUser"
188
+ >
189
+ <button
190
+ class =" flex-shrink-0 bg-teal-500 hover:bg-teal-700 border-teal-500 hover:border-teal-700 text-sm border-4 text-white py-1 px-2 rounded"
191
+ type =" button"
192
+ @click =" generateUser"
193
+ v-if =" isNewUser"
194
+ >
195
+ Register
196
+ </button >
197
+ </div >
198
+ </div >
199
+
200
+ <div v-if =" joinComponent" >
201
+ <div class =" container flex items-center max-w-md py-2 px-4" >
202
+ <label
203
+ class =" appearance-none bg-transparent border-none w-full text-gray-700 mr-3 py-1 leading-tight focus:outline-none" >
204
+ Vault already exists, would you like to join?
205
+ </label >
206
+ <button
207
+ class =" flex-shrink-0 bg-teal-500 hover:bg-teal-700 border-teal-500 hover:border-teal-700 text-sm border-4 text-white py-1 px-4 rounded"
208
+ type =" button"
209
+ @click =" join"
210
+ >
211
+ Join
212
+ </button >
213
+ </div >
123
214
</div >
124
215
125
- <div class =" py-4 " />
216
+ <div class =" py-8 " />
126
217
127
218
<div class =" container flex flex-col items-center justify-center max-w-md py-2 px-4" >
128
- <div class =" " >
219
+ <div class =" flex " >
129
220
<p class =" text-xl py-2" >Password</p >
130
221
</div >
131
222
@@ -141,8 +232,6 @@ export default defineComponent({
141
232
<div class =" px-4" >id: 12345678</div >
142
233
<div class =" px-4" >share: my share 1</div >
143
234
</div >
144
-
145
-
146
235
</div >
147
236
148
237
0 commit comments