{ "id": "170635", "key": "MOD-2382", "fields": { "issuetype": { "id": "1", "description": "A problem which impairs or prevents the functions of the product.", "name": "Bug", "subtask": false }, "project": { "id": "10034", "key": "MOD", "name": "Appcelerator Modules", "projectCategory": { "id": "10100", "description": "Titanium and related SDKs used in application development", "name": "Client" } }, "fixVersions": [ { "id": "20029", "name": "Release 7.1.0", "archived": false, "released": false } ], "resolution": { "id": "1", "description": "A fix for this issue is checked into the tree and tested.", "name": "Fixed" }, "resolutiondate": "2018-02-28T22:13:55.000+0000", "created": "2017-12-15T20:32:10.000+0000", "priority": { "name": "Critical", "id": "1" }, "labels": [], "versions": [], "issuelinks": [], "assignee": { "name": "gmathews", "key": "gmathews", "displayName": "Gary Mathews", "active": true, "timeZone": "America/Los_Angeles" }, "updated": "2018-03-14T20:51:29.000+0000", "status": { "description": "The issue is considered finished, the resolution is correct. Issues which are closed can be reopened.", "name": "Closed", "id": "6", "statusCategory": { "id": 3, "key": "done", "colorName": "green", "name": "Done" } }, "components": [ { "id": "14565", "name": "TouchID" } ], "description": "h5. Issue: Customer has uncovered some bugs \r\n\r\n1. TouchID.invalidate() results in the crash. Please let me know if I am using it incorrectly or is it an actual bug. The idea is to stop Android device from listening for fingerprint as there is no modal dialogue being presented by Android OS unlike iOS where user is presented with a dialogue and has a way of cancelling out of it. \r\n\r\n2. Consider following TouchID item declaration supplied by Eric Merriman:\r\n\r\nvar TouchID = require('ti.touchid'); \r\nkeychainItem = TouchID.createKeychainItem({ \r\nidentifier: 'MeridianTest10', \r\naccessibilityMode: TouchID.ACCESSIBLE_WHEN_PASSCODE_SET_THIS_DEVICE_ONLY \r\n}); \r\n\r\nThis code should allow us to save/read keychain values without having to provide fingerprint given that there is pin/gesture/passcode setup on the device. There are 3 separate issues here: \r\n\r\na) When trying to read keychain value back I always get empty value. This also happens if I call update on the keychain item and try to read it back. \r\nb) Once passcode/pin/gesture are removed I am still able to do save/read/update operations. In my opinion keychain item should be invalidated if it happens. \r\nc) There is no way to check whether passcode/pin/gesture are setup on device. \r\n\r\nTouchID.authenticationPolicy = TouchID.AUTHENTICATION_POLICY_PASSCODE; \r\nvar res = TouchID.deviceCanAuthenticate(); \r\n\r\nOn iOS this code will return TouchID.ERROR_PASSCODE_NOT_SET constant, on Android it returns \"No fingerprints found\" message. \r\n\r\n4) When accessControlModeis set to TouchID.ACCESS_CONTROL_TOUCH_ID_CURRENT_SET and I remove a fingerprint, I am still able to authenticate keychain item. On iOS keychain item is invalidated when user adds or removes a fingerprint. Is this OS limitation? \r\n\r\n5) noticed when accessControlMode is set to TouchID.ACCESS_CONTROL_TOUCH_ID_CURRENT_SET and users adds a fingerprint I get error code ERROR_KEY_PERMANENTLY_INVALIDATED. After a quick google search I noticed this happens when there is a change to lock screen settings. Is there a full list of action that would result in this error available anywhere? \r\n\r\n6)After 5 unsuccessful fingerprint authentication attempts it is possible to try again after about 15 seconds. On iOS it is possible to do it right away given you put phone to sleep, awake it and type passcode. Is it possible to achieve same functionality? If no, is it possible to control 15 second time frame? ", "attachment": [ { "id": "63822", "filename": "AndroidTouchID.zip", "author": { "name": "vvazquezmontero", "key": "vvazquezmontero", "displayName": "Victor Vazquez Montero", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2017-12-15T20:34:02.000+0000", "size": 9373468, "mimeType": "application/zip" }, { "id": "63955", "filename": "saveAndRead.gif", "author": { "name": "gmathews", "key": "gmathews", "displayName": "Gary Mathews", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-01-11T22:22:13.000+0000", "size": 1221867, "mimeType": "image/gif" } ], "flagged": false, "summary": "Android Touch ID Module bugs/ Queries", "creator": { "name": "vvazquezmontero", "key": "vvazquezmontero", "displayName": "Victor Vazquez Montero", "active": true, "timeZone": "America/Los_Angeles" }, "subtasks": [], "reporter": { "name": "vvazquezmontero", "key": "vvazquezmontero", "displayName": "Victor Vazquez Montero", "active": true, "timeZone": "America/Los_Angeles" }, "environment": "6.3 GA SDK \r\nTouchID Module v2.2.2", "closedSprints": [ { "id": 978, "state": "closed", "name": "2017 Sprint 25 SDK", "startDate": "2017-12-03T23:22:15.144Z", "endDate": "2017-12-17T23:22:00.000Z", "completeDate": "2017-12-18T22:32:02.770Z", "originBoardId": 114 }, { "id": 997, "state": "closed", "name": "2018 Sprint 03 SDK", "startDate": "2018-01-28T16:23:12.178Z", "endDate": "2018-02-11T16:23:00.000Z", "completeDate": "2018-02-12T04:22:49.354Z", "originBoardId": 114 }, { "id": 984, "state": "closed", "name": "2017 Sprint 26 SDK", "startDate": "2017-12-17T22:34:59.726Z", "endDate": "2017-12-31T22:34:00.000Z", "completeDate": "2018-01-02T16:57:05.655Z", "originBoardId": 114 }, { "id": 985, "state": "closed", "name": "2018 Sprint 01 SDK", "startDate": "2017-12-31T16:58:54.631Z", "endDate": "2018-01-14T16:58:00.000Z", "completeDate": "2018-01-17T22:44:27.028Z", "originBoardId": 114 }, { "id": 990, "state": "closed", "name": "2018 Sprint 02 SDK", "startDate": "2018-01-14T22:48:43.544Z", "endDate": "2018-01-28T22:48:00.000Z", "completeDate": "2018-01-29T16:22:42.911Z", "originBoardId": 114 } ], "comment": { "comments": [ { "id": "432233", "author": { "name": "vvazquezmontero", "key": "vvazquezmontero", "displayName": "Victor Vazquez Montero", "active": true, "timeZone": "America/Los_Angeles" }, "body": "For the first Issue we were able to reproduce but for second we dont have device with Fingerprint reader", "updateAuthor": { "name": "vvazquezmontero", "key": "vvazquezmontero", "displayName": "Victor Vazquez Montero", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2017-12-15T20:33:08.000+0000", "updated": "2017-12-15T20:33:08.000+0000" }, { "id": "432298", "author": { "name": "vvazquezmontero", "key": "vvazquezmontero", "displayName": "Victor Vazquez Montero", "active": true, "timeZone": "America/Los_Angeles" }, "body": "[~gmathews] Nikita from Meridian said she was working with you on this. Would you be able to look into this? ", "updateAuthor": { "name": "vvazquezmontero", "key": "vvazquezmontero", "displayName": "Victor Vazquez Montero", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2017-12-18T17:15:37.000+0000", "updated": "2017-12-18T17:15:37.000+0000" }, { "id": "432420", "author": { "name": "vvazquezmontero", "key": "vvazquezmontero", "displayName": "Victor Vazquez Montero", "active": true, "timeZone": "America/Los_Angeles" }, "body": "[~gmathews] Nikita raised an additional concern: \r\n {quote}I have one additional concern I wanted to raise. Currently ERROR_KEY_PERMANENTLY_INVALIDATED is only being thrown when user attempts to read/save/update keychain item. Both deviceCanAuthenticate and fetchExistence methods return true if the key is invalidated. This allows for a situation when I have to ask user to provide fingerprint just to find out whether key is still valid. This is a very bad UX and we will need that fixed asap. Two possible solutions I see here is to either have either deviceCanAuthenticate/fetchExistence return that error or to implement a new method to check if the key is invalidated. {quote}", "updateAuthor": { "name": "vvazquezmontero", "key": "vvazquezmontero", "displayName": "Victor Vazquez Montero", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2017-12-19T21:57:21.000+0000", "updated": "2017-12-19T21:57:21.000+0000" }, { "id": "432788", "author": { "name": "gmathews", "key": "gmathews", "displayName": "Gary Mathews", "active": true, "timeZone": "America/Los_Angeles" }, "body": "ti.touchid: https://github.com/appcelerator-modules/ti.touchid/pull/39\r\nti.identity: https://github.com/appcelerator-modules/titanium-identity/pull/7", "updateAuthor": { "name": "gmathews", "key": "gmathews", "displayName": "Gary Mathews", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-01-05T19:24:15.000+0000", "updated": "2018-01-05T19:24:15.000+0000" }, { "id": "435019", "author": { "name": "gmathews", "key": "gmathews", "displayName": "Gary Mathews", "active": true, "timeZone": "America/Los_Angeles" }, "body": "master: https://github.com/appcelerator/titanium_mobile/pull/9891\r\n7_1_X: https://github.com/appcelerator/titanium_mobile/pull/9892", "updateAuthor": { "name": "gmathews", "key": "gmathews", "displayName": "Gary Mathews", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-02-28T18:55:11.000+0000", "updated": "2018-02-28T18:55:11.000+0000" }, { "id": "435020", "author": { "name": "lchoudhary", "key": "lchoudhary", "displayName": "Lokesh Choudhary", "active": true, "timeZone": "America/Los_Angeles" }, "body": "FR Passed.\r\n", "updateAuthor": { "name": "lchoudhary", "key": "lchoudhary", "displayName": "Lokesh Choudhary", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-02-28T19:18:38.000+0000", "updated": "2018-02-28T19:18:38.000+0000" }, { "id": "435032", "author": { "name": "lchoudhary", "key": "lchoudhary", "displayName": "Lokesh Choudhary", "active": true, "timeZone": "America/Los_Angeles" }, "body": "PR's merged.", "updateAuthor": { "name": "lchoudhary", "key": "lchoudhary", "displayName": "Lokesh Choudhary", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-02-28T22:13:45.000+0000", "updated": "2018-02-28T22:13:45.000+0000" }, { "id": "435608", "author": { "name": "lchoudhary", "key": "lchoudhary", "displayName": "Lokesh Choudhary", "active": true, "timeZone": "America/Los_Angeles" }, "body": "Verified the fix in SDK 7.1.0.v20180308150545 & 7.2.0.v20180314132221.\r\n\r\nClosing.\r\n\r\nStudio Ver: 5.0.0.201712081732\r\nOS Ver: 10.13.2\r\nXcode Ver: Xcode 9.2\r\nAppc NPM: 4.2.12\r\nAppc CLI: 7.0.2\r\nDaemon Ver: 1.0.1\r\nTi CLI Ver: 5.0.14\r\nAlloy Ver: 1.11.0\r\nNode Ver: 8.9.1\r\nNPM Ver: 5.5.1\r\nJava Ver: 1.8.0_101\r\nDevices: ⇨ google Nexus 6P --- Android 8.0.0\r\n ⇨ google Nexus 5 --- Android 6.0.1\r\n", "updateAuthor": { "name": "lchoudhary", "key": "lchoudhary", "displayName": "Lokesh Choudhary", "active": true, "timeZone": "America/Los_Angeles" }, "created": "2018-03-14T20:51:15.000+0000", "updated": "2018-03-14T20:51:25.000+0000" } ], "maxResults": 15, "total": 15, "startAt": 0 } } }