react-native-nitro-storage 0.1.4 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +432 -345
- package/android/src/main/cpp/AndroidStorageAdapterCpp.cpp +191 -3
- package/android/src/main/cpp/AndroidStorageAdapterCpp.hpp +21 -41
- package/android/src/main/java/com/nitrostorage/AndroidStorageAdapter.kt +181 -29
- package/android/src/main/java/com/nitrostorage/NitroStoragePackage.kt +2 -2
- package/app.plugin.js +9 -7
- package/cpp/bindings/HybridStorage.cpp +239 -10
- package/cpp/bindings/HybridStorage.hpp +10 -0
- package/cpp/core/NativeStorageAdapter.hpp +22 -0
- package/ios/IOSStorageAdapterCpp.hpp +25 -0
- package/ios/IOSStorageAdapterCpp.mm +315 -33
- package/lib/commonjs/Storage.types.js +23 -1
- package/lib/commonjs/Storage.types.js.map +1 -1
- package/lib/commonjs/index.js +680 -68
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.web.js +801 -133
- package/lib/commonjs/index.web.js.map +1 -1
- package/lib/commonjs/internal.js +112 -0
- package/lib/commonjs/internal.js.map +1 -0
- package/lib/module/Storage.types.js +22 -0
- package/lib/module/Storage.types.js.map +1 -1
- package/lib/module/index.js +660 -71
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +766 -125
- package/lib/module/index.web.js.map +1 -1
- package/lib/module/internal.js +100 -0
- package/lib/module/internal.js.map +1 -0
- package/lib/typescript/Storage.nitro.d.ts +10 -0
- package/lib/typescript/Storage.nitro.d.ts.map +1 -1
- package/lib/typescript/Storage.types.d.ts +20 -0
- package/lib/typescript/Storage.types.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +68 -9
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/index.web.d.ts +79 -13
- package/lib/typescript/index.web.d.ts.map +1 -1
- package/lib/typescript/internal.d.ts +21 -0
- package/lib/typescript/internal.d.ts.map +1 -0
- package/lib/typescript/migration.d.ts +2 -3
- package/lib/typescript/migration.d.ts.map +1 -1
- package/nitrogen/generated/shared/c++/HybridStorageSpec.cpp +10 -0
- package/nitrogen/generated/shared/c++/HybridStorageSpec.hpp +10 -0
- package/package.json +22 -8
- package/src/Storage.nitro.ts +11 -2
- package/src/Storage.types.ts +22 -0
- package/src/index.ts +943 -84
- package/src/index.web.ts +1082 -137
- package/src/internal.ts +144 -0
- package/src/migration.ts +3 -3
|
@@ -10,6 +10,10 @@
|
|
|
10
10
|
|
|
11
11
|
namespace margelo::nitro::NitroStorage {
|
|
12
12
|
|
|
13
|
+
namespace {
|
|
14
|
+
constexpr auto kBatchMissingSentinel = "__nitro_storage_batch_missing__::v1";
|
|
15
|
+
} // namespace
|
|
16
|
+
|
|
13
17
|
HybridStorage::HybridStorage()
|
|
14
18
|
: HybridObject(TAG), HybridStorageSpec() {
|
|
15
19
|
#if __APPLE__
|
|
@@ -139,6 +143,65 @@ void HybridStorage::remove(const std::string& key, double scope) {
|
|
|
139
143
|
notifyListeners(static_cast<int>(s), key, std::nullopt);
|
|
140
144
|
}
|
|
141
145
|
|
|
146
|
+
bool HybridStorage::has(const std::string& key, double scope) {
|
|
147
|
+
Scope s = toScope(scope);
|
|
148
|
+
|
|
149
|
+
switch (s) {
|
|
150
|
+
case Scope::Memory: {
|
|
151
|
+
std::lock_guard<std::mutex> lock(memoryMutex_);
|
|
152
|
+
return memoryStore_.find(key) != memoryStore_.end();
|
|
153
|
+
}
|
|
154
|
+
case Scope::Disk:
|
|
155
|
+
ensureAdapter();
|
|
156
|
+
return nativeAdapter_->hasDisk(key);
|
|
157
|
+
case Scope::Secure:
|
|
158
|
+
ensureAdapter();
|
|
159
|
+
return nativeAdapter_->hasSecure(key);
|
|
160
|
+
}
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
std::vector<std::string> HybridStorage::getAllKeys(double scope) {
|
|
165
|
+
Scope s = toScope(scope);
|
|
166
|
+
|
|
167
|
+
switch (s) {
|
|
168
|
+
case Scope::Memory: {
|
|
169
|
+
std::lock_guard<std::mutex> lock(memoryMutex_);
|
|
170
|
+
std::vector<std::string> keys;
|
|
171
|
+
keys.reserve(memoryStore_.size());
|
|
172
|
+
for (const auto& pair : memoryStore_) {
|
|
173
|
+
keys.push_back(pair.first);
|
|
174
|
+
}
|
|
175
|
+
return keys;
|
|
176
|
+
}
|
|
177
|
+
case Scope::Disk:
|
|
178
|
+
ensureAdapter();
|
|
179
|
+
return nativeAdapter_->getAllKeysDisk();
|
|
180
|
+
case Scope::Secure:
|
|
181
|
+
ensureAdapter();
|
|
182
|
+
return nativeAdapter_->getAllKeysSecure();
|
|
183
|
+
}
|
|
184
|
+
return {};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
double HybridStorage::size(double scope) {
|
|
188
|
+
Scope s = toScope(scope);
|
|
189
|
+
|
|
190
|
+
switch (s) {
|
|
191
|
+
case Scope::Memory: {
|
|
192
|
+
std::lock_guard<std::mutex> lock(memoryMutex_);
|
|
193
|
+
return static_cast<double>(memoryStore_.size());
|
|
194
|
+
}
|
|
195
|
+
case Scope::Disk:
|
|
196
|
+
ensureAdapter();
|
|
197
|
+
return static_cast<double>(nativeAdapter_->sizeDisk());
|
|
198
|
+
case Scope::Secure:
|
|
199
|
+
ensureAdapter();
|
|
200
|
+
return static_cast<double>(nativeAdapter_->sizeSecure());
|
|
201
|
+
}
|
|
202
|
+
return 0.0;
|
|
203
|
+
}
|
|
204
|
+
|
|
142
205
|
std::function<void()> HybridStorage::addOnChange(
|
|
143
206
|
double scope,
|
|
144
207
|
const std::function<void(const std::string&, const std::optional<std::string>&)>& callback
|
|
@@ -202,32 +265,198 @@ void HybridStorage::setBatch(const std::vector<std::string>& keys, const std::ve
|
|
|
202
265
|
if (keys.size() != values.size()) {
|
|
203
266
|
throw std::runtime_error("NitroStorage: Keys and values size mismatch in setBatch");
|
|
204
267
|
}
|
|
205
|
-
|
|
268
|
+
|
|
269
|
+
Scope s = toScope(scope);
|
|
270
|
+
|
|
271
|
+
switch (s) {
|
|
272
|
+
case Scope::Memory: {
|
|
273
|
+
std::lock_guard<std::mutex> lock(memoryMutex_);
|
|
274
|
+
for (size_t i = 0; i < keys.size(); ++i) {
|
|
275
|
+
memoryStore_[keys[i]] = values[i];
|
|
276
|
+
}
|
|
277
|
+
break;
|
|
278
|
+
}
|
|
279
|
+
case Scope::Disk:
|
|
280
|
+
ensureAdapter();
|
|
281
|
+
try {
|
|
282
|
+
nativeAdapter_->setDiskBatch(keys, values);
|
|
283
|
+
} catch (const std::exception& e) {
|
|
284
|
+
throw std::runtime_error(std::string("NitroStorage: Disk setBatch failed: ") + e.what());
|
|
285
|
+
} catch (...) {
|
|
286
|
+
throw std::runtime_error("NitroStorage: Disk setBatch failed");
|
|
287
|
+
}
|
|
288
|
+
break;
|
|
289
|
+
case Scope::Secure:
|
|
290
|
+
ensureAdapter();
|
|
291
|
+
try {
|
|
292
|
+
nativeAdapter_->setSecureBatch(keys, values);
|
|
293
|
+
} catch (const std::exception& e) {
|
|
294
|
+
throw std::runtime_error(std::string("NitroStorage: Secure setBatch failed: ") + e.what());
|
|
295
|
+
} catch (...) {
|
|
296
|
+
throw std::runtime_error("NitroStorage: Secure setBatch failed");
|
|
297
|
+
}
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
|
|
206
301
|
for (size_t i = 0; i < keys.size(); ++i) {
|
|
207
|
-
|
|
302
|
+
notifyListeners(static_cast<int>(s), keys[i], values[i]);
|
|
208
303
|
}
|
|
209
304
|
}
|
|
210
305
|
|
|
211
|
-
|
|
212
306
|
std::vector<std::string> HybridStorage::getBatch(const std::vector<std::string>& keys, double scope) {
|
|
213
307
|
std::vector<std::string> results;
|
|
214
308
|
results.reserve(keys.size());
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
309
|
+
|
|
310
|
+
Scope s = toScope(scope);
|
|
311
|
+
|
|
312
|
+
switch (s) {
|
|
313
|
+
case Scope::Memory: {
|
|
314
|
+
std::lock_guard<std::mutex> lock(memoryMutex_);
|
|
315
|
+
for (const auto& key : keys) {
|
|
316
|
+
auto it = memoryStore_.find(key);
|
|
317
|
+
if (it != memoryStore_.end()) {
|
|
318
|
+
results.push_back(it->second);
|
|
319
|
+
} else {
|
|
320
|
+
results.push_back(kBatchMissingSentinel);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
return results;
|
|
324
|
+
}
|
|
325
|
+
case Scope::Disk: {
|
|
326
|
+
ensureAdapter();
|
|
327
|
+
std::vector<std::optional<std::string>> values;
|
|
328
|
+
try {
|
|
329
|
+
values = nativeAdapter_->getDiskBatch(keys);
|
|
330
|
+
} catch (const std::exception& e) {
|
|
331
|
+
throw std::runtime_error(std::string("NitroStorage: Disk getBatch failed: ") + e.what());
|
|
332
|
+
} catch (...) {
|
|
333
|
+
throw std::runtime_error("NitroStorage: Disk getBatch failed");
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
for (const auto& value : values) {
|
|
337
|
+
results.push_back(value.has_value() ? *value : std::string(kBatchMissingSentinel));
|
|
338
|
+
}
|
|
339
|
+
return results;
|
|
340
|
+
}
|
|
341
|
+
case Scope::Secure: {
|
|
342
|
+
ensureAdapter();
|
|
343
|
+
std::vector<std::optional<std::string>> values;
|
|
344
|
+
try {
|
|
345
|
+
values = nativeAdapter_->getSecureBatch(keys);
|
|
346
|
+
} catch (const std::exception& e) {
|
|
347
|
+
throw std::runtime_error(std::string("NitroStorage: Secure getBatch failed: ") + e.what());
|
|
348
|
+
} catch (...) {
|
|
349
|
+
throw std::runtime_error("NitroStorage: Secure getBatch failed");
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
for (const auto& value : values) {
|
|
353
|
+
results.push_back(value.has_value() ? *value : std::string(kBatchMissingSentinel));
|
|
354
|
+
}
|
|
355
|
+
return results;
|
|
356
|
+
}
|
|
219
357
|
}
|
|
220
|
-
|
|
358
|
+
|
|
221
359
|
return results;
|
|
222
360
|
}
|
|
223
361
|
|
|
224
|
-
|
|
225
362
|
void HybridStorage::removeBatch(const std::vector<std::string>& keys, double scope) {
|
|
363
|
+
Scope s = toScope(scope);
|
|
364
|
+
|
|
365
|
+
switch (s) {
|
|
366
|
+
case Scope::Memory: {
|
|
367
|
+
std::lock_guard<std::mutex> lock(memoryMutex_);
|
|
368
|
+
for (const auto& key : keys) {
|
|
369
|
+
memoryStore_.erase(key);
|
|
370
|
+
}
|
|
371
|
+
break;
|
|
372
|
+
}
|
|
373
|
+
case Scope::Disk:
|
|
374
|
+
ensureAdapter();
|
|
375
|
+
try {
|
|
376
|
+
nativeAdapter_->deleteDiskBatch(keys);
|
|
377
|
+
} catch (const std::exception& e) {
|
|
378
|
+
throw std::runtime_error(std::string("NitroStorage: Disk removeBatch failed: ") + e.what());
|
|
379
|
+
} catch (...) {
|
|
380
|
+
throw std::runtime_error("NitroStorage: Disk removeBatch failed");
|
|
381
|
+
}
|
|
382
|
+
break;
|
|
383
|
+
case Scope::Secure:
|
|
384
|
+
ensureAdapter();
|
|
385
|
+
try {
|
|
386
|
+
nativeAdapter_->deleteSecureBatch(keys);
|
|
387
|
+
} catch (const std::exception& e) {
|
|
388
|
+
throw std::runtime_error(std::string("NitroStorage: Secure removeBatch failed: ") + e.what());
|
|
389
|
+
} catch (...) {
|
|
390
|
+
throw std::runtime_error("NitroStorage: Secure removeBatch failed");
|
|
391
|
+
}
|
|
392
|
+
break;
|
|
393
|
+
}
|
|
394
|
+
|
|
226
395
|
for (const auto& key : keys) {
|
|
227
|
-
|
|
396
|
+
notifyListeners(static_cast<int>(s), key, std::nullopt);
|
|
228
397
|
}
|
|
229
398
|
}
|
|
230
399
|
|
|
400
|
+
// --- Configuration ---
|
|
401
|
+
|
|
402
|
+
void HybridStorage::setSecureAccessControl(double level) {
|
|
403
|
+
ensureAdapter();
|
|
404
|
+
nativeAdapter_->setSecureAccessControl(static_cast<int>(level));
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
void HybridStorage::setKeychainAccessGroup(const std::string& group) {
|
|
408
|
+
ensureAdapter();
|
|
409
|
+
nativeAdapter_->setKeychainAccessGroup(group);
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
// --- Biometric ---
|
|
413
|
+
|
|
414
|
+
void HybridStorage::setSecureBiometric(const std::string& key, const std::string& value) {
|
|
415
|
+
ensureAdapter();
|
|
416
|
+
try {
|
|
417
|
+
nativeAdapter_->setSecureBiometric(key, value);
|
|
418
|
+
notifyListeners(static_cast<int>(Scope::Secure), key, value);
|
|
419
|
+
} catch (const std::exception& e) {
|
|
420
|
+
throw std::runtime_error(std::string("NitroStorage: Biometric set failed: ") + e.what());
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
std::optional<std::string> HybridStorage::getSecureBiometric(const std::string& key) {
|
|
425
|
+
ensureAdapter();
|
|
426
|
+
try {
|
|
427
|
+
return nativeAdapter_->getSecureBiometric(key);
|
|
428
|
+
} catch (const std::exception& e) {
|
|
429
|
+
throw std::runtime_error(std::string("NitroStorage: Biometric get failed: ") + e.what());
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
void HybridStorage::deleteSecureBiometric(const std::string& key) {
|
|
434
|
+
ensureAdapter();
|
|
435
|
+
try {
|
|
436
|
+
nativeAdapter_->deleteSecureBiometric(key);
|
|
437
|
+
notifyListeners(static_cast<int>(Scope::Secure), key, std::nullopt);
|
|
438
|
+
} catch (const std::exception& e) {
|
|
439
|
+
throw std::runtime_error(std::string("NitroStorage: Biometric delete failed: ") + e.what());
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
bool HybridStorage::hasSecureBiometric(const std::string& key) {
|
|
444
|
+
ensureAdapter();
|
|
445
|
+
return nativeAdapter_->hasSecureBiometric(key);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
void HybridStorage::clearSecureBiometric() {
|
|
449
|
+
ensureAdapter();
|
|
450
|
+
try {
|
|
451
|
+
nativeAdapter_->clearSecureBiometric();
|
|
452
|
+
notifyListeners(static_cast<int>(Scope::Secure), "", std::nullopt);
|
|
453
|
+
} catch (const std::exception& e) {
|
|
454
|
+
throw std::runtime_error(std::string("NitroStorage: Biometric clear failed: ") + e.what());
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// --- Internal ---
|
|
459
|
+
|
|
231
460
|
void HybridStorage::notifyListeners(
|
|
232
461
|
int scope,
|
|
233
462
|
const std::string& key,
|
|
@@ -20,6 +20,9 @@ public:
|
|
|
20
20
|
std::optional<std::string> get(const std::string& key, double scope) override;
|
|
21
21
|
void remove(const std::string& key, double scope) override;
|
|
22
22
|
void clear(double scope) override;
|
|
23
|
+
bool has(const std::string& key, double scope) override;
|
|
24
|
+
std::vector<std::string> getAllKeys(double scope) override;
|
|
25
|
+
double size(double scope) override;
|
|
23
26
|
void setBatch(const std::vector<std::string>& keys, const std::vector<std::string>& values, double scope) override;
|
|
24
27
|
std::vector<std::string> getBatch(const std::vector<std::string>& keys, double scope) override;
|
|
25
28
|
void removeBatch(const std::vector<std::string>& keys, double scope) override;
|
|
@@ -27,6 +30,13 @@ public:
|
|
|
27
30
|
double scope,
|
|
28
31
|
const std::function<void(const std::string&, const std::optional<std::string>&)>& callback
|
|
29
32
|
) override;
|
|
33
|
+
void setSecureAccessControl(double level) override;
|
|
34
|
+
void setKeychainAccessGroup(const std::string& group) override;
|
|
35
|
+
void setSecureBiometric(const std::string& key, const std::string& value) override;
|
|
36
|
+
std::optional<std::string> getSecureBiometric(const std::string& key) override;
|
|
37
|
+
void deleteSecureBiometric(const std::string& key) override;
|
|
38
|
+
bool hasSecureBiometric(const std::string& key) override;
|
|
39
|
+
void clearSecureBiometric() override;
|
|
30
40
|
|
|
31
41
|
private:
|
|
32
42
|
enum class Scope {
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
#include <string>
|
|
4
4
|
#include <optional>
|
|
5
|
+
#include <vector>
|
|
5
6
|
|
|
6
7
|
namespace NitroStorage {
|
|
7
8
|
|
|
@@ -12,13 +13,34 @@ public:
|
|
|
12
13
|
virtual void setDisk(const std::string& key, const std::string& value) = 0;
|
|
13
14
|
virtual std::optional<std::string> getDisk(const std::string& key) = 0;
|
|
14
15
|
virtual void deleteDisk(const std::string& key) = 0;
|
|
16
|
+
virtual bool hasDisk(const std::string& key) = 0;
|
|
17
|
+
virtual std::vector<std::string> getAllKeysDisk() = 0;
|
|
18
|
+
virtual size_t sizeDisk() = 0;
|
|
19
|
+
virtual void setDiskBatch(const std::vector<std::string>& keys, const std::vector<std::string>& values) = 0;
|
|
20
|
+
virtual std::vector<std::optional<std::string>> getDiskBatch(const std::vector<std::string>& keys) = 0;
|
|
21
|
+
virtual void deleteDiskBatch(const std::vector<std::string>& keys) = 0;
|
|
15
22
|
|
|
16
23
|
virtual void setSecure(const std::string& key, const std::string& value) = 0;
|
|
17
24
|
virtual std::optional<std::string> getSecure(const std::string& key) = 0;
|
|
18
25
|
virtual void deleteSecure(const std::string& key) = 0;
|
|
26
|
+
virtual bool hasSecure(const std::string& key) = 0;
|
|
27
|
+
virtual std::vector<std::string> getAllKeysSecure() = 0;
|
|
28
|
+
virtual size_t sizeSecure() = 0;
|
|
29
|
+
virtual void setSecureBatch(const std::vector<std::string>& keys, const std::vector<std::string>& values) = 0;
|
|
30
|
+
virtual std::vector<std::optional<std::string>> getSecureBatch(const std::vector<std::string>& keys) = 0;
|
|
31
|
+
virtual void deleteSecureBatch(const std::vector<std::string>& keys) = 0;
|
|
19
32
|
|
|
20
33
|
virtual void clearDisk() = 0;
|
|
21
34
|
virtual void clearSecure() = 0;
|
|
35
|
+
|
|
36
|
+
virtual void setSecureAccessControl(int level) = 0;
|
|
37
|
+
virtual void setKeychainAccessGroup(const std::string& group) = 0;
|
|
38
|
+
|
|
39
|
+
virtual void setSecureBiometric(const std::string& key, const std::string& value) = 0;
|
|
40
|
+
virtual std::optional<std::string> getSecureBiometric(const std::string& key) = 0;
|
|
41
|
+
virtual void deleteSecureBiometric(const std::string& key) = 0;
|
|
42
|
+
virtual bool hasSecureBiometric(const std::string& key) = 0;
|
|
43
|
+
virtual void clearSecureBiometric() = 0;
|
|
22
44
|
};
|
|
23
45
|
|
|
24
46
|
} // namespace NitroStorage
|
|
@@ -12,13 +12,38 @@ public:
|
|
|
12
12
|
void setDisk(const std::string& key, const std::string& value) override;
|
|
13
13
|
std::optional<std::string> getDisk(const std::string& key) override;
|
|
14
14
|
void deleteDisk(const std::string& key) override;
|
|
15
|
+
bool hasDisk(const std::string& key) override;
|
|
16
|
+
std::vector<std::string> getAllKeysDisk() override;
|
|
17
|
+
size_t sizeDisk() override;
|
|
18
|
+
void setDiskBatch(const std::vector<std::string>& keys, const std::vector<std::string>& values) override;
|
|
19
|
+
std::vector<std::optional<std::string>> getDiskBatch(const std::vector<std::string>& keys) override;
|
|
20
|
+
void deleteDiskBatch(const std::vector<std::string>& keys) override;
|
|
15
21
|
|
|
16
22
|
void setSecure(const std::string& key, const std::string& value) override;
|
|
17
23
|
std::optional<std::string> getSecure(const std::string& key) override;
|
|
18
24
|
void deleteSecure(const std::string& key) override;
|
|
25
|
+
bool hasSecure(const std::string& key) override;
|
|
26
|
+
std::vector<std::string> getAllKeysSecure() override;
|
|
27
|
+
size_t sizeSecure() override;
|
|
28
|
+
void setSecureBatch(const std::vector<std::string>& keys, const std::vector<std::string>& values) override;
|
|
29
|
+
std::vector<std::optional<std::string>> getSecureBatch(const std::vector<std::string>& keys) override;
|
|
30
|
+
void deleteSecureBatch(const std::vector<std::string>& keys) override;
|
|
19
31
|
|
|
20
32
|
void clearDisk() override;
|
|
21
33
|
void clearSecure() override;
|
|
34
|
+
|
|
35
|
+
void setSecureAccessControl(int level) override;
|
|
36
|
+
void setKeychainAccessGroup(const std::string& group) override;
|
|
37
|
+
|
|
38
|
+
void setSecureBiometric(const std::string& key, const std::string& value) override;
|
|
39
|
+
std::optional<std::string> getSecureBiometric(const std::string& key) override;
|
|
40
|
+
void deleteSecureBiometric(const std::string& key) override;
|
|
41
|
+
bool hasSecureBiometric(const std::string& key) override;
|
|
42
|
+
void clearSecureBiometric() override;
|
|
43
|
+
|
|
44
|
+
private:
|
|
45
|
+
int accessControlLevel_ = 0;
|
|
46
|
+
std::string keychainAccessGroup_;
|
|
22
47
|
};
|
|
23
48
|
|
|
24
49
|
} // namespace NitroStorage
|