@@ -72,33 +72,46 @@ server.get('/api/generateAuthKey', function(req, res) {
72
72
server . post ( '/api/setAuthKey' , function ( req , res ) {
73
73
var code = speakeasy . time ( { key : req . body . key , encoding : 'base32' } ) ;
74
74
75
- if ( code != req . body . code )
75
+ if ( code != req . body . code ) {
76
76
return res . send ( { set : false } ) ;
77
+ }
77
78
78
- db . setAuthKey ( req . body . serverKey , req . body . key , function ( err , success ) {
79
- if ( err )
79
+ db . sessionKeyValid ( req . body . serverKey , req . body . sessionKey , function ( err , success ) {
80
+ if ( err || success == false ) {
80
81
return res . send ( { set : false } ) ;
81
- res . send ( { set : true } ) ;
82
+ }
83
+
84
+ db . setAuthKey ( req . body . serverKey , req . body . key , function ( err , success ) {
85
+ if ( err ) {
86
+ return res . send ( { set : false } ) ;
87
+ }
88
+ res . send ( { set : true } ) ;
89
+ } ) ;
82
90
} ) ;
83
91
} ) ;
84
92
85
93
server . post ( '/api/disableAuthKey' , function ( req , res ) {
86
- db . getWalletRecord ( req . body . serverKey , function ( err , payload ) {
87
- if ( err )
88
- console . log ( 'Wallet Get Error : '+ err ) ;
94
+ db . sessionKeyValid ( req . body . serverKey , req . body . sessionKey , function ( err , success ) {
95
+ if ( err || success == false )
96
+ return res . send ( { result : 'error' , message : 'session key was invalid' } ) ;
89
97
90
- if ( ! payload || ! payload . authKey )
91
- return res . send ( { result : 'error' , message : 'no auth key found for this wallet' } ) ;
98
+ db . getWalletRecord ( req . body . serverKey , function ( err , payload ) {
99
+ if ( err )
100
+ console . log ( 'Wallet Get Error: ' + err ) ;
101
+
102
+ if ( ! payload || ! payload . authKey )
103
+ return res . send ( { result : 'error' , message : 'no auth key found for this wallet' } ) ;
92
104
93
- var code = speakeasy . time ( { key : payload . authKey , encoding : 'base32' } ) ;
105
+ var code = speakeasy . time ( { key : payload . authKey , encoding : 'base32' } ) ;
94
106
95
- if ( code != req . body . authCode )
96
- return res . send ( { result : 'error' , message : 'invalid auth code' } ) ;
107
+ if ( code != req . body . authCode )
108
+ return res . send ( { result : 'error' , message : 'invalid auth code' } ) ;
97
109
98
- db . disableAuthKey ( req . body . serverKey , function ( err , result ) {
99
- if ( err )
100
- return res . send ( { result : 'error' , message : 'could not update database, please try again later' } ) ;
101
- res . send ( { result : 'success' } ) ;
110
+ db . disableAuthKey ( req . body . serverKey , function ( err , result ) {
111
+ if ( err )
112
+ return res . send ( { result : 'error' , message : 'could not update database, please try again later' } ) ;
113
+ res . send ( { result : 'success' } ) ;
114
+ } ) ;
102
115
} ) ;
103
116
} ) ;
104
117
} ) ;
@@ -122,29 +135,47 @@ server.get('/api/wallet', function(req,res) {
122
135
return res . send ( { result : 'error' , message : 'Two factor authentication code was invalid' } ) ;
123
136
}
124
137
125
- return res . send ( { wallet : payload . wallet } ) ;
138
+ db . generateSessionKey ( req . query . serverKey , function ( err , key ) {
139
+ if ( err )
140
+ return res . send ( { result : 'error' , message : 'Error generating session key, please try again later' } ) ;
141
+ res . send ( { wallet : payload . wallet , sessionKey : key } ) ;
142
+ } ) ;
126
143
} ) ;
127
144
} ) ;
128
145
129
146
server . post ( '/api/wallet/delete' , function ( req , res ) {
130
- db . delete ( req . body . serverKey , function ( err , deleted ) {
131
- if ( deleted == true )
132
- res . send ( { result : 'success' } ) ;
133
- else
147
+ db . sessionKeyValid ( req . body . serverKey , req . body . sessionKey , function ( isValid ) {
148
+ if ( isValid == false )
149
+ return res . send ( { result : 'error' , message : 'session key was invalid' } ) ;
150
+
151
+ db . delete ( req . body . serverKey , function ( err , deleted ) {
152
+ if ( deleted == true )
153
+ return res . send ( { result : 'success' } ) ;
134
154
res . send ( { result : 'notfound' } ) ;
155
+ } ) ;
135
156
} ) ;
136
157
} ) ;
137
158
138
159
function saveWallet ( req , res ) {
160
+ if ( req . body . sessionKey )
161
+ req . body . payload . sessionKey = req . body . sessionKey ;
162
+
139
163
db . set ( req . body . serverKey , req . body . payload , function ( err , data ) {
140
164
if ( err ) {
141
165
if ( err == 'outOfSync' ) {
142
166
return res . send ( { result : 'outOfSync' , wallet : data . wallet } ) ;
143
167
} else {
144
- return res . send ( errorMessage ( "Database error: " + JSON . stringify ( err ) ) ) ;
168
+ return res . send ( { result : ' error' , messages : JSON . stringify ( err ) } ) ;
145
169
}
146
170
} else {
147
- res . send ( { result : 'ok' } ) ;
171
+ if ( ! req . body . override ) {
172
+ db . generateSessionKey ( req . body . serverKey , function ( err , key ) {
173
+ res . send ( { result : 'ok' , sessionKey : key } ) ;
174
+ } ) ;
175
+ return ;
176
+ } else {
177
+ res . send ( { result : 'ok' } ) ;
178
+ }
148
179
}
149
180
} ) ;
150
181
} ;
@@ -167,18 +198,10 @@ function saveWalletAndAddresses(req, res) {
167
198
bitcoind . batch ( batch , function ( err , btcres ) { } ) ;
168
199
169
200
saveWallet ( req , res ) ;
170
- /*
171
- bitcoind.batch(batch, function(err, btcres) {
172
- if(err)
173
- return btcres.send({messages: [err.message]});
174
-
175
- saveWallet(req, res);
176
- });
177
- */
178
201
} else {
179
202
saveWallet ( req , res ) ;
180
203
}
181
- }
204
+ } ;
182
205
183
206
function registerAddresses ( addresses , callback ) {
184
207
var isNew = false ;
@@ -202,28 +225,106 @@ function errorResponse(errors) {
202
225
return { messages : errors } ;
203
226
}
204
227
228
+ server . post ( '/api/change' , function ( req , res ) {
229
+ if ( ! req . body . originalServerKey )
230
+ return res . send ( { result : 'error' , message : 'originalServerKey required' } ) ;
231
+
232
+ if ( ! req . body . serverKey )
233
+ return res . send ( { result : 'error' , message : 'serverKey required' } ) ;
234
+
235
+ if ( req . body . originalServerKey == req . body . serverKey )
236
+ return res . send ( { result : 'ok' } ) ;
237
+
238
+ db . sessionKeyValid ( req . body . originalServerKey , req . body . sessionKey , sessionValidate ) ;
239
+
240
+ function sessionValidate ( err , isValid ) {
241
+ if ( err )
242
+ return res . send ( { result : 'error' , message : 'error validating record' } ) ;
243
+
244
+ if ( isValid == false )
245
+ return res . send ( { result : 'error' , message : 'session was invalid' } ) ;
246
+
247
+ // Check for existing record
248
+ db . getWalletRecord ( req . body . serverKey , existingWalletRecord ) ;
249
+ } ;
250
+
251
+ function existingWalletRecord ( err , existingRecord ) {
252
+ if ( err || existingRecord )
253
+ return res . send ( { result : 'error' , message : 'cannot change' } ) ;
254
+
255
+ db . getWalletRecord ( req . body . originalServerKey , walletRecord ) ;
256
+ } ;
257
+
258
+ function walletRecord ( err , record ) {
259
+ if ( err )
260
+ return res . send ( { result : 'error' , message : 'error getting originalServerKey record, please try again later' } ) ;
261
+
262
+ if ( ! record )
263
+ return res . send ( { result : 'error' , message : 'could not find originalServerKey record' } ) ;
264
+
265
+ if ( record . sessionKey && record . sessionKey != req . body . sessionKey )
266
+ return res . send ( { result : 'error' , message : 'invalid sessionKey' } ) ;
267
+
268
+ var newRecord = {
269
+ sessionKey : record . sessionKey ,
270
+ email : ( req . body . email || record . email ) ,
271
+ payloadHash : req . body . payloadHash ,
272
+ wallet : req . body . wallet
273
+ } ;
274
+
275
+ if ( record . authKey )
276
+ newRecord . authKey = record . authKey ;
277
+
278
+ db . set ( req . body . serverKey , newRecord , recordSaved ) ;
279
+ } ;
280
+
281
+ function recordSaved ( err , result ) {
282
+ if ( err )
283
+ return res . send ( { result : 'error' , message : 'error changing record, please try again later' } ) ;
284
+
285
+ db . delete ( req . body . originalServerKey , oldRecordDeleted ) ;
286
+ } ;
287
+
288
+ function oldRecordDeleted ( err , isDeleted ) {
289
+ if ( err )
290
+ return res . send ( { result : 'error' , message : 'error changing record, please try again later' } ) ;
291
+
292
+ res . send ( { result : 'ok' } ) ;
293
+ } ;
294
+ } ) ;
295
+
205
296
server . post ( '/api/wallet' , function ( req , res ) {
206
- db . getWallet ( req . body . serverKey , function ( err , wallet ) {
297
+ db . getWalletRecord ( req . body . serverKey , function ( err , record ) {
207
298
if ( err ) {
208
299
console . log ( 'Database error: ' + err ) ;
209
300
return res . send ( errorResponse ( 'There was a server error, please try again later.' ) ) ;
210
301
}
211
302
212
303
// New wallet
213
304
if ( ! req . body . override ) {
214
- if ( wallet )
215
- return res . send ( { result : 'exists' , wallet : wallet } ) ;
305
+ if ( record && record . wallet )
306
+ return res . send ( { result : 'exists' } ) ;
216
307
217
- if ( req . body . payload . email != undefined )
308
+ if ( req . body . payload . email != undefined ) {
218
309
db . checkEmailExists ( req . body . payload . email , function ( err , response ) {
219
310
if ( response == true )
220
311
return res . send ( { result : 'error' , messages : [ 'Email address already exists' ] } ) ;
221
- else
222
- return saveWalletAndAddresses ( req , res ) ;
312
+ saveWalletAndAddresses ( req , res ) ;
223
313
} ) ;
224
- }
314
+ }
225
315
226
- return saveWalletAndAddresses ( req , res ) ;
316
+ saveWalletAndAddresses ( req , res ) ;
317
+ } else {
318
+ // Not new, check the session key
319
+ db . sessionKeyValid ( req . body . serverKey , req . body . sessionKey , function ( err , isValid ) {
320
+ if ( err )
321
+ return res . send ( { result : 'error' , messages : [ 'Database error, please try again later' ] } ) ;
322
+ if ( isValid == false )
323
+ return res . send ( { result : 'error' , messages : [ 'Invalid session key' ] } ) ;
324
+
325
+ saveWalletAndAddresses ( req , res ) ;
326
+ } ) ;
327
+ }
227
328
} ) ;
228
329
} ) ;
229
330
0 commit comments