Skip to content

Commit 183b3fe

Browse files
authored
Merge pull request #16570 from geoffw0/swiftssn
Swift: Use shared library for sensitive private information heuristics
2 parents a63e70d + 1ca0de9 commit 183b3fe

File tree

5 files changed

+103
-27
lines changed

5 files changed

+103
-27
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Additional heuristics for sensitive private information have been added to the `SensitiveExprs.qll` library, improving coverage for credit card and social security numbers. This may result in additional results for queries that use sensitive data such as `swift/cleartext-transmission`.

swift/ql/lib/codeql/swift/security/SensitiveExprs.qll

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -64,33 +64,10 @@ class SensitivePrivateInfo extends SensitiveDataType, TPrivateInfo {
6464
override string toString() { result = "private information" }
6565

6666
override string getRegexp() {
67+
// we've had good results for the e-mail heuristic in Swift, which isn't part of the default regex. Add it in.
6768
result =
68-
"(?is).*(" +
69-
// Inspired by the list on https://cwe.mitre.org/data/definitions/359.html
70-
// Government identifiers, such as Social Security Numbers
71-
"social.?security|employer.?identification|national.?insurance|resident.?id|" +
72-
"passport.?(num|no)|" +
73-
// Contact information, such as home addresses
74-
"post.?code|zip.?code|home.?addr|" +
75-
// and telephone numbers
76-
"(mob(ile)?|home).?(num|no|tel|phone)|(tel|fax|phone).?(num|no)|telephone|" +
77-
"emergency.?contact|" +
78-
// Geographic location - where the user is (or was)
79-
"l(atitude|ongitude)|nationality|" +
80-
// Financial data - such as credit card numbers, salary, bank accounts, and debts
81-
"(credit|debit|bank|visa).?(card|num|no|acc(ou?)nt)|acc(ou)?nt.?(no|num|credit)|" +
82-
"salary|billing|credit.?(rating|score)|" +
83-
// Communications - e-mail addresses, private e-mail messages, SMS text messages, chat logs, etc.
84-
"e(mail|_mail)|" +
85-
// Health - medical conditions, insurance status, prescription records
86-
"birth.?da(te|y)|da(te|y).?(of.?)?birth|" +
87-
"medical|(health|care).?plan|healthkit|appointment|prescription|" +
88-
"blood.?(type|alcohol|glucose|pressure)|heart.?(rate|rhythm)|body.?(mass|fat)|" +
89-
"menstrua|pregnan|insulin|inhaler|" +
90-
// Relationships - work and family
91-
"employ(er|ee)|spouse|maiden.?name" +
92-
// ---
93-
").*"
69+
HeuristicNames::maybeSensitiveRegexp(SensitiveDataClassification::private())
70+
.replaceAll(".*(", ".*(e(mail|_mail)|")
9471
}
9572
}
9673

