|
13 | 13 |
|
14 | 14 | /***** HELPER FUNCTIONS *****/
|
15 | 15 |
|
| 16 | +NSURL *URLForDirectory(NSSearchPathDirectory directory) { |
| 17 | + NSFileManager *fm = [NSFileManager defaultManager]; |
| 18 | + return [fm URLForDirectory:directory |
| 19 | + inDomain:NSUserDomainMask |
| 20 | + appropriateForURL:nil |
| 21 | + create:false |
| 22 | + error:nil]; |
| 23 | +} |
| 24 | + |
16 | 25 | // Dummy value to pass into function parameter for ThreadSafeFunction.
|
17 | 26 | Napi::Value NoOp(const Napi::CallbackInfo &info) {
|
18 | 27 | return info.Env().Undefined();
|
@@ -316,6 +325,34 @@ bool HasOpenSystemPreferencesDialog() {
|
316 | 325 | return Napi::Value::From(env, auth_status);
|
317 | 326 | }
|
318 | 327 |
|
| 328 | +// Request access to various protected folders on the system. |
| 329 | +Napi::Promise AskForFoldersAccess(const Napi::CallbackInfo &info) { |
| 330 | + Napi::Env env = info.Env(); |
| 331 | + Napi::Promise::Deferred deferred = Napi::Promise::Deferred::New(env); |
| 332 | + const std::string folder_name = info[0].As<Napi::String>().Utf8Value(); |
| 333 | + |
| 334 | + NSString *path = @""; |
| 335 | + if (folder_name == "documents") { |
| 336 | + NSURL *url = URLForDirectory(NSDocumentDirectory); |
| 337 | + path = [url path]; |
| 338 | + } else if (folder_name == "downloads") { |
| 339 | + NSURL *url = URLForDirectory(NSDownloadsDirectory); |
| 340 | + path = [url path]; |
| 341 | + } else if (folder_name == "desktop") { |
| 342 | + NSURL *url = URLForDirectory(NSDesktopDirectory); |
| 343 | + path = [url path]; |
| 344 | + } |
| 345 | + |
| 346 | + NSError *error = nil; |
| 347 | + NSFileManager *fm = [NSFileManager defaultManager]; |
| 348 | + NSArray<NSString *> *contents __unused = |
| 349 | + [fm contentsOfDirectoryAtPath:path error:&error]; |
| 350 | + |
| 351 | + std::string status = (error) ? "denied" : "authorized"; |
| 352 | + deferred.Resolve(Napi::String::New(env, status)); |
| 353 | + return deferred.Promise(); |
| 354 | +} |
| 355 | + |
319 | 356 | // Request Contacts access.
|
320 | 357 | Napi::Promise AskForContactsAccess(const Napi::CallbackInfo &info) {
|
321 | 358 | Napi::Env env = info.Env();
|
@@ -627,6 +664,8 @@ void AskForAccessibilityAccess(const Napi::CallbackInfo &info) {
|
627 | 664 | Napi::Function::New(env, AskForCalendarAccess));
|
628 | 665 | exports.Set(Napi::String::New(env, "askForRemindersAccess"),
|
629 | 666 | Napi::Function::New(env, AskForRemindersAccess));
|
| 667 | + exports.Set(Napi::String::New(env, "askForFoldersAccess"), |
| 668 | + Napi::Function::New(env, AskForFoldersAccess)); |
630 | 669 | exports.Set(Napi::String::New(env, "askForFullDiskAccess"),
|
631 | 670 | Napi::Function::New(env, AskForFullDiskAccess));
|
632 | 671 | exports.Set(Napi::String::New(env, "askForCameraAccess"),
|
|
0 commit comments