@linktr.ee/linkapp 0.0.30 → 0.0.31
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-storage.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/token-storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"token-storage.d.ts","sourceRoot":"","sources":["../../../src/lib/auth/token-storage.ts"],"names":[],"mappings":"AAuHA,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAeN;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAsBxD;AAED,wBAAgB,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAuBnD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEtD"}
|
|
@@ -19,61 +19,111 @@ function validateTokenStructure(tokenString) {
|
|
|
19
19
|
throw new Error("Login request was successful, but the authenticated user does not have appropriate permissions to view or modify LinkApps");
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Type guard to check if stored data is in legacy format
|
|
24
|
+
*/
|
|
25
|
+
function isLegacyFormat(data) {
|
|
26
|
+
return (typeof data === "object" &&
|
|
27
|
+
data !== null &&
|
|
28
|
+
"accessToken" in data &&
|
|
29
|
+
"audience" in data &&
|
|
30
|
+
!("tokens" in data));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Reads the token storage, migrating from legacy format if needed
|
|
34
|
+
*/
|
|
35
|
+
function readTokenStorage() {
|
|
36
|
+
if (!existsSync(TOKEN_FILE)) {
|
|
37
|
+
return { tokens: {} };
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const rawData = JSON.parse(readFileSync(TOKEN_FILE, "utf-8"));
|
|
41
|
+
// Check if it's legacy format and migrate
|
|
42
|
+
if (isLegacyFormat(rawData)) {
|
|
43
|
+
const migrated = {
|
|
44
|
+
tokens: {
|
|
45
|
+
[rawData.audience]: {
|
|
46
|
+
accessToken: rawData.accessToken,
|
|
47
|
+
expiresAt: rawData.expiresAt,
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
// Write migrated format back to disk
|
|
52
|
+
writeFileSync(TOKEN_FILE, JSON.stringify(migrated, null, 2), "utf-8");
|
|
53
|
+
return migrated;
|
|
54
|
+
}
|
|
55
|
+
// Already in new format
|
|
56
|
+
return rawData;
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.error("Failed to read token storage:", error);
|
|
60
|
+
return { tokens: {} };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Writes the token storage to disk
|
|
65
|
+
*/
|
|
66
|
+
function writeTokenStorage(storage) {
|
|
25
67
|
// Ensure config directory exists
|
|
26
68
|
if (!existsSync(CONFIG_DIR)) {
|
|
27
69
|
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
28
70
|
}
|
|
29
|
-
|
|
71
|
+
writeFileSync(TOKEN_FILE, JSON.stringify(storage, null, 2), "utf-8");
|
|
72
|
+
}
|
|
73
|
+
export function saveToken(token, audience, expiresAt) {
|
|
74
|
+
// Validate token structure and permissions before saving
|
|
75
|
+
validateTokenStructure(token);
|
|
76
|
+
// Read existing storage (handles migration if needed)
|
|
77
|
+
const storage = readTokenStorage();
|
|
78
|
+
// Add or update token for this audience
|
|
79
|
+
storage.tokens[audience] = {
|
|
30
80
|
accessToken: token,
|
|
31
81
|
expiresAt,
|
|
32
|
-
audience,
|
|
33
82
|
};
|
|
34
|
-
|
|
83
|
+
// Write updated storage
|
|
84
|
+
writeTokenStorage(storage);
|
|
35
85
|
}
|
|
36
86
|
export function getToken(audience) {
|
|
37
|
-
if
|
|
87
|
+
// Read storage (handles migration if needed)
|
|
88
|
+
const storage = readTokenStorage();
|
|
89
|
+
// Get token for this audience
|
|
90
|
+
const tokenEntry = storage.tokens[audience];
|
|
91
|
+
if (!tokenEntry) {
|
|
38
92
|
return null;
|
|
39
93
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
// Check if token is expired (with threshold buffer)
|
|
47
|
-
if (data.expiresAt &&
|
|
48
|
-
data.expiresAt - TOKEN_EXPIRY_THRESHOLD_SECONDS <
|
|
49
|
-
Math.floor(Date.now() / 1000)) {
|
|
50
|
-
removeToken();
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
return data.accessToken;
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
console.error("Failed to read token:", error);
|
|
94
|
+
// Check if token is expired (with threshold buffer)
|
|
95
|
+
if (tokenEntry.expiresAt &&
|
|
96
|
+
tokenEntry.expiresAt - TOKEN_EXPIRY_THRESHOLD_SECONDS <
|
|
97
|
+
Math.floor(Date.now() / 1000)) {
|
|
98
|
+
// Remove expired token
|
|
99
|
+
removeToken(audience);
|
|
57
100
|
return null;
|
|
58
101
|
}
|
|
102
|
+
return tokenEntry.accessToken;
|
|
59
103
|
}
|
|
60
104
|
export function removeToken(audience) {
|
|
61
|
-
if
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
// If audience is specified, only remove token if it matches
|
|
105
|
+
// Read storage (handles migration if needed)
|
|
106
|
+
const storage = readTokenStorage();
|
|
107
|
+
// If audience is specified, only remove that token
|
|
65
108
|
if (audience) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
109
|
+
if (storage.tokens[audience]) {
|
|
110
|
+
delete storage.tokens[audience];
|
|
111
|
+
// If there are remaining tokens, write updated storage
|
|
112
|
+
// Otherwise, delete the file
|
|
113
|
+
if (Object.keys(storage.tokens).length > 0) {
|
|
114
|
+
writeTokenStorage(storage);
|
|
115
|
+
}
|
|
116
|
+
else if (existsSync(TOKEN_FILE)) {
|
|
117
|
+
unlinkSync(TOKEN_FILE);
|
|
70
118
|
}
|
|
71
119
|
}
|
|
72
|
-
|
|
73
|
-
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// No audience specified - remove all tokens
|
|
123
|
+
if (existsSync(TOKEN_FILE)) {
|
|
124
|
+
unlinkSync(TOKEN_FILE);
|
|
74
125
|
}
|
|
75
126
|
}
|
|
76
|
-
unlinkSync(TOKEN_FILE);
|
|
77
127
|
}
|
|
78
128
|
export function isTokenValid(audience) {
|
|
79
129
|
return getToken(audience) !== null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-storage.js","sourceRoot":"","sources":["../../../src/lib/auth/token-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,UAAU,EACV,SAAS,EACT,YAAY,EACZ,aAAa,EACb,UAAU,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,GAAG,MAAM,cAAc,CAAC;AAE/B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACzD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;AACvD,MAAM,8BAA8B,GAAG,EAAE,CAAC,CAAC,kEAAkE;
|
|
1
|
+
{"version":3,"file":"token-storage.js","sourceRoot":"","sources":["../../../src/lib/auth/token-storage.ts"],"names":[],"mappings":"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"}
|