swift/ql/test/query-tests/Security/CWE-311/CleartextStorageDatabase.expected

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ edges
6969
| SQLite.swift:197:17:197:49 | [...] [Collection element] | SQLite.swift:197:16:197:50 | [...] [Collection element, Collection element] | provenance | |
7070
| SQLite.swift:197:18:197:32 | ... <-(_:_:) ... | SQLite.swift:197:17:197:49 | [...] [Collection element] | provenance | |
7171
| SQLite.swift:197:32:197:32 | mobilePhoneNumber | SQLite.swift:197:18:197:32 | ... <-(_:_:) ... | provenance | |
72+
| file://:0:0:0:0 | [post] self [data, Collection element] | testRealm2.swift:13:6:13:6 | self [Return] [data, Collection element] | provenance | |
7273
| file://:0:0:0:0 | [post] self [data] | testRealm2.swift:13:6:13:6 | self [Return] [data] | provenance | |
7374
| file://:0:0:0:0 | [post] self [data] | testRealm.swift:27:6:27:6 | self [Return] [data] | provenance | |
7475
| file://:0:0:0:0 | [post] self [notStoredBankAccountNumber] | testCoreData2.swift:23:13:23:13 | self [Return] [notStoredBankAccountNumber] | provenance | |
@@ -82,6 +83,7 @@ edges
8283
| file://:0:0:0:0 | value | file://:0:0:0:0 | [post] self [notStoredBankAccountNumber] | provenance | |
8384
| file://:0:0:0:0 | value | file://:0:0:0:0 | [post] self [password] | provenance | |
8485
| file://:0:0:0:0 | value | file://:0:0:0:0 | [post] self [value] | provenance | |
86+
| file://:0:0:0:0 | value [Collection element] | file://:0:0:0:0 | [post] self [data, Collection element] | provenance | |
8587
| sqlite3_c_api.swift:42:69:42:69 | medicalNotes | sqlite3_c_api.swift:46:27:46:27 | insertQuery | provenance | |
8688
| sqlite3_c_api.swift:43:49:43:49 | medicalNotes | sqlite3_c_api.swift:47:27:47:27 | updateQuery | provenance | |
8789
| testCoreData2.swift:23:13:23:13 | value | file://:0:0:0:0 | value | provenance | |
@@ -294,9 +296,38 @@ edges
294296
| testGRDB.swift:212:98:212:107 | [...] [Collection element] | testGRDB.swift:212:98:212:107 | [...] | provenance | |
295297
| testGRDB.swift:212:99:212:99 | password | testGRDB.swift:212:98:212:107 | [...] [Collection element] | provenance | |
296298
| testRealm2.swift:13:6:13:6 | value | file://:0:0:0:0 | value | provenance | |
299+
| testRealm2.swift:13:6:13:6 | value [Collection element] | file://:0:0:0:0 | value [Collection element] | provenance | |
297300
| testRealm2.swift:18:2:18:2 | [post] o [data] | testRealm2.swift:18:2:18:2 | [post] o | provenance | |
298301
| testRealm2.swift:18:11:18:11 | myPassword | testRealm2.swift:13:6:13:6 | value | provenance | |
299302
| testRealm2.swift:18:11:18:11 | myPassword | testRealm2.swift:18:2:18:2 | [post] o [data] | provenance | |
303+
| testRealm2.swift:24:2:24:2 | [post] o [data] | testRealm2.swift:24:2:24:2 | [post] o | provenance | |
304+
| testRealm2.swift:24:11:24:11 | socialSecurityNumber | testRealm2.swift:13:6:13:6 | value | provenance | |
305+
| testRealm2.swift:24:11:24:11 | socialSecurityNumber | testRealm2.swift:24:2:24:2 | [post] o [data] | provenance | |
306+
| testRealm2.swift:25:2:25:2 | [post] o [data] | testRealm2.swift:25:2:25:2 | [post] o | provenance | |
307+
| testRealm2.swift:25:11:25:11 | ssn | testRealm2.swift:13:6:13:6 | value | provenance | |
308+
| testRealm2.swift:25:11:25:11 | ssn | testRealm2.swift:25:2:25:2 | [post] o [data] | provenance | |
309+
| testRealm2.swift:26:2:26:2 | [post] o [data, Collection element] | testRealm2.swift:26:2:26:2 | [post] o | provenance | |
310+
| testRealm2.swift:26:2:26:2 | [post] o [data] | testRealm2.swift:26:2:26:2 | [post] o | provenance | |
311+
| testRealm2.swift:26:11:26:25 | call to String.init(_:) | testRealm2.swift:13:6:13:6 | value | provenance | |
312+
| testRealm2.swift:26:11:26:25 | call to String.init(_:) | testRealm2.swift:26:2:26:2 | [post] o [data] | provenance | |
313+
| testRealm2.swift:26:11:26:25 | call to String.init(_:) [Collection element] | testRealm2.swift:13:6:13:6 | value [Collection element] | provenance | |
314+
| testRealm2.swift:26:11:26:25 | call to String.init(_:) [Collection element] | testRealm2.swift:26:2:26:2 | [post] o [data, Collection element] | provenance | |
315+
| testRealm2.swift:26:18:26:18 | ssn_int | testRealm2.swift:26:11:26:25 | call to String.init(_:) | provenance | |
316+
| testRealm2.swift:26:18:26:18 | ssn_int | testRealm2.swift:26:11:26:25 | call to String.init(_:) [Collection element] | provenance | |
317+
| testRealm2.swift:32:2:32:2 | [post] o [data] | testRealm2.swift:32:2:32:2 | [post] o | provenance | |
318+
| testRealm2.swift:32:11:32:11 | creditCardNumber | testRealm2.swift:13:6:13:6 | value | provenance | |
319+
| testRealm2.swift:32:11:32:11 | creditCardNumber | testRealm2.swift:32:2:32:2 | [post] o [data] | provenance | |
320+
| testRealm2.swift:33:2:33:2 | [post] o [data] | testRealm2.swift:33:2:33:2 | [post] o | provenance | |
321+
| testRealm2.swift:33:11:33:11 | CCN | testRealm2.swift:13:6:13:6 | value | provenance | |
322+
| testRealm2.swift:33:11:33:11 | CCN | testRealm2.swift:33:2:33:2 | [post] o [data] | provenance | |
323+
| testRealm2.swift:34:2:34:2 | [post] o [data, Collection element] | testRealm2.swift:34:2:34:2 | [post] o | provenance | |
324+
| testRealm2.swift:34:2:34:2 | [post] o [data] | testRealm2.swift:34:2:34:2 | [post] o | provenance | |
325+
| testRealm2.swift:34:11:34:25 | call to String.init(_:) | testRealm2.swift:13:6:13:6 | value | provenance | |
326+
| testRealm2.swift:34:11:34:25 | call to String.init(_:) | testRealm2.swift:34:2:34:2 | [post] o [data] | provenance | |
327+
| testRealm2.swift:34:11:34:25 | call to String.init(_:) [Collection element] | testRealm2.swift:13:6:13:6 | value [Collection element] | provenance | |
328+
| testRealm2.swift:34:11:34:25 | call to String.init(_:) [Collection element] | testRealm2.swift:34:2:34:2 | [post] o [data, Collection element] | provenance | |
329+
| testRealm2.swift:34:18:34:18 | int_ccn | testRealm2.swift:34:11:34:25 | call to String.init(_:) | provenance | |
330+
| testRealm2.swift:34:18:34:18 | int_ccn | testRealm2.swift:34:11:34:25 | call to String.init(_:) [Collection element] | provenance | |
300331
| testRealm.swift:27:6:27:6 | value | file://:0:0:0:0 | value | provenance | |
301332
| testRealm.swift:34:6:34:6 | value | file://:0:0:0:0 | value | provenance | |
302333
| testRealm.swift:41:2:41:2 | [post] a [data] | testRealm.swift:41:2:41:2 | [post] a | provenance | |
@@ -413,6 +444,7 @@ nodes
413444
| file://:0:0:0:0 | .value | semmle.label | .value |
414445
| file://:0:0:0:0 | .value | semmle.label | .value |
415446
| file://:0:0:0:0 | .value2 | semmle.label | .value2 |
447+
| file://:0:0:0:0 | [post] self [data, Collection element] | semmle.label | [post] self [data, Collection element] |
416448
| file://:0:0:0:0 | [post] self [data] | semmle.label | [post] self [data] |
417449
| file://:0:0:0:0 | [post] self [data] | semmle.label | [post] self [data] |
418450
| file://:0:0:0:0 | [post] self [notStoredBankAccountNumber] | semmle.label | [post] self [notStoredBankAccountNumber] |
@@ -426,6 +458,7 @@ nodes
426458
| file://:0:0:0:0 | value | semmle.label | value |
427459
| file://:0:0:0:0 | value | semmle.label | value |
428460
| file://:0:0:0:0 | value | semmle.label | value |
461+
| file://:0:0:0:0 | value [Collection element] | semmle.label | value [Collection element] |
429462
| sqlite3_c_api.swift:42:69:42:69 | medicalNotes | semmle.label | medicalNotes |
430463
| sqlite3_c_api.swift:43:49:43:49 | medicalNotes | semmle.label | medicalNotes |
431464
| sqlite3_c_api.swift:46:27:46:27 | insertQuery | semmle.label | insertQuery |
@@ -716,11 +749,37 @@ nodes
716749
| testGRDB.swift:212:98:212:107 | [...] | semmle.label | [...] |
717750
| testGRDB.swift:212:98:212:107 | [...] [Collection element] | semmle.label | [...] [Collection element] |
718751
| testGRDB.swift:212:99:212:99 | password | semmle.label | password |
752+
| testRealm2.swift:13:6:13:6 | self [Return] [data, Collection element] | semmle.label | self [Return] [data, Collection element] |
719753
| testRealm2.swift:13:6:13:6 | self [Return] [data] | semmle.label | self [Return] [data] |
720754
| testRealm2.swift:13:6:13:6 | value | semmle.label | value |
755+
| testRealm2.swift:13:6:13:6 | value [Collection element] | semmle.label | value [Collection element] |
721756
| testRealm2.swift:18:2:18:2 | [post] o | semmle.label | [post] o |
722757
| testRealm2.swift:18:2:18:2 | [post] o [data] | semmle.label | [post] o [data] |
723758
| testRealm2.swift:18:11:18:11 | myPassword | semmle.label | myPassword |
759+
| testRealm2.swift:24:2:24:2 | [post] o | semmle.label | [post] o |
760+
| testRealm2.swift:24:2:24:2 | [post] o [data] | semmle.label | [post] o [data] |
761+
| testRealm2.swift:24:11:24:11 | socialSecurityNumber | semmle.label | socialSecurityNumber |
762+
| testRealm2.swift:25:2:25:2 | [post] o | semmle.label | [post] o |
763+
| testRealm2.swift:25:2:25:2 | [post] o [data] | semmle.label | [post] o [data] |
764+
| testRealm2.swift:25:11:25:11 | ssn | semmle.label | ssn |
765+
| testRealm2.swift:26:2:26:2 | [post] o | semmle.label | [post] o |
766+
| testRealm2.swift:26:2:26:2 | [post] o [data, Collection element] | semmle.label | [post] o [data, Collection element] |
767+
| testRealm2.swift:26:2:26:2 | [post] o [data] | semmle.label | [post] o [data] |
768+
| testRealm2.swift:26:11:26:25 | call to String.init(_:) | semmle.label | call to String.init(_:) |
769+
| testRealm2.swift:26:11:26:25 | call to String.init(_:) [Collection element] | semmle.label | call to String.init(_:) [Collection element] |
770+
| testRealm2.swift:26:18:26:18 | ssn_int | semmle.label | ssn_int |
771+
| testRealm2.swift:32:2:32:2 | [post] o | semmle.label | [post] o |
772+
| testRealm2.swift:32:2:32:2 | [post] o [data] | semmle.label | [post] o [data] |
773+
| testRealm2.swift:32:11:32:11 | creditCardNumber | semmle.label | creditCardNumber |
774+
| testRealm2.swift:33:2:33:2 | [post] o | semmle.label | [post] o |
775+
| testRealm2.swift:33:2:33:2 | [post] o [data] | semmle.label | [post] o [data] |
776+
| testRealm2.swift:33:11:33:11 | CCN | semmle.label | CCN |
777+
| testRealm2.swift:34:2:34:2 | [post] o | semmle.label | [post] o |
778+
| testRealm2.swift:34:2:34:2 | [post] o [data, Collection element] | semmle.label | [post] o [data, Collection element] |
779+
| testRealm2.swift:34:2:34:2 | [post] o [data] | semmle.label | [post] o [data] |
780+
| testRealm2.swift:34:11:34:25 | call to String.init(_:) | semmle.label | call to String.init(_:) |
781+
| testRealm2.swift:34:11:34:25 | call to String.init(_:) [Collection element] | semmle.label | call to String.init(_:) [Collection element] |
782+
| testRealm2.swift:34:18:34:18 | int_ccn | semmle.label | int_ccn |
724783
| testRealm.swift:27:6:27:6 | self [Return] [data] | semmle.label | self [Return] [data] |
725784
| testRealm.swift:27:6:27:6 | value | semmle.label | value |
726785
| testRealm.swift:34:6:34:6 | self [Return] [password] | semmle.label | self [Return] [password] |
@@ -756,6 +815,14 @@ subpaths
756815
| testCoreData2.swift:104:18:104:18 | e | testCoreData2.swift:70:9:70:9 | self | file://:0:0:0:0 | .value | testCoreData2.swift:104:18:104:20 | .value |
757816
| testCoreData2.swift:105:18:105:18 | e | testCoreData2.swift:71:9:71:9 | self | file://:0:0:0:0 | .value2 | testCoreData2.swift:105:18:105:20 | .value2 |
758817
| testRealm2.swift:18:11:18:11 | myPassword | testRealm2.swift:13:6:13:6 | value | testRealm2.swift:13:6:13:6 | self [Return] [data] | testRealm2.swift:18:2:18:2 | [post] o [data] |
818+
| testRealm2.swift:24:11:24:11 | socialSecurityNumber | testRealm2.swift:13:6:13:6 | value | testRealm2.swift:13:6:13:6 | self [Return] [data] | testRealm2.swift:24:2:24:2 | [post] o [data] |
819+
| testRealm2.swift:25:11:25:11 | ssn | testRealm2.swift:13:6:13:6 | value | testRealm2.swift:13:6:13:6 | self [Return] [data] | testRealm2.swift:25:2:25:2 | [post] o [data] |
820+
| testRealm2.swift:26:11:26:25 | call to String.init(_:) | testRealm2.swift:13:6:13:6 | value | testRealm2.swift:13:6:13:6 | self [Return] [data] | testRealm2.swift:26:2:26:2 | [post] o [data] |
821+
| testRealm2.swift:26:11:26:25 | call to String.init(_:) [Collection element] | testRealm2.swift:13:6:13:6 | value [Collection element] | testRealm2.swift:13:6:13:6 | self [Return] [data, Collection element] | testRealm2.swift:26:2:26:2 | [post] o [data, Collection element] |
822+
| testRealm2.swift:32:11:32:11 | creditCardNumber | testRealm2.swift:13:6:13:6 | value | testRealm2.swift:13:6:13:6 | self [Return] [data] | testRealm2.swift:32:2:32:2 | [post] o [data] |
823+
| testRealm2.swift:33:11:33:11 | CCN | testRealm2.swift:13:6:13:6 | value | testRealm2.swift:13:6:13:6 | self [Return] [data] | testRealm2.swift:33:2:33:2 | [post] o [data] |
824+
| testRealm2.swift:34:11:34:25 | call to String.init(_:) | testRealm2.swift:13:6:13:6 | value | testRealm2.swift:13:6:13:6 | self [Return] [data] | testRealm2.swift:34:2:34:2 | [post] o [data] |
825+
| testRealm2.swift:34:11:34:25 | call to String.init(_:) [Collection element] | testRealm2.swift:13:6:13:6 | value [Collection element] | testRealm2.swift:13:6:13:6 | self [Return] [data, Collection element] | testRealm2.swift:34:2:34:2 | [post] o [data, Collection element] |
759826
| testRealm.swift:41:11:41:11 | myPassword | testRealm.swift:27:6:27:6 | value | testRealm.swift:27:6:27:6 | self [Return] [data] | testRealm.swift:41:2:41:2 | [post] a [data] |
760827
| testRealm.swift:49:11:49:11 | myPassword | testRealm.swift:27:6:27:6 | value | testRealm.swift:27:6:27:6 | self [Return] [data] | testRealm.swift:49:2:49:2 | [post] c [data] |
761828
| testRealm.swift:59:12:59:12 | myPassword | testRealm.swift:27:6:27:6 | value | testRealm.swift:27:6:27:6 | self [Return] [data] | testRealm.swift:59:2:59:3 | [post] ...! [data] |
@@ -890,6 +957,12 @@ subpaths
890957
| testGRDB.swift:210:84:210:93 | [...] | testGRDB.swift:210:85:210:85 | password | testGRDB.swift:210:84:210:93 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:210:85:210:85 | password | password |
891958
| testGRDB.swift:212:98:212:107 | [...] | testGRDB.swift:212:99:212:99 | password | testGRDB.swift:212:98:212:107 | [...] | This operation stores '[...]' in a database. It may contain unencrypted sensitive data from $@. | testGRDB.swift:212:99:212:99 | password | password |
892959
| testRealm2.swift:18:2:18:2 | o | testRealm2.swift:18:11:18:11 | myPassword | testRealm2.swift:18:2:18:2 | [post] o | This operation stores 'o' in a database. It may contain unencrypted sensitive data from $@. | testRealm2.swift:18:11:18:11 | myPassword | myPassword |
960+
| testRealm2.swift:24:2:24:2 | o | testRealm2.swift:24:11:24:11 | socialSecurityNumber | testRealm2.swift:24:2:24:2 | [post] o | This operation stores 'o' in a database. It may contain unencrypted sensitive data from $@. | testRealm2.swift:24:11:24:11 | socialSecurityNumber | socialSecurityNumber |
961+
| testRealm2.swift:25:2:25:2 | o | testRealm2.swift:25:11:25:11 | ssn | testRealm2.swift:25:2:25:2 | [post] o | This operation stores 'o' in a database. It may contain unencrypted sensitive data from $@. | testRealm2.swift:25:11:25:11 | ssn | ssn |
962+
| testRealm2.swift:26:2:26:2 | o | testRealm2.swift:26:18:26:18 | ssn_int | testRealm2.swift:26:2:26:2 | [post] o | This operation stores 'o' in a database. It may contain unencrypted sensitive data from $@. | testRealm2.swift:26:18:26:18 | ssn_int | ssn_int |
963+
| testRealm2.swift:32:2:32:2 | o | testRealm2.swift:32:11:32:11 | creditCardNumber | testRealm2.swift:32:2:32:2 | [post] o | This operation stores 'o' in a database. It may contain unencrypted sensitive data from $@. | testRealm2.swift:32:11:32:11 | creditCardNumber | creditCardNumber |
964+
| testRealm2.swift:33:2:33:2 | o | testRealm2.swift:33:11:33:11 | CCN | testRealm2.swift:33:2:33:2 | [post] o | This operation stores 'o' in a database. It may contain unencrypted sensitive data from $@. | testRealm2.swift:33:11:33:11 | CCN | CCN |
965+
| testRealm2.swift:34:2:34:2 | o | testRealm2.swift:34:18:34:18 | int_ccn | testRealm2.swift:34:2:34:2 | [post] o | This operation stores 'o' in a database. It may contain unencrypted sensitive data from $@. | testRealm2.swift:34:18:34:18 | int_ccn | int_ccn |
893966
| testRealm.swift:41:2:41:2 | a | testRealm.swift:41:11:41:11 | myPassword | testRealm.swift:41:2:41:2 | [post] a | This operation stores 'a' in a database. It may contain unencrypted sensitive data from $@. | testRealm.swift:41:11:41:11 | myPassword | myPassword |
894967
| testRealm.swift:49:2:49:2 | c | testRealm.swift:49:11:49:11 | myPassword | testRealm.swift:49:2:49:2 | [post] c | This operation stores 'c' in a database. It may contain unencrypted sensitive data from $@. | testRealm.swift:49:11:49:11 | myPassword | myPassword |
895968
| testRealm.swift:59:2:59:3 | ...! | testRealm.swift:59:12:59:12 | myPassword | testRealm.swift:59:2:59:3 | [post] ...! | This operation stores '...!' in a database. It may contain unencrypted sensitive data from $@. | testRealm.swift:59:12:59:12 | myPassword | myPassword |

