@azure/msal-node-extensions 1.0.0-alpha.9 → 1.0.0-beta.0

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.
Files changed (117) hide show
  1. package/README.md +174 -8
  2. package/bin/arm64/dpapi.node +0 -0
  3. package/bin/ia32/dpapi.node +0 -0
  4. package/bin/x64/dpapi.node +0 -0
  5. package/dist/{dpapi-addon/Dpapi.d.ts → Dpapi.d.ts} +4 -4
  6. package/dist/Dpapi.esm.js +24 -0
  7. package/dist/Dpapi.esm.js.map +1 -0
  8. package/dist/Dpapi.js +24 -0
  9. package/dist/Dpapi.js.map +1 -0
  10. package/dist/broker/NativeBrokerPlugin.d.ts +20 -0
  11. package/dist/broker/NativeBrokerPlugin.esm.js +408 -0
  12. package/dist/broker/NativeBrokerPlugin.esm.js.map +1 -0
  13. package/dist/broker/NativeBrokerPlugin.js +410 -0
  14. package/dist/broker/NativeBrokerPlugin.js.map +1 -0
  15. package/dist/error/NativeAuthError.d.ts +6 -0
  16. package/dist/error/NativeAuthError.esm.js +20 -0
  17. package/dist/error/NativeAuthError.esm.js.map +1 -0
  18. package/dist/error/NativeAuthError.js +22 -0
  19. package/dist/error/NativeAuthError.js.map +1 -0
  20. package/dist/error/PersistenceError.esm.js +89 -0
  21. package/dist/error/PersistenceError.esm.js.map +1 -0
  22. package/{src/error/PersistenceError.ts → dist/error/PersistenceError.js} +23 -33
  23. package/dist/error/PersistenceError.js.map +1 -0
  24. package/dist/index.d.ts +1 -0
  25. package/dist/index.esm.js +12 -0
  26. package/dist/index.esm.js.map +1 -0
  27. package/dist/index.js +24 -6
  28. package/dist/index.js.map +1 -0
  29. package/dist/lock/CrossPlatformLock.esm.js +94 -0
  30. package/dist/lock/CrossPlatformLock.esm.js.map +1 -0
  31. package/dist/lock/CrossPlatformLock.js +96 -0
  32. package/dist/lock/CrossPlatformLock.js.map +1 -0
  33. package/dist/lock/CrossPlatformLockOptions.d.ts +1 -1
  34. package/dist/packageMetadata.d.ts +2 -0
  35. package/dist/packageMetadata.esm.js +8 -0
  36. package/dist/packageMetadata.esm.js.map +1 -0
  37. package/dist/packageMetadata.js +11 -0
  38. package/dist/packageMetadata.js.map +1 -0
  39. package/{src/persistence/BasePersistence.ts → dist/persistence/BasePersistence.esm.js} +18 -23
  40. package/dist/persistence/BasePersistence.esm.js.map +1 -0
  41. package/dist/persistence/BasePersistence.js +38 -0
  42. package/dist/persistence/BasePersistence.js.map +1 -0
  43. package/dist/persistence/DataProtectionScope.d.ts +5 -4
  44. package/{src/persistence/DataProtectionScope.ts → dist/persistence/DataProtectionScope.esm.js} +9 -5
  45. package/dist/persistence/DataProtectionScope.esm.js.map +1 -0
  46. package/dist/persistence/DataProtectionScope.js +26 -0
  47. package/dist/persistence/DataProtectionScope.js.map +1 -0
  48. package/dist/persistence/FilePersistence.d.ts +1 -0
  49. package/dist/persistence/FilePersistence.esm.js +173 -0
  50. package/dist/persistence/FilePersistence.esm.js.map +1 -0
  51. package/dist/persistence/FilePersistence.js +175 -0
  52. package/dist/persistence/FilePersistence.js.map +1 -0
  53. package/dist/persistence/FilePersistenceWithDataProtection.esm.js +84 -0
  54. package/dist/persistence/FilePersistenceWithDataProtection.esm.js.map +1 -0
  55. package/dist/persistence/FilePersistenceWithDataProtection.js +86 -0
  56. package/dist/persistence/FilePersistenceWithDataProtection.js.map +1 -0
  57. package/dist/persistence/IPersistenceConfiguration.d.ts +2 -0
  58. package/dist/persistence/KeychainPersistence.d.ts +2 -2
  59. package/dist/persistence/KeychainPersistence.esm.js +90 -0
  60. package/dist/persistence/KeychainPersistence.esm.js.map +1 -0
  61. package/dist/persistence/KeychainPersistence.js +92 -0
  62. package/dist/persistence/KeychainPersistence.js.map +1 -0
  63. package/dist/persistence/LibSecretPersistence.d.ts +2 -2
  64. package/dist/persistence/LibSecretPersistence.esm.js +91 -0
  65. package/dist/persistence/LibSecretPersistence.esm.js.map +1 -0
  66. package/dist/persistence/LibSecretPersistence.js +93 -0
  67. package/dist/persistence/LibSecretPersistence.js.map +1 -0
  68. package/dist/persistence/PersistenceCachePlugin.d.ts +1 -1
  69. package/{src/persistence/PersistenceCachePlugin.ts → dist/persistence/PersistenceCachePlugin.esm.js} +27 -34
  70. package/dist/persistence/PersistenceCachePlugin.esm.js.map +1 -0
  71. package/dist/persistence/PersistenceCachePlugin.js +101 -0
  72. package/dist/persistence/PersistenceCachePlugin.js.map +1 -0
  73. package/dist/persistence/PersistenceCreator.d.ts +1 -1
  74. package/dist/persistence/PersistenceCreator.esm.js +63 -0
  75. package/dist/persistence/PersistenceCreator.esm.js.map +1 -0
  76. package/dist/persistence/PersistenceCreator.js +65 -0
  77. package/dist/persistence/PersistenceCreator.js.map +1 -0
  78. package/dist/utils/Constants.d.ts +12 -5
  79. package/{src/utils/Constants.ts → dist/utils/Constants.esm.js} +17 -17
  80. package/dist/utils/Constants.esm.js.map +1 -0
  81. package/dist/utils/Constants.js +66 -0
  82. package/dist/utils/Constants.js.map +1 -0
  83. package/dist/utils/Environment.d.ts +1 -1
  84. package/{src/utils/Environment.ts → dist/utils/Environment.esm.js} +44 -49
  85. package/dist/utils/Environment.esm.js.map +1 -0
  86. package/dist/utils/Environment.js +96 -0
  87. package/dist/utils/Environment.js.map +1 -0
  88. package/dist/utils/TypeGuards.d.ts +5 -0
  89. package/dist/utils/TypeGuards.esm.js +16 -0
  90. package/dist/utils/TypeGuards.esm.js.map +1 -0
  91. package/dist/utils/TypeGuards.js +18 -0
  92. package/dist/utils/TypeGuards.js.map +1 -0
  93. package/package.json +70 -52
  94. package/CHANGELOG.json +0 -167
  95. package/binding.gyp +0 -29
  96. package/changelog.md +0 -77
  97. package/dist/msal-node-extensions.cjs.development.js +0 -902
  98. package/dist/msal-node-extensions.cjs.development.js.map +0 -1
  99. package/dist/msal-node-extensions.cjs.production.min.js +0 -2
  100. package/dist/msal-node-extensions.cjs.production.min.js.map +0 -1
  101. package/dist/msal-node-extensions.esm.js +0 -902
  102. package/dist/msal-node-extensions.esm.js.map +0 -1
  103. package/src/dpapi-addon/Dpapi.ts +0 -12
  104. package/src/dpapi-addon/dpapi_addon.h +0 -6
  105. package/src/dpapi-addon/dpapi_not_supported.cpp +0 -19
  106. package/src/dpapi-addon/dpapi_win.cpp +0 -114
  107. package/src/dpapi-addon/main.cpp +0 -32
  108. package/src/index.ts +0 -16
  109. package/src/lock/CrossPlatformLock.ts +0 -89
  110. package/src/lock/CrossPlatformLockOptions.ts +0 -15
  111. package/src/persistence/FilePersistence.ts +0 -140
  112. package/src/persistence/FilePersistenceWithDataProtection.ts +0 -92
  113. package/src/persistence/IPersistence.ts +0 -17
  114. package/src/persistence/IPersistenceConfiguration.ts +0 -14
  115. package/src/persistence/KeychainPersistence.ts +0 -86
  116. package/src/persistence/LibSecretPersistence.ts +0 -87
  117. package/src/persistence/PersistenceCreator.ts +0 -73
