github-issue-tower-defence-management 1.35.1 → 1.35.2
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/CHANGELOG.md +8 -0
- package/bin/adapter/repositories/BaseGitHubRepository.js +6 -4
- package/bin/adapter/repositories/BaseGitHubRepository.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/repositories/BaseGitHubRepository.test.ts +131 -0
- package/src/adapter/repositories/BaseGitHubRepository.ts +8 -4
- package/types/adapter/repositories/BaseGitHubRepository.d.ts.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
## [1.35.2](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.35.1...v1.35.2) (2026-04-04)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* **core:** use profile page URL in refreshCookie to reliably detect login status ([1f594e4](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/1f594e4e0220a2870e301d23e3d4cfc1e33880b1)), closes [#397](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/397)
|
|
7
|
+
* **core:** use user-login meta tag to detect authenticated GitHub session ([17517f8](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/17517f8c7002e10d14914a2b4e8c72a93ed9fa67))
|
|
8
|
+
|
|
1
9
|
## [1.35.1](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.35.0...v1.35.1) (2026-04-03)
|
|
2
10
|
|
|
3
11
|
|
|
@@ -128,19 +128,21 @@ class BaseGitHubRepository {
|
|
|
128
128
|
if (!this.ghUserName || !this.ghUserPassword || !this.ghAuthenticatorKey) {
|
|
129
129
|
throw new Error('GitHub username, password, and authenticator key must be set');
|
|
130
130
|
}
|
|
131
|
+
const profileUrl = `https://github.com/${this.ghUserName}`;
|
|
131
132
|
const headers = await this.createHeader();
|
|
132
|
-
const content = await axios_1.default.get(
|
|
133
|
+
const content = await axios_1.default.get(profileUrl, { headers });
|
|
133
134
|
const html = content.data;
|
|
134
|
-
if (html.includes(this.ghUserName)) {
|
|
135
|
+
if (html.includes(`meta name="user-login" content="${this.ghUserName}"`)) {
|
|
135
136
|
return;
|
|
136
137
|
}
|
|
137
138
|
this.localStorageRepository.remove(this.jsonFilePath);
|
|
139
|
+
this.cookie = null;
|
|
138
140
|
const newHeaders = await this.createHeader();
|
|
139
|
-
const newContent = await axios_1.default.get(
|
|
141
|
+
const newContent = await axios_1.default.get(profileUrl, {
|
|
140
142
|
headers: newHeaders,
|
|
141
143
|
});
|
|
142
144
|
const newHtml = newContent.data;
|
|
143
|
-
if (newHtml.includes(this.ghUserName)) {
|
|
145
|
+
if (newHtml.includes(`meta name="user-login" content="${this.ghUserName}"`)) {
|
|
144
146
|
return;
|
|
145
147
|
}
|
|
146
148
|
throw new Error('Failed to refresh cookie');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseGitHubRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/BaseGitHubRepository.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"BaseGitHubRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/BaseGitHubRepository.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,6 +2,20 @@ import fs from 'fs';
|
|
|
2
2
|
import { BaseGitHubRepository } from './BaseGitHubRepository';
|
|
3
3
|
import resetAllMocks = jest.resetAllMocks;
|
|
4
4
|
import { LocalStorageRepository } from './LocalStorageRepository';
|
|
5
|
+
|
|
6
|
+
const mockAxiosGet = jest.fn<Promise<unknown>, unknown[]>();
|
|
7
|
+
jest.mock('axios', () => ({
|
|
8
|
+
default: {
|
|
9
|
+
get: (...args: unknown[]): Promise<unknown> => mockAxiosGet(...args),
|
|
10
|
+
},
|
|
11
|
+
get: (...args: unknown[]): Promise<unknown> => mockAxiosGet(...args),
|
|
12
|
+
}));
|
|
13
|
+
|
|
14
|
+
const mockGetCookieContent = jest.fn<Promise<unknown>, unknown[]>();
|
|
15
|
+
jest.mock('gh-cookie', () => ({
|
|
16
|
+
getCookieContent: (...args: unknown[]): Promise<unknown> =>
|
|
17
|
+
mockGetCookieContent(...args),
|
|
18
|
+
}));
|
|
5
19
|
describe('BaseGitHubRepository', () => {
|
|
6
20
|
const jsonFilePath = './tmp/github.com.cookies.json';
|
|
7
21
|
const localStorageRepository = new LocalStorageRepository();
|
|
@@ -94,4 +108,121 @@ describe('BaseGitHubRepository', () => {
|
|
|
94
108
|
expect(baseGitHubRepository.isCookiePublic(cookie)).toBe(false);
|
|
95
109
|
});
|
|
96
110
|
});
|
|
111
|
+
|
|
112
|
+
describe('refreshCookie', () => {
|
|
113
|
+
const localStorageRepositoryForRefresh = new LocalStorageRepository();
|
|
114
|
+
const refreshCookieJsonFilePath =
|
|
115
|
+
'./tmp/refresh-test-github.com.cookies.json';
|
|
116
|
+
const ghUserName = 'testuser';
|
|
117
|
+
class RefreshTestRepository extends BaseGitHubRepository {
|
|
118
|
+
constructor() {
|
|
119
|
+
super(
|
|
120
|
+
localStorageRepositoryForRefresh,
|
|
121
|
+
refreshCookieJsonFilePath,
|
|
122
|
+
'dummy-token',
|
|
123
|
+
ghUserName,
|
|
124
|
+
'dummy-password',
|
|
125
|
+
'dummy-authenticator-key',
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const validCookieJson = JSON.stringify([
|
|
131
|
+
{
|
|
132
|
+
name: 'name',
|
|
133
|
+
value: 'value',
|
|
134
|
+
domain: 'domain',
|
|
135
|
+
path: 'path',
|
|
136
|
+
expires: 1,
|
|
137
|
+
httpOnly: true,
|
|
138
|
+
secure: true,
|
|
139
|
+
sameSite: 'Lax',
|
|
140
|
+
},
|
|
141
|
+
]);
|
|
142
|
+
|
|
143
|
+
beforeEach(() => {
|
|
144
|
+
mockAxiosGet.mockReset();
|
|
145
|
+
mockGetCookieContent.mockReset();
|
|
146
|
+
mockGetCookieContent.mockResolvedValue(validCookieJson);
|
|
147
|
+
fs.writeFileSync(refreshCookieJsonFilePath, validCookieJson);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
afterEach(() => {
|
|
151
|
+
if (fs.existsSync(refreshCookieJsonFilePath)) {
|
|
152
|
+
fs.rmSync(refreshCookieJsonFilePath);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it('should return when HTML contains user-login meta tag for current user (logged in)', async () => {
|
|
157
|
+
const repository = new RefreshTestRepository();
|
|
158
|
+
mockAxiosGet.mockResolvedValueOnce({
|
|
159
|
+
data: `<html><head><meta name="user-login" content="${ghUserName}"></head><body><h1>${ghUserName}</h1></body></html>`,
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
await expect(repository.refreshCookie()).resolves.toBeUndefined();
|
|
163
|
+
|
|
164
|
+
expect(mockAxiosGet).toHaveBeenCalledWith(
|
|
165
|
+
`https://github.com/${ghUserName}`,
|
|
166
|
+
expect.anything(),
|
|
167
|
+
);
|
|
168
|
+
expect(mockAxiosGet).toHaveBeenCalledTimes(1);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
it('should fail when HTML contains username in content but not in user-login meta tag (not logged in)', async () => {
|
|
172
|
+
const repository = new RefreshTestRepository();
|
|
173
|
+
const notLoggedInHtml = `<html><head><meta name="user-login" content=""></head><body><h1>${ghUserName}</h1><p>Public profile</p></body></html>`;
|
|
174
|
+
mockAxiosGet
|
|
175
|
+
.mockResolvedValueOnce({ data: notLoggedInHtml })
|
|
176
|
+
.mockResolvedValueOnce({ data: notLoggedInHtml });
|
|
177
|
+
|
|
178
|
+
await expect(repository.refreshCookie()).rejects.toThrow(
|
|
179
|
+
'Failed to refresh cookie',
|
|
180
|
+
);
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('should use profile page URL not homepage to check authentication', async () => {
|
|
184
|
+
const repository = new RefreshTestRepository();
|
|
185
|
+
mockAxiosGet.mockResolvedValueOnce({
|
|
186
|
+
data: `<html><head><meta name="user-login" content="${ghUserName}"></head><body></body></html>`,
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
await repository.refreshCookie();
|
|
190
|
+
|
|
191
|
+
expect(mockAxiosGet).toHaveBeenCalledWith(
|
|
192
|
+
`https://github.com/${ghUserName}`,
|
|
193
|
+
expect.anything(),
|
|
194
|
+
);
|
|
195
|
+
expect(mockAxiosGet).not.toHaveBeenCalledWith(
|
|
196
|
+
'https://github.com',
|
|
197
|
+
expect.anything(),
|
|
198
|
+
);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it('should throw when both profile page checks fail', async () => {
|
|
202
|
+
const repository = new RefreshTestRepository();
|
|
203
|
+
const notLoggedInHtml = `<html><head><meta name="user-login" content=""></head><body></body></html>`;
|
|
204
|
+
mockAxiosGet
|
|
205
|
+
.mockResolvedValueOnce({ data: notLoggedInHtml })
|
|
206
|
+
.mockResolvedValueOnce({ data: notLoggedInHtml });
|
|
207
|
+
|
|
208
|
+
await expect(repository.refreshCookie()).rejects.toThrow(
|
|
209
|
+
'Failed to refresh cookie',
|
|
210
|
+
);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it('should reset cookie cache before regenerating so new cookie is used', async () => {
|
|
214
|
+
const repository = new RefreshTestRepository();
|
|
215
|
+
mockAxiosGet
|
|
216
|
+
.mockResolvedValueOnce({
|
|
217
|
+
data: `<html><head><meta name="user-login" content=""></head><body></body></html>`,
|
|
218
|
+
})
|
|
219
|
+
.mockResolvedValueOnce({
|
|
220
|
+
data: `<html><head><meta name="user-login" content="${ghUserName}"></head><body></body></html>`,
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
await expect(repository.refreshCookie()).resolves.toBeUndefined();
|
|
224
|
+
expect(mockAxiosGet).toHaveBeenCalledTimes(2);
|
|
225
|
+
expect(mockGetCookieContent).toHaveBeenCalledTimes(1);
|
|
226
|
+
});
|
|
227
|
+
});
|
|
97
228
|
});
|
|
@@ -167,19 +167,23 @@ export class BaseGitHubRepository {
|
|
|
167
167
|
'GitHub username, password, and authenticator key must be set',
|
|
168
168
|
);
|
|
169
169
|
}
|
|
170
|
+
const profileUrl = `https://github.com/${this.ghUserName}`;
|
|
170
171
|
const headers = await this.createHeader();
|
|
171
|
-
const content = await axios.get<string>(
|
|
172
|
+
const content = await axios.get<string>(profileUrl, { headers });
|
|
172
173
|
const html = content.data;
|
|
173
|
-
if (html.includes(this.ghUserName)) {
|
|
174
|
+
if (html.includes(`meta name="user-login" content="${this.ghUserName}"`)) {
|
|
174
175
|
return;
|
|
175
176
|
}
|
|
176
177
|
this.localStorageRepository.remove(this.jsonFilePath);
|
|
178
|
+
this.cookie = null;
|
|
177
179
|
const newHeaders = await this.createHeader();
|
|
178
|
-
const newContent = await axios.get<string>(
|
|
180
|
+
const newContent = await axios.get<string>(profileUrl, {
|
|
179
181
|
headers: newHeaders,
|
|
180
182
|
});
|
|
181
183
|
const newHtml = newContent.data;
|
|
182
|
-
if (
|
|
184
|
+
if (
|
|
185
|
+
newHtml.includes(`meta name="user-login" content="${this.ghUserName}"`)
|
|
186
|
+
) {
|
|
183
187
|
return;
|
|
184
188
|
}
|
|
185
189
|
throw new Error('Failed to refresh cookie');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseGitHubRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/BaseGitHubRepository.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,UAAU,MAAM;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACtC;AAED,qBAAa,oBAAoB;IAG7B,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB;IACvD,QAAQ,CAAC,YAAY,EAAE,MAAM;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS;IAC3C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS;IAPjD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;gBAEX,sBAAsB,EAAE,sBAAsB,EAC9C,YAAY,GAAE,MAAwC,EACtD,OAAO,GAAE,MAAwC,EACjD,UAAU,GAAE,MAAM,GAAG,SAAoC,EACzD,cAAc,GAAE,MAAM,GAAG,SAAwC,EACjE,kBAAkB,GAAE,MAAM,GAAG,SACf;IAIzB,SAAS,CAAC,mBAAmB,GAC3B,UAAU,MAAM,KACf;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAevE;IAEF,SAAS,QAAa,OAAO,CAAC,MAAM,CAAC,CAKnC;IACF,YAAY,QAAa,OAAO,CAAC,MAAM,CAAC,CAwBtC;IACF,SAAS,CAAC,0BAA0B,QAAa,OAAO,CAAC,MAAM,CAAC,CAqB9D;IACF,SAAS,CAAC,QAAQ,GAAI,QAAQ,MAAM,KAAG,MAAM,IAAI,MAAM,CAoBrD;IAEF,SAAS,CAAC,4BAA4B,GACpC,YAAY,OAAO,KAClB,OAAO,CAAC,MAAM,CAAC,CAmChB;IACF,aAAa,QAAa,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"BaseGitHubRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/BaseGitHubRepository.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAGlE,UAAU,MAAM;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACtC;AAED,qBAAa,oBAAoB;IAG7B,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB;IACvD,QAAQ,CAAC,YAAY,EAAE,MAAM;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS;IAC3C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,GAAG,SAAS;IAPjD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;gBAEX,sBAAsB,EAAE,sBAAsB,EAC9C,YAAY,GAAE,MAAwC,EACtD,OAAO,GAAE,MAAwC,EACjD,UAAU,GAAE,MAAM,GAAG,SAAoC,EACzD,cAAc,GAAE,MAAM,GAAG,SAAwC,EACjE,kBAAkB,GAAE,MAAM,GAAG,SACf;IAIzB,SAAS,CAAC,mBAAmB,GAC3B,UAAU,MAAM,KACf;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAevE;IAEF,SAAS,QAAa,OAAO,CAAC,MAAM,CAAC,CAKnC;IACF,YAAY,QAAa,OAAO,CAAC,MAAM,CAAC,CAwBtC;IACF,SAAS,CAAC,0BAA0B,QAAa,OAAO,CAAC,MAAM,CAAC,CAqB9D;IACF,SAAS,CAAC,QAAQ,GAAI,QAAQ,MAAM,KAAG,MAAM,IAAI,MAAM,CAoBrD;IAEF,SAAS,CAAC,4BAA4B,GACpC,YAAY,OAAO,KAClB,OAAO,CAAC,MAAM,CAAC,CAmChB;IACF,aAAa,QAAa,OAAO,CAAC,IAAI,CAAC,CA0BrC;CACH"}
|