swift/ql/test/query-tests/Security/CWE-311/SensitiveExprs.expected

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,12 @@
141141
| testGRDB.swift:210:85:210:85 | password | label:password, type:password |
142142
| testGRDB.swift:212:99:212:99 | password | label:password, type:password |
143143
| testRealm2.swift:18:11:18:11 | myPassword | label:myPassword, type:password |
144+
| testRealm2.swift:24:11:24:11 | socialSecurityNumber | label:socialSecurityNumber, type:private information |
145+
| testRealm2.swift:25:11:25:11 | ssn | label:ssn, type:private information |
146+
| testRealm2.swift:26:18:26:18 | ssn_int | label:ssn_int, type:private information |
147+
| testRealm2.swift:32:11:32:11 | creditCardNumber | label:creditCardNumber, type:private information |
148+
| testRealm2.swift:33:11:33:11 | CCN | label:CCN, type:private information |
149+
| testRealm2.swift:34:18:34:18 | int_ccn | label:int_ccn, type:private information |
144150
| testRealm.swift:31:20:31:20 | .password | label:password, type:password |
145151
| testRealm.swift:41:11:41:11 | myPassword | label:myPassword, type:password |
146152
| testRealm.swift:49:11:49:11 | myPassword | label:myPassword, type:password |

0 commit comments

Comments
 (0)