@@ -179,7 +179,7 @@ export class CallHelper {
179
179
) ;
180
180
}
181
181
182
- if ( res . type === 'PassphraseStateRequest ' ) {
182
+ if ( res . type === 'Deprecated_PassphraseStateRequest ' ) {
183
183
if ( this . session . device ) {
184
184
const currentState = this . session . device . passphraseState ;
185
185
const receivedState = res . message . state ;
@@ -191,28 +191,40 @@ export class CallHelper {
191
191
} ) ;
192
192
}
193
193
this . session . device . passphraseState = receivedState ;
194
- return this . _commonCall ( 'PassphraseStateAck ' , { } ) ;
194
+ return this . _commonCall ( 'Deprecated_PassphraseStateAck ' , { } ) ;
195
195
}
196
196
// ??? nowhere to save the state, throwing error
197
197
return Promise . reject ( new Error ( 'Nowhere to save passphrase state.' ) ) ;
198
198
}
199
199
200
200
if ( res . type === 'PassphraseRequest ') {
201
- if ( res . message . on_device ) {
201
+ if ( res . message . _on_device ) {
202
202
// "fake" button event
203
203
this . session . buttonEvent . emit ( 'PassphraseOnDevice ') ;
204
204
if ( this . session . device && this . session . device . passphraseState ) {
205
- return this . _commonCall ( 'PassphraseAck ', { state : this . session . device . passphraseState } ) ;
205
+ return this . _commonCall ( 'PassphraseAck ', { _state : this . session . device . passphraseState } ) ;
206
206
}
207
207
return this . _commonCall ( 'PassphraseAck' , { } ) ;
208
208
}
209
209
return this . _promptPassphrase ( ) . then (
210
- passphrase => {
211
- if ( this . session . device && this . session . device . passphraseState ) {
212
- return this . _commonCall ( 'PassphraseAck' , { passphrase : passphrase , state : this . session . device . passphraseState } ) ;
210
+ ( res : Object ) => {
211
+ const { passphrase, onDevice } = res ;
212
+ const session_id = this . session . device && this . session . device . features . session_id ;
213
+ const passphraseState = this . session . device && this . session . device . passphraseState ;
214
+ if ( session_id ) {
215
+ return this . _commonCall (
216
+ 'PassphraseAck' ,
217
+ onDevice ? { on_device : true } : { passphrase }
218
+ ) ;
219
+ } else if ( passphraseState ) {
220
+ return this . _commonCall (
221
+ 'PassphraseAck' , {
222
+ passphrase,
223
+ _state : passphraseState ,
224
+ } ) ;
225
+ } else {
226
+ return this . _commonCall ( 'PassphraseAck' , { passphrase } ) ;
213
227
}
214
-
215
- return this . _commonCall ( 'PassphraseAck' , { passphrase : passphrase } ) ;
216
228
} ,
217
229
err => {
218
230
return this . _commonCall ( 'Cancel' , { } ) . catch ( e => {
@@ -233,6 +245,16 @@ export class CallHelper {
233
245
) ;
234
246
}
235
247
248
+ // Initialize response for fw >= 2.3.0 || fw >= 1.9.0 with session_id=string
249
+ // GetFeatures always response with session_id null
250
+ // We need to avoid overwriting saved session_id in order to keep it for next Initialize call
251
+ if ( res . type === 'Features' ) {
252
+ const oldSessionId = this . session . device && this . session . device . features . session_id ;
253
+ if ( oldSessionId && ! res . message . session_id ) {
254
+ res . message . session_id = oldSessionId ;
255
+ }
256
+ }
257
+
236
258
return Promise . resolve ( res ) ;
237
259
}
238
260
@@ -253,14 +275,16 @@ export class CallHelper {
253
275
} ) ;
254
276
}
255
277
256
- _promptPassphrase ( ) : Promise < string > {
278
+ _promptPassphrase ( ) : Promise < Object > {
257
279
return new Promise ( ( resolve , reject ) => {
258
- if ( ! this . session . passphraseEvent . emit ( ( err , passphrase ) => {
259
- if ( err || passphrase == null ) {
260
- reject ( err ) ;
261
- } else {
262
- resolve ( passphrase . normalize ( 'NFKD' ) ) ;
280
+ if ( ! this . session . passphraseEvent . emit ( ( err , passphrase , onDevice ) => {
281
+ if ( err || ( ! onDevice && passphrase == null ) ) {
282
+ return reject ( err ) ;
283
+ }
284
+ if ( typeof passphrase === 'string' ) {
285
+ passphrase = passphrase . normalize ( 'NFKD' ) ;
263
286
}
287
+ return resolve ( { passphrase, onDevice } ) ;
264
288
} ) ) {
265
289
if ( this . session . debug ) {
266
290
console . warn ( '[trezor.js] [call] Passphrase callback not configured, cancelling request' ) ;
0 commit comments