@azure/msal-node-extensions 1.0.0-alpha.8 → 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.
- package/LICENSE +21 -21
- package/README.md +208 -42
- package/bin/arm64/dpapi.node +0 -0
- package/bin/ia32/dpapi.node +0 -0
- package/bin/x64/dpapi.node +0 -0
- package/dist/{dpapi-addon/Dpapi.d.ts → Dpapi.d.ts} +4 -4
- package/dist/Dpapi.esm.js +24 -0
- package/dist/Dpapi.esm.js.map +1 -0
- package/dist/Dpapi.js +24 -0
- package/dist/Dpapi.js.map +1 -0
- package/dist/broker/NativeBrokerPlugin.d.ts +20 -0
- package/dist/broker/NativeBrokerPlugin.esm.js +408 -0
- package/dist/broker/NativeBrokerPlugin.esm.js.map +1 -0
- package/dist/broker/NativeBrokerPlugin.js +410 -0
- package/dist/broker/NativeBrokerPlugin.js.map +1 -0
- package/dist/error/NativeAuthError.d.ts +6 -0
- package/dist/error/NativeAuthError.esm.js +20 -0
- package/dist/error/NativeAuthError.esm.js.map +1 -0
- package/dist/error/NativeAuthError.js +22 -0
- package/dist/error/NativeAuthError.js.map +1 -0
- package/dist/error/PersistenceError.d.ts +21 -0
- package/{src/error/PersistenceError.ts → dist/error/PersistenceError.esm.js} +88 -70
- package/dist/error/PersistenceError.esm.js.map +1 -0
- package/dist/error/PersistenceError.js +91 -0
- package/dist/error/PersistenceError.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.esm.js +12 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +24 -6
- package/dist/index.js.map +1 -0
- package/dist/lock/CrossPlatformLock.esm.js +94 -0
- package/dist/lock/CrossPlatformLock.esm.js.map +1 -0
- package/dist/lock/CrossPlatformLock.js +96 -0
- package/dist/lock/CrossPlatformLock.js.map +1 -0
- package/dist/lock/CrossPlatformLockOptions.d.ts +1 -1
- package/dist/packageMetadata.d.ts +2 -0
- package/dist/packageMetadata.esm.js +8 -0
- package/dist/packageMetadata.esm.js.map +1 -0
- package/dist/packageMetadata.js +11 -0
- package/dist/packageMetadata.js.map +1 -0
- package/{src/persistence/BasePersistence.ts → dist/persistence/BasePersistence.esm.js} +35 -40
- package/dist/persistence/BasePersistence.esm.js.map +1 -0
- package/dist/persistence/BasePersistence.js +38 -0
- package/dist/persistence/BasePersistence.js.map +1 -0
- package/dist/persistence/DataProtectionScope.d.ts +5 -4
- package/{src/persistence/DataProtectionScope.ts → dist/persistence/DataProtectionScope.esm.js} +23 -19
- package/dist/persistence/DataProtectionScope.esm.js.map +1 -0
- package/dist/persistence/DataProtectionScope.js +26 -0
- package/dist/persistence/DataProtectionScope.js.map +1 -0
- package/dist/persistence/FilePersistence.d.ts +1 -0
- package/dist/persistence/FilePersistence.esm.js +173 -0
- package/dist/persistence/FilePersistence.esm.js.map +1 -0
- package/dist/persistence/FilePersistence.js +175 -0
- package/dist/persistence/FilePersistence.js.map +1 -0
- package/dist/persistence/FilePersistenceWithDataProtection.esm.js +84 -0
- package/dist/persistence/FilePersistenceWithDataProtection.esm.js.map +1 -0
- package/dist/persistence/FilePersistenceWithDataProtection.js +86 -0
- package/dist/persistence/FilePersistenceWithDataProtection.js.map +1 -0
- package/dist/persistence/IPersistenceConfiguration.d.ts +10 -0
- package/dist/persistence/KeychainPersistence.d.ts +2 -2
- package/dist/persistence/KeychainPersistence.esm.js +90 -0
- package/dist/persistence/KeychainPersistence.esm.js.map +1 -0
- package/dist/persistence/KeychainPersistence.js +92 -0
- package/dist/persistence/KeychainPersistence.js.map +1 -0
- package/dist/persistence/LibSecretPersistence.d.ts +2 -2
- package/dist/persistence/LibSecretPersistence.esm.js +91 -0
- package/dist/persistence/LibSecretPersistence.esm.js.map +1 -0
- package/dist/persistence/LibSecretPersistence.js +93 -0
- package/dist/persistence/LibSecretPersistence.js.map +1 -0
- package/dist/persistence/PersistenceCachePlugin.d.ts +1 -1
- package/{src/persistence/PersistenceCachePlugin.ts → dist/persistence/PersistenceCachePlugin.esm.js} +97 -104
- package/dist/persistence/PersistenceCachePlugin.esm.js.map +1 -0
- package/dist/persistence/PersistenceCachePlugin.js +101 -0
- package/dist/persistence/PersistenceCachePlugin.js.map +1 -0
- package/dist/persistence/PersistenceCreator.d.ts +5 -0
- package/dist/persistence/PersistenceCreator.esm.js +63 -0
- package/dist/persistence/PersistenceCreator.esm.js.map +1 -0
- package/dist/persistence/PersistenceCreator.js +65 -0
- package/dist/persistence/PersistenceCreator.js.map +1 -0
- package/dist/utils/Constants.d.ts +29 -0
- package/dist/utils/Constants.esm.js +62 -0
- package/dist/utils/Constants.esm.js.map +1 -0
- package/dist/utils/Constants.js +66 -0
- package/dist/utils/Constants.js.map +1 -0
- package/dist/utils/Environment.d.ts +16 -0
- package/dist/utils/Environment.esm.js +94 -0
- package/dist/utils/Environment.esm.js.map +1 -0
- package/dist/utils/Environment.js +96 -0
- package/dist/utils/Environment.js.map +1 -0
- package/dist/utils/TypeGuards.d.ts +5 -0
- package/dist/utils/TypeGuards.esm.js +16 -0
- package/dist/utils/TypeGuards.esm.js.map +1 -0
- package/dist/utils/TypeGuards.js +18 -0
- package/dist/utils/TypeGuards.js.map +1 -0
- package/package.json +70 -52
- package/CHANGELOG.json +0 -146
- package/binding.gyp +0 -29
- package/changelog.md +0 -68
- package/dist/msal-node-extensions.cjs.development.js +0 -687
- package/dist/msal-node-extensions.cjs.development.js.map +0 -1
- package/dist/msal-node-extensions.cjs.production.min.js +0 -2
- package/dist/msal-node-extensions.cjs.production.min.js.map +0 -1
- package/dist/msal-node-extensions.esm.js +0 -692
- package/dist/msal-node-extensions.esm.js.map +0 -1
- package/src/dpapi-addon/Dpapi.ts +0 -12
- package/src/dpapi-addon/dpapi_addon.h +0 -6
- package/src/dpapi-addon/dpapi_not_supported.cpp +0 -19
- package/src/dpapi-addon/dpapi_win.cpp +0 -114
- package/src/dpapi-addon/main.cpp +0 -32
- package/src/index.ts +0 -13
- package/src/lock/CrossPlatformLock.ts +0 -89
- package/src/lock/CrossPlatformLockOptions.ts +0 -15
- package/src/persistence/FilePersistence.ts +0 -140
- package/src/persistence/FilePersistenceWithDataProtection.ts +0 -92
- package/src/persistence/IPersistence.ts +0 -17
- package/src/persistence/KeychainPersistence.ts +0 -86
- package/src/persistence/LibSecretPersistence.ts +0 -87
- package/src/utils/Constants.ts +0 -35
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/*! @azure/msal-node-extensions v1.0.0-beta.0 2023-06-20 */
|
|
2
|
+
'use strict';
|
|
3
|
+
import { FilePersistence } from './FilePersistence.esm.js';
|
|
4
|
+
import { PersistenceError } from '../error/PersistenceError.esm.js';
|
|
5
|
+
import { Dpapi } from '../Dpapi.esm.js';
|
|
6
|
+
import { DataProtectionScope } from './DataProtectionScope.esm.js';
|
|
7
|
+
import { dirname } from 'path';
|
|
8
|
+
import { BasePersistence } from './BasePersistence.esm.js';
|
|
9
|
+
import { isNodeError } from '../utils/TypeGuards.esm.js';
|
|
10
|
+
|
|
11
|
+
/*
|
|
12
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
13
|
+
* Licensed under the MIT License.
|
|
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
|
+
class FilePersistenceWithDataProtection extends BasePersistence {
|
|
22
|
+
constructor(filePersistence, scope, optionalEntropy) {
|
|
23
|
+
super();
|
|
24
|
+
this.scope = scope;
|
|
25
|
+
this.optionalEntropy = optionalEntropy ? Buffer.from(optionalEntropy, "utf-8") : null;
|
|
26
|
+
this.filePersistence = filePersistence;
|
|
27
|
+
}
|
|
28
|
+
static async create(fileLocation, scope, optionalEntropy, loggerOptions) {
|
|
29
|
+
const filePersistence = await FilePersistence.create(fileLocation, loggerOptions);
|
|
30
|
+
const persistence = new FilePersistenceWithDataProtection(filePersistence, scope, optionalEntropy);
|
|
31
|
+
return persistence;
|
|
32
|
+
}
|
|
33
|
+
async save(contents) {
|
|
34
|
+
try {
|
|
35
|
+
const encryptedContents = Dpapi.protectData(Buffer.from(contents, "utf-8"), this.optionalEntropy, this.scope.toString());
|
|
36
|
+
await this.filePersistence.saveBuffer(encryptedContents);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
if (isNodeError(err)) {
|
|
40
|
+
throw PersistenceError.createFilePersistenceWithDPAPIError(err.message);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
throw err;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async load() {
|
|
48
|
+
try {
|
|
49
|
+
const encryptedContents = await this.filePersistence.loadBuffer();
|
|
50
|
+
if (typeof encryptedContents === "undefined" || !encryptedContents || 0 === encryptedContents.length) {
|
|
51
|
+
this.filePersistence.getLogger().info("Encrypted contents loaded from file were null or empty");
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
return Dpapi.unprotectData(encryptedContents, this.optionalEntropy, this.scope.toString()).toString();
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
if (isNodeError(err)) {
|
|
58
|
+
throw PersistenceError.createFilePersistenceWithDPAPIError(err.message);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async delete() {
|
|
66
|
+
return this.filePersistence.delete();
|
|
67
|
+
}
|
|
68
|
+
async reloadNecessary(lastSync) {
|
|
69
|
+
return this.filePersistence.reloadNecessary(lastSync);
|
|
70
|
+
}
|
|
71
|
+
getFilePath() {
|
|
72
|
+
return this.filePersistence.getFilePath();
|
|
73
|
+
}
|
|
74
|
+
getLogger() {
|
|
75
|
+
return this.filePersistence.getLogger();
|
|
76
|
+
}
|
|
77
|
+
createForPersistenceValidation() {
|
|
78
|
+
const testCacheFileLocation = `${dirname(this.filePersistence.getFilePath())}/test.cache`;
|
|
79
|
+
return FilePersistenceWithDataProtection.create(testCacheFileLocation, DataProtectionScope.CurrentUser);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export { FilePersistenceWithDataProtection };
|
|
84
|
+
//# sourceMappingURL=FilePersistenceWithDataProtection.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilePersistenceWithDataProtection.esm.js","sources":["../../src/persistence/FilePersistenceWithDataProtection.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/*! @azure/msal-node-extensions v1.0.0-beta.0 2023-06-20 */
|
|
2
|
+
'use strict';
|
|
3
|
+
'use strict';
|
|
4
|
+
|
|
5
|
+
var FilePersistence = require('./FilePersistence.js');
|
|
6
|
+
var PersistenceError = require('../error/PersistenceError.js');
|
|
7
|
+
var Dpapi = require('../Dpapi.js');
|
|
8
|
+
var DataProtectionScope = require('./DataProtectionScope.js');
|
|
9
|
+
var path = require('path');
|
|
10
|
+
var BasePersistence = require('./BasePersistence.js');
|
|
11
|
+
var TypeGuards = require('../utils/TypeGuards.js');
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
15
|
+
* Licensed under the MIT License.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Uses CryptProtectData and CryptUnprotectData on Windows to encrypt and decrypt file contents.
|
|
19
|
+
*
|
|
20
|
+
* scope: Scope of the data protection. Either local user or the current machine
|
|
21
|
+
* optionalEntropy: Password or other additional entropy used to encrypt the data
|
|
22
|
+
*/
|
|
23
|
+
class FilePersistenceWithDataProtection extends BasePersistence.BasePersistence {
|
|
24
|
+
constructor(filePersistence, scope, optionalEntropy) {
|
|
25
|
+
super();
|
|
26
|
+
this.scope = scope;
|
|
27
|
+
this.optionalEntropy = optionalEntropy ? Buffer.from(optionalEntropy, "utf-8") : null;
|
|
28
|
+
this.filePersistence = filePersistence;
|
|
29
|
+
}
|
|
30
|
+
static async create(fileLocation, scope, optionalEntropy, loggerOptions) {
|
|
31
|
+
const filePersistence = await FilePersistence.FilePersistence.create(fileLocation, loggerOptions);
|
|
32
|
+
const persistence = new FilePersistenceWithDataProtection(filePersistence, scope, optionalEntropy);
|
|
33
|
+
return persistence;
|
|
34
|
+
}
|
|
35
|
+
async save(contents) {
|
|
36
|
+
try {
|
|
37
|
+
const encryptedContents = Dpapi.Dpapi.protectData(Buffer.from(contents, "utf-8"), this.optionalEntropy, this.scope.toString());
|
|
38
|
+
await this.filePersistence.saveBuffer(encryptedContents);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
if (TypeGuards.isNodeError(err)) {
|
|
42
|
+
throw PersistenceError.PersistenceError.createFilePersistenceWithDPAPIError(err.message);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
throw err;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async load() {
|
|
50
|
+
try {
|
|
51
|
+
const encryptedContents = await this.filePersistence.loadBuffer();
|
|
52
|
+
if (typeof encryptedContents === "undefined" || !encryptedContents || 0 === encryptedContents.length) {
|
|
53
|
+
this.filePersistence.getLogger().info("Encrypted contents loaded from file were null or empty");
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
return Dpapi.Dpapi.unprotectData(encryptedContents, this.optionalEntropy, this.scope.toString()).toString();
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
if (TypeGuards.isNodeError(err)) {
|
|
60
|
+
throw PersistenceError.PersistenceError.createFilePersistenceWithDPAPIError(err.message);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
throw err;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async delete() {
|
|
68
|
+
return this.filePersistence.delete();
|
|
69
|
+
}
|
|
70
|
+
async reloadNecessary(lastSync) {
|
|
71
|
+
return this.filePersistence.reloadNecessary(lastSync);
|
|
72
|
+
}
|
|
73
|
+
getFilePath() {
|
|
74
|
+
return this.filePersistence.getFilePath();
|
|
75
|
+
}
|
|
76
|
+
getLogger() {
|
|
77
|
+
return this.filePersistence.getLogger();
|
|
78
|
+
}
|
|
79
|
+
createForPersistenceValidation() {
|
|
80
|
+
const testCacheFileLocation = `${path.dirname(this.filePersistence.getFilePath())}/test.cache`;
|
|
81
|
+
return FilePersistenceWithDataProtection.create(testCacheFileLocation, DataProtectionScope.DataProtectionScope.CurrentUser);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
exports.FilePersistenceWithDataProtection = FilePersistenceWithDataProtection;
|
|
86
|
+
//# sourceMappingURL=FilePersistenceWithDataProtection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FilePersistenceWithDataProtection.js","sources":["../../src/persistence/FilePersistenceWithDataProtection.ts"],"sourcesContent":[null],"names":["BasePersistence","FilePersistence","Dpapi","isNodeError","PersistenceError","dirname","DataProtectionScope"],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { LoggerOptions } from "@azure/msal-common";
|
|
2
|
+
import { DataProtectionScope } from "./DataProtectionScope";
|
|
3
|
+
export interface IPersistenceConfiguration {
|
|
4
|
+
cachePath?: string;
|
|
5
|
+
dataProtectionScope?: DataProtectionScope;
|
|
6
|
+
serviceName?: string;
|
|
7
|
+
accountName?: string;
|
|
8
|
+
usePlaintextFileOnLinux?: boolean;
|
|
9
|
+
loggerOptions?: LoggerOptions;
|
|
10
|
+
}
|
|
@@ -8,8 +8,8 @@ import { BasePersistence } from "./BasePersistence";
|
|
|
8
8
|
* accountName: Account under which password should be stored
|
|
9
9
|
*/
|
|
10
10
|
export declare class KeychainPersistence extends BasePersistence implements IPersistence {
|
|
11
|
-
protected readonly serviceName:
|
|
12
|
-
protected readonly accountName:
|
|
11
|
+
protected readonly serviceName: string;
|
|
12
|
+
protected readonly accountName: string;
|
|
13
13
|
private filePersistence;
|
|
14
14
|
private constructor();
|
|
15
15
|
static create(fileLocation: string, serviceName: string, accountName: string, loggerOptions?: LoggerOptions): Promise<KeychainPersistence>;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/*! @azure/msal-node-extensions v1.0.0-beta.0 2023-06-20 */
|
|
2
|
+
'use strict';
|
|
3
|
+
import { setPassword, getPassword, deletePassword } from 'keytar';
|
|
4
|
+
import { FilePersistence } from './FilePersistence.esm.js';
|
|
5
|
+
import { PersistenceError } from '../error/PersistenceError.esm.js';
|
|
6
|
+
import { dirname } from 'path';
|
|
7
|
+
import { BasePersistence } from './BasePersistence.esm.js';
|
|
8
|
+
import { isNodeError } from '../utils/TypeGuards.esm.js';
|
|
9
|
+
|
|
10
|
+
/*
|
|
11
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
12
|
+
* Licensed under the MIT License.
|
|
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
|
+
class KeychainPersistence extends BasePersistence {
|
|
21
|
+
constructor(filePersistence, serviceName, accountName) {
|
|
22
|
+
super();
|
|
23
|
+
this.filePersistence = filePersistence;
|
|
24
|
+
this.serviceName = serviceName;
|
|
25
|
+
this.accountName = accountName;
|
|
26
|
+
}
|
|
27
|
+
static async create(fileLocation, serviceName, accountName, loggerOptions) {
|
|
28
|
+
const filePersistence = await FilePersistence.create(fileLocation, loggerOptions);
|
|
29
|
+
const persistence = new KeychainPersistence(filePersistence, serviceName, accountName);
|
|
30
|
+
return persistence;
|
|
31
|
+
}
|
|
32
|
+
async save(contents) {
|
|
33
|
+
try {
|
|
34
|
+
await setPassword(this.serviceName, this.accountName, contents);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
if (isNodeError(err)) {
|
|
38
|
+
throw PersistenceError.createKeychainPersistenceError(err.message);
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
throw err;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// Write dummy data to update file mtime
|
|
45
|
+
await this.filePersistence.save("{}");
|
|
46
|
+
}
|
|
47
|
+
async load() {
|
|
48
|
+
try {
|
|
49
|
+
return await getPassword(this.serviceName, this.accountName);
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (isNodeError(err)) {
|
|
53
|
+
throw PersistenceError.createKeychainPersistenceError(err.message);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
throw err;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
async delete() {
|
|
61
|
+
try {
|
|
62
|
+
await this.filePersistence.delete();
|
|
63
|
+
return await deletePassword(this.serviceName, this.accountName);
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
if (isNodeError(err)) {
|
|
67
|
+
throw PersistenceError.createKeychainPersistenceError(err.message);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
throw err;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async reloadNecessary(lastSync) {
|
|
75
|
+
return this.filePersistence.reloadNecessary(lastSync);
|
|
76
|
+
}
|
|
77
|
+
getFilePath() {
|
|
78
|
+
return this.filePersistence.getFilePath();
|
|
79
|
+
}
|
|
80
|
+
getLogger() {
|
|
81
|
+
return this.filePersistence.getLogger();
|
|
82
|
+
}
|
|
83
|
+
createForPersistenceValidation() {
|
|
84
|
+
const testCacheFileLocation = `${dirname(this.filePersistence.getFilePath())}/test.cache`;
|
|
85
|
+
return KeychainPersistence.create(testCacheFileLocation, "persistenceValidationServiceName", "persistencValidationAccountName");
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export { KeychainPersistence };
|
|
90
|
+
//# sourceMappingURL=KeychainPersistence.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeychainPersistence.esm.js","sources":["../../src/persistence/KeychainPersistence.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/*! @azure/msal-node-extensions v1.0.0-beta.0 2023-06-20 */
|
|
2
|
+
'use strict';
|
|
3
|
+
'use strict';
|
|
4
|
+
|
|
5
|
+
var keytar = require('keytar');
|
|
6
|
+
var FilePersistence = require('./FilePersistence.js');
|
|
7
|
+
var PersistenceError = require('../error/PersistenceError.js');
|
|
8
|
+
var path = require('path');
|
|
9
|
+
var BasePersistence = require('./BasePersistence.js');
|
|
10
|
+
var TypeGuards = require('../utils/TypeGuards.js');
|
|
11
|
+
|
|
12
|
+
/*
|
|
13
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
14
|
+
* Licensed under the MIT License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Uses reads and writes passwords to macOS keychain
|
|
18
|
+
*
|
|
19
|
+
* serviceName: Identifier used as key for whatever value is stored
|
|
20
|
+
* accountName: Account under which password should be stored
|
|
21
|
+
*/
|
|
22
|
+
class KeychainPersistence extends BasePersistence.BasePersistence {
|
|
23
|
+
constructor(filePersistence, serviceName, accountName) {
|
|
24
|
+
super();
|
|
25
|
+
this.filePersistence = filePersistence;
|
|
26
|
+
this.serviceName = serviceName;
|
|
27
|
+
this.accountName = accountName;
|
|
28
|
+
}
|
|
29
|
+
static async create(fileLocation, serviceName, accountName, loggerOptions) {
|
|
30
|
+
const filePersistence = await FilePersistence.FilePersistence.create(fileLocation, loggerOptions);
|
|
31
|
+
const persistence = new KeychainPersistence(filePersistence, serviceName, accountName);
|
|
32
|
+
return persistence;
|
|
33
|
+
}
|
|
34
|
+
async save(contents) {
|
|
35
|
+
try {
|
|
36
|
+
await keytar.setPassword(this.serviceName, this.accountName, contents);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
if (TypeGuards.isNodeError(err)) {
|
|
40
|
+
throw PersistenceError.PersistenceError.createKeychainPersistenceError(err.message);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
throw err;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Write dummy data to update file mtime
|
|
47
|
+
await this.filePersistence.save("{}");
|
|
48
|
+
}
|
|
49
|
+
async load() {
|
|
50
|
+
try {
|
|
51
|
+
return await keytar.getPassword(this.serviceName, this.accountName);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
if (TypeGuards.isNodeError(err)) {
|
|
55
|
+
throw PersistenceError.PersistenceError.createKeychainPersistenceError(err.message);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
throw err;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async delete() {
|
|
63
|
+
try {
|
|
64
|
+
await this.filePersistence.delete();
|
|
65
|
+
return await keytar.deletePassword(this.serviceName, this.accountName);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
if (TypeGuards.isNodeError(err)) {
|
|
69
|
+
throw PersistenceError.PersistenceError.createKeychainPersistenceError(err.message);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
throw err;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async reloadNecessary(lastSync) {
|
|
77
|
+
return this.filePersistence.reloadNecessary(lastSync);
|
|
78
|
+
}
|
|
79
|
+
getFilePath() {
|
|
80
|
+
return this.filePersistence.getFilePath();
|
|
81
|
+
}
|
|
82
|
+
getLogger() {
|
|
83
|
+
return this.filePersistence.getLogger();
|
|
84
|
+
}
|
|
85
|
+
createForPersistenceValidation() {
|
|
86
|
+
const testCacheFileLocation = `${path.dirname(this.filePersistence.getFilePath())}/test.cache`;
|
|
87
|
+
return KeychainPersistence.create(testCacheFileLocation, "persistenceValidationServiceName", "persistencValidationAccountName");
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
exports.KeychainPersistence = KeychainPersistence;
|
|
92
|
+
//# sourceMappingURL=KeychainPersistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeychainPersistence.js","sources":["../../src/persistence/KeychainPersistence.ts"],"sourcesContent":[null],"names":["BasePersistence","FilePersistence","setPassword","isNodeError","PersistenceError","getPassword","deletePassword","dirname"],"mappings":"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"}
|
|
@@ -9,8 +9,8 @@ import { BasePersistence } from "./BasePersistence";
|
|
|
9
9
|
* accountName: Account under which password should be stored
|
|
10
10
|
*/
|
|
11
11
|
export declare class LibSecretPersistence extends BasePersistence implements IPersistence {
|
|
12
|
-
protected readonly serviceName:
|
|
13
|
-
protected readonly accountName:
|
|
12
|
+
protected readonly serviceName: string;
|
|
13
|
+
protected readonly accountName: string;
|
|
14
14
|
private filePersistence;
|
|
15
15
|
private constructor();
|
|
16
16
|
static create(fileLocation: string, serviceName: string, accountName: string, loggerOptions?: LoggerOptions): Promise<LibSecretPersistence>;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/*! @azure/msal-node-extensions v1.0.0-beta.0 2023-06-20 */
|
|
2
|
+
'use strict';
|
|
3
|
+
import { setPassword, getPassword, deletePassword } from 'keytar';
|
|
4
|
+
import { FilePersistence } from './FilePersistence.esm.js';
|
|
5
|
+
import { PersistenceError } from '../error/PersistenceError.esm.js';
|
|
6
|
+
import { dirname } from 'path';
|
|
7
|
+
import { BasePersistence } from './BasePersistence.esm.js';
|
|
8
|
+
import { isNodeError } from '../utils/TypeGuards.esm.js';
|
|
9
|
+
|
|
10
|
+
/*
|
|
11
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
12
|
+
* Licensed under the MIT License.
|
|
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
|
+
class LibSecretPersistence extends BasePersistence {
|
|
22
|
+
constructor(filePersistence, serviceName, accountName) {
|
|
23
|
+
super();
|
|
24
|
+
this.filePersistence = filePersistence;
|
|
25
|
+
this.serviceName = serviceName;
|
|
26
|
+
this.accountName = accountName;
|
|
27
|
+
}
|
|
28
|
+
static async create(fileLocation, serviceName, accountName, loggerOptions) {
|
|
29
|
+
const filePersistence = await FilePersistence.create(fileLocation, loggerOptions);
|
|
30
|
+
const persistence = new LibSecretPersistence(filePersistence, serviceName, accountName);
|
|
31
|
+
return persistence;
|
|
32
|
+
}
|
|
33
|
+
async save(contents) {
|
|
34
|
+
try {
|
|
35
|
+
await setPassword(this.serviceName, this.accountName, contents);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
if (isNodeError(err)) {
|
|
39
|
+
throw PersistenceError.createLibSecretError(err.message);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// Write dummy data to update file mtime
|
|
46
|
+
await this.filePersistence.save("{}");
|
|
47
|
+
}
|
|
48
|
+
async load() {
|
|
49
|
+
try {
|
|
50
|
+
return await getPassword(this.serviceName, this.accountName);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
if (isNodeError(err)) {
|
|
54
|
+
throw PersistenceError.createLibSecretError(err.message);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
throw err;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async delete() {
|
|
62
|
+
try {
|
|
63
|
+
await this.filePersistence.delete();
|
|
64
|
+
return await deletePassword(this.serviceName, this.accountName);
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
if (isNodeError(err)) {
|
|
68
|
+
throw PersistenceError.createLibSecretError(err.message);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
throw err;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async reloadNecessary(lastSync) {
|
|
76
|
+
return this.filePersistence.reloadNecessary(lastSync);
|
|
77
|
+
}
|
|
78
|
+
getFilePath() {
|
|
79
|
+
return this.filePersistence.getFilePath();
|
|
80
|
+
}
|
|
81
|
+
getLogger() {
|
|
82
|
+
return this.filePersistence.getLogger();
|
|
83
|
+
}
|
|
84
|
+
createForPersistenceValidation() {
|
|
85
|
+
const testCacheFileLocation = `${dirname(this.filePersistence.getFilePath())}/test.cache`;
|
|
86
|
+
return LibSecretPersistence.create(testCacheFileLocation, "persistenceValidationServiceName", "persistencValidationAccountName");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export { LibSecretPersistence };
|
|
91
|
+
//# sourceMappingURL=LibSecretPersistence.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LibSecretPersistence.esm.js","sources":["../../src/persistence/LibSecretPersistence.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/*! @azure/msal-node-extensions v1.0.0-beta.0 2023-06-20 */
|
|
2
|
+
'use strict';
|
|
3
|
+
'use strict';
|
|
4
|
+
|
|
5
|
+
var keytar = require('keytar');
|
|
6
|
+
var FilePersistence = require('./FilePersistence.js');
|
|
7
|
+
var PersistenceError = require('../error/PersistenceError.js');
|
|
8
|
+
var path = require('path');
|
|
9
|
+
var BasePersistence = require('./BasePersistence.js');
|
|
10
|
+
var TypeGuards = require('../utils/TypeGuards.js');
|
|
11
|
+
|
|
12
|
+
/*
|
|
13
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
14
|
+
* Licensed under the MIT License.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Uses reads and writes passwords to Secret Service API/libsecret. Requires libsecret
|
|
18
|
+
* to be installed.
|
|
19
|
+
*
|
|
20
|
+
* serviceName: Identifier used as key for whatever value is stored
|
|
21
|
+
* accountName: Account under which password should be stored
|
|
22
|
+
*/
|
|
23
|
+
class LibSecretPersistence extends BasePersistence.BasePersistence {
|
|
24
|
+
constructor(filePersistence, serviceName, accountName) {
|
|
25
|
+
super();
|
|
26
|
+
this.filePersistence = filePersistence;
|
|
27
|
+
this.serviceName = serviceName;
|
|
28
|
+
this.accountName = accountName;
|
|
29
|
+
}
|
|
30
|
+
static async create(fileLocation, serviceName, accountName, loggerOptions) {
|
|
31
|
+
const filePersistence = await FilePersistence.FilePersistence.create(fileLocation, loggerOptions);
|
|
32
|
+
const persistence = new LibSecretPersistence(filePersistence, serviceName, accountName);
|
|
33
|
+
return persistence;
|
|
34
|
+
}
|
|
35
|
+
async save(contents) {
|
|
36
|
+
try {
|
|
37
|
+
await keytar.setPassword(this.serviceName, this.accountName, contents);
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
if (TypeGuards.isNodeError(err)) {
|
|
41
|
+
throw PersistenceError.PersistenceError.createLibSecretError(err.message);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
throw err;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Write dummy data to update file mtime
|
|
48
|
+
await this.filePersistence.save("{}");
|
|
49
|
+
}
|
|
50
|
+
async load() {
|
|
51
|
+
try {
|
|
52
|
+
return await keytar.getPassword(this.serviceName, this.accountName);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
if (TypeGuards.isNodeError(err)) {
|
|
56
|
+
throw PersistenceError.PersistenceError.createLibSecretError(err.message);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
throw err;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async delete() {
|
|
64
|
+
try {
|
|
65
|
+
await this.filePersistence.delete();
|
|
66
|
+
return await keytar.deletePassword(this.serviceName, this.accountName);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
if (TypeGuards.isNodeError(err)) {
|
|
70
|
+
throw PersistenceError.PersistenceError.createLibSecretError(err.message);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
throw err;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async reloadNecessary(lastSync) {
|
|
78
|
+
return this.filePersistence.reloadNecessary(lastSync);
|
|
79
|
+
}
|
|
80
|
+
getFilePath() {
|
|
81
|
+
return this.filePersistence.getFilePath();
|
|
82
|
+
}
|
|
83
|
+
getLogger() {
|
|
84
|
+
return this.filePersistence.getLogger();
|
|
85
|
+
}
|
|
86
|
+
createForPersistenceValidation() {
|
|
87
|
+
const testCacheFileLocation = `${path.dirname(this.filePersistence.getFilePath())}/test.cache`;
|
|
88
|
+
return LibSecretPersistence.create(testCacheFileLocation, "persistenceValidationServiceName", "persistencValidationAccountName");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
exports.LibSecretPersistence = LibSecretPersistence;
|
|
93
|
+
//# sourceMappingURL=LibSecretPersistence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LibSecretPersistence.js","sources":["../../src/persistence/LibSecretPersistence.ts"],"sourcesContent":[null],"names":["BasePersistence","FilePersistence","setPassword","isNodeError","PersistenceError","getPassword","deletePassword","dirname"],"mappings":"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"}
|
|
@@ -17,7 +17,7 @@ import { TokenCacheContext, ICachePlugin } from "@azure/msal-common";
|
|
|
17
17
|
export declare class PersistenceCachePlugin implements ICachePlugin {
|
|
18
18
|
persistence: IPersistence;
|
|
19
19
|
lastSync: number;
|
|
20
|
-
currentCache: string;
|
|
20
|
+
currentCache: string | null;
|
|
21
21
|
lockFilePath: string;
|
|
22
22
|
private crossPlatformLock;
|
|
23
23
|
private logger;
|