@@ -1,92 +0,0 @@
1
- /*
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- import { IPersistence } from "./IPersistence";
7
- import { FilePersistence } from "./FilePersistence";
8
- import { PersistenceError } from "../error/PersistenceError";
9
- import { Dpapi } from "../dpapi-addon/Dpapi";
10
- import { DataProtectionScope } from "./DataProtectionScope";
11
- import { Logger, LoggerOptions } from "@azure/msal-common";
12
- import { dirname } from "path";
13
- import { BasePersistence } from "./BasePersistence";
14
-
15
- /**
16
- * Uses CryptProtectData and CryptUnprotectData on Windows to encrypt and decrypt file contents.
17
- *
18
- * scope: Scope of the data protection. Either local user or the current machine
19
- * optionalEntropy: Password or other additional entropy used to encrypt the data
20
- */
21
- export class FilePersistenceWithDataProtection extends BasePersistence implements IPersistence {
22
-
23
- private filePersistence: FilePersistence;
24
- private scope: DataProtectionScope;
25
- private optionalEntropy: Uint8Array;
26
-
27
- private constructor(scope: DataProtectionScope, optionalEntropy?: string) {
28
- super();
29
- this.scope = scope;
30
- this.optionalEntropy = optionalEntropy ? Buffer.from(optionalEntropy, "utf-8") : null;
31
- }
32
-
33
- public static async create(
34
- fileLocation: string,
35
- scope: DataProtectionScope,
36
- optionalEntropy?: string,
37
- loggerOptions?: LoggerOptions): Promise<FilePersistenceWithDataProtection> {
38
-
39
- const persistence = new FilePersistenceWithDataProtection(scope, optionalEntropy);
40
- persistence.filePersistence = await FilePersistence.create(fileLocation, loggerOptions);
41
- return persistence;
42
- }
43
-
44
- public async save(contents: string): Promise<void> {
45
- try {
46
- const encryptedContents = Dpapi.protectData(
47
- Buffer.from(contents, "utf-8"),
48
- this.optionalEntropy,
49
- this.scope.toString());
50
- await this.filePersistence.saveBuffer(encryptedContents);
51
- } catch (err) {
52
- throw PersistenceError.createFilePersistenceWithDPAPIError(err.message);
53
- }
54
- }
55
-
56
- public async load(): Promise<string | null> {
57
- try {
58
- const encryptedContents = await this.filePersistence.loadBuffer();
59
- if (typeof encryptedContents === "undefined" || !encryptedContents || 0 === encryptedContents.length) {
60
- this.filePersistence.getLogger().info("Encrypted contents loaded from file were null or empty");
61
- return null;
62
- }
63
- return Dpapi.unprotectData(
64
- encryptedContents,
65
- this.optionalEntropy,
66
- this.scope.toString()).toString();
67
- } catch (err) {
68
- throw PersistenceError.createFilePersistenceWithDPAPIError(err.message);
69
- }
70
- }
71
-
72
- public async delete(): Promise<boolean> {
73
- return this.filePersistence.delete();
74
- }
75
-
76
- public async reloadNecessary(lastSync: number): Promise<boolean> {
77
- return this.filePersistence.reloadNecessary(lastSync);
78
- }
79
-
80
- public getFilePath(): string {
81
- return this.filePersistence.getFilePath();
82
- }
83
-
84
- public getLogger(): Logger {
85
- return this.filePersistence.getLogger();
86
- }
87
-
88
- public createForPersistenceValidation(): Promise<FilePersistenceWithDataProtection> {
89
- const testCacheFileLocation = `${dirname(this.filePersistence.getFilePath())}/test.cache`;
90
- return FilePersistenceWithDataProtection.create(testCacheFileLocation, DataProtectionScope.CurrentUser);
91
- }
92
- }
@@ -1,17 +0,0 @@
1
- /*
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- import { Logger } from "@azure/msal-common";
7
-
8
- export interface IPersistence {
9
- save(contents: string): Promise<void>;
10
- load(): Promise<string | null>;
11
- delete(): Promise<boolean>;
12
- reloadNecessary(lastSync: number): Promise<boolean>;
13
- getFilePath(): string;
14
- getLogger(): Logger;
15
- verifyPersistence(): Promise<boolean>;
16
- createForPersistenceValidation(): Promise<IPersistence>;
17
- }
@@ -1,14 +0,0 @@
1
- /*
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- import { DataProtectionScope } from "./DataProtectionScope";
7
-
8
- export interface IPersistenceConfiguration {
9
- cachePath?: string,
10
- dataProtectionScope?: DataProtectionScope,
11
- serviceName?: string,
12
- accountName?: string,
13
- usePlaintextFileOnLinux?: boolean,
14
- }
@@ -1,86 +0,0 @@
1
- /*
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- import { setPassword, getPassword, deletePassword } from "keytar";
7
- import { FilePersistence } from "./FilePersistence";
8
- import { IPersistence } from "./IPersistence";
9
- import { PersistenceError } from "../error/PersistenceError";
10
- import { Logger, LoggerOptions } from "@azure/msal-common";
11
- import { dirname } from "path";
12
- import { BasePersistence } from "./BasePersistence";
13
-
14
- /**
15
- * Uses reads and writes passwords to macOS keychain
16
- *
17
- * serviceName: Identifier used as key for whatever value is stored
18
- * accountName: Account under which password should be stored
19
- */
20
- export class KeychainPersistence extends BasePersistence implements IPersistence {
21
-
22
- protected readonly serviceName;
23
- protected readonly accountName;
24
- private filePersistence: FilePersistence;
25
-
26
- private constructor(serviceName: string, accountName: string) {
27
- super();
28
- this.serviceName = serviceName;
29
- this.accountName = accountName;
30
- }
31
-
32
- public static async create(
33
- fileLocation: string,
34
- serviceName: string,
35
- accountName: string,
36
- loggerOptions?: LoggerOptions): Promise<KeychainPersistence> {
37
-
38
- const persistence = new KeychainPersistence(serviceName, accountName);
39
- persistence.filePersistence = await FilePersistence.create(fileLocation, loggerOptions);
40
- return persistence;
41
- }
42
-
43
- public async save(contents: string): Promise<void> {
44
- try {
45
- await setPassword(this.serviceName, this.accountName, contents);
46
- } catch (err) {
47
- throw PersistenceError.createKeychainPersistenceError(err.message);
48
- }
49
- // Write dummy data to update file mtime
50
- await this.filePersistence.save("{}");
51
- }
52
-
53
- public async load(): Promise<string | null> {
54
- try{
55
- return await getPassword(this.serviceName, this.accountName);
56
- } catch(err){
57
- throw PersistenceError.createKeychainPersistenceError(err.message);
58
- }
59
- }
60
-
61
- public async delete(): Promise<boolean> {
62
- try {
63
- await this.filePersistence.delete();
64
- return await deletePassword(this.serviceName, this.accountName);
65
- } catch (err) {
66
- throw PersistenceError.createKeychainPersistenceError(err.message);
67
- }
68
- }
69
-
70
- public async reloadNecessary(lastSync: number): Promise<boolean> {
71
- return this.filePersistence.reloadNecessary(lastSync);
72
- }
73
-
74
- public getFilePath(): string {
75
- return this.filePersistence.getFilePath();
76
- }
77
-
78
- public getLogger(): Logger {
79
- return this.filePersistence.getLogger();
80
- }
81
-
82
- public createForPersistenceValidation(): Promise<KeychainPersistence> {
83
- const testCacheFileLocation = `${dirname(this.filePersistence.getFilePath())}/test.cache`;
84
- return KeychainPersistence.create(testCacheFileLocation, "persistenceValidationServiceName", "persistencValidationAccountName");
85
- }
86
- }
@@ -1,87 +0,0 @@
1
- /*
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- import { setPassword, getPassword, deletePassword } from "keytar";
7
- import { FilePersistence } from "./FilePersistence";
8
- import { IPersistence } from "./IPersistence";
9
- import { PersistenceError } from "../error/PersistenceError";
10
- import { Logger, LoggerOptions } from "@azure/msal-common";
11
- import { dirname } from "path";
12
- import { BasePersistence } from "./BasePersistence";
13
-
14
- /**
15
- * Uses reads and writes passwords to Secret Service API/libsecret. Requires libsecret
16
- * to be installed.
17
- *
18
- * serviceName: Identifier used as key for whatever value is stored
19
- * accountName: Account under which password should be stored
20
- */
21
- export class LibSecretPersistence extends BasePersistence implements IPersistence {
22
-
23
- protected readonly serviceName;
24
- protected readonly accountName;
25
- private filePersistence: FilePersistence;
26
-
27
- private constructor(serviceName: string, accountName: string) {
28
- super();
29
- this.serviceName = serviceName;
30
- this.accountName = accountName;
31
- }
32
-
33
- public static async create(
34
- fileLocation: string,
35
- serviceName: string,
36
- accountName: string,
37
- loggerOptions?: LoggerOptions): Promise<LibSecretPersistence> {
38
-
39
- const persistence = new LibSecretPersistence(serviceName, accountName);
40
- persistence.filePersistence = await FilePersistence.create(fileLocation, loggerOptions);
41
- return persistence;
42
- }
43
-
44
- public async save(contents: string): Promise<void> {
45
- try {
46
- await setPassword(this.serviceName, this.accountName, contents);
47
- } catch (err) {
48
- throw PersistenceError.createLibSecretError(err.message);
49
- }
50
- // Write dummy data to update file mtime
51
- await this.filePersistence.save("{}");
52
- }
53
-
54
- public async load(): Promise<string | null> {
55
- try {
56
- return await getPassword(this.serviceName, this.accountName);
57
- } catch (err) {
58
- throw PersistenceError.createLibSecretError(err.message);
59
- }
60
- }
61
-
62
- public async delete(): Promise<boolean> {
63
- try {
64
- await this.filePersistence.delete();
65
- return await deletePassword(this.serviceName, this.accountName);
66
- } catch (err) {
67
- throw PersistenceError.createLibSecretError(err.message);
68
- }
69
- }
70
-
71
- public async reloadNecessary(lastSync: number): Promise<boolean> {
72
- return this.filePersistence.reloadNecessary(lastSync);
73
- }
74
-
75
- public getFilePath(): string {
76
- return this.filePersistence.getFilePath();
77
- }
78
-
79
- public getLogger(): Logger {
80
- return this.filePersistence.getLogger();
81
- }
82
-
83
- public createForPersistenceValidation(): Promise<LibSecretPersistence> {
84
- const testCacheFileLocation = `${dirname(this.filePersistence.getFilePath())}/test.cache`;
85
- return LibSecretPersistence.create(testCacheFileLocation, "persistenceValidationServiceName", "persistencValidationAccountName");
86
- }
87
- }
@@ -1,73 +0,0 @@
1
- /*
2
- * Copyright (c) Microsoft Corporation. All rights reserved.
3
- * Licensed under the MIT License.
4
- */
5
-
6
- import { FilePersistenceWithDataProtection } from "../persistence/FilePersistenceWithDataProtection";
7
- import { LibSecretPersistence } from "../persistence/LibSecretPersistence";
8
- import { KeychainPersistence } from "../persistence/KeychainPersistence";
9
- import { DataProtectionScope } from "../persistence/DataProtectionScope";
10
- import { Environment } from "../utils/Environment";
11
- import { IPersistence } from "./IPersistence";
12
- import { FilePersistence } from "./FilePersistence";
13
- import { PersistenceError } from "../error/PersistenceError";
14
- import { IPersistenceConfiguration } from "../persistence/IPersistenceConfiguration";
15
-
16
- export class PersistenceCreator {
17
- static async createPersistence(config: IPersistenceConfiguration): Promise<IPersistence> {
18
- let peristence: IPersistence;
19
-
20
- // On Windows, uses a DPAPI encrypted file
21
- if (Environment.isWindowsPlatform()) {
22
- if (!config.cachePath || !config.dataProtectionScope) {
23
- throw PersistenceError.createPersistenceNotValidatedError(`Cache path and/or data protection scope not provided for the FilePersistenceWithDataProtection cache plugin`);
24
- }
25
-
26
- peristence = await FilePersistenceWithDataProtection.create(config.cachePath, DataProtectionScope.CurrentUser);
27
- }
28
-
29
- // On Mac, uses keychain.
30
- else if (Environment.isMacPlatform()) {
31
- if (!config.cachePath || !config.serviceName || !config.accountName) {
32
- throw PersistenceError.createPersistenceNotValidatedError(`Cache path, service name and/or account name not provided for the KeychainPersistence cache plugin`);
33
- }
34
-
35
- peristence = await KeychainPersistence.create(config.cachePath, config.serviceName, config.accountName);
36
- }
37
-
38
- // On Linux, uses libsecret to store to secret service. Libsecret has to be installed.
39
- else if (Environment.isLinuxPlatform()) {
40
- if (!config.cachePath || !config.serviceName || !config.accountName) {
41
- throw PersistenceError.createPersistenceNotValidatedError(`Cache path, service name and/or account name not provided for the LibSecretPersistence cache plugin`);
42
- }
43
-
44
- peristence = await LibSecretPersistence.create(config.cachePath, config.serviceName, config.accountName);
45
- }
46
-
47
- else {
48
- throw PersistenceError.createNotSupportedError("The current environment is not supported by msal-node-extensions yet.");
49
- }
50
-
51
- // Initially suppress the error thrown during persistence verification to allow us to fallback to plain text
52
- const isPersistenceVerified = await peristence.verifyPersistence().catch(() => false);
53
-
54
- if (!isPersistenceVerified) {
55
- if (Environment.isLinuxPlatform() && config.usePlaintextFileOnLinux) {
56
- if (!config.cachePath) {
57
- throw PersistenceError.createPersistenceNotValidatedError(`Cache path not provided for the FilePersistence cache plugin`);
58
- }
59
-
60
- peristence = await FilePersistence.create(config.cachePath);
61
-
62
- const isFilePersistenceVerified = await peristence.verifyPersistence();
63
- if (isFilePersistenceVerified) {
64
- return peristence;
65
- }
66
- }
67
-
68
- throw PersistenceError.createPersistenceNotVerifiedError("Persistence could not be verified");
69
- }
70
-
71
- return peristence;
72
- }
73
- }