@homebridge-plugins/homebridge-smarthq 0.5.0-beta.39 → 0.5.0-beta.40
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/dist/getAccessToken.d.ts.map +1 -1
- package/dist/getAccessToken.js +186 -4
- package/dist/getAccessToken.js.map +1 -1
- package/docs/classes/SmartHQPlatform.html +11 -11
- package/docs/interfaces/DeviceOptions.html +2 -2
- package/docs/interfaces/SmartHQPlatformConfig.html +2 -2
- package/docs/interfaces/SmartHqContext.html +2 -2
- package/docs/interfaces/SmartHqERDResponse.html +2 -2
- package/docs/interfaces/credentials.html +2 -2
- package/docs/interfaces/devicesConfig.html +2 -2
- package/docs/interfaces/options.html +2 -2
- package/docs/variables/API_URL.html +1 -1
- package/docs/variables/ERD_CODES.html +1 -1
- package/docs/variables/ERD_TYPES.html +1 -1
- package/docs/variables/KEEPALIVE_TIMEOUT.html +1 -1
- package/docs/variables/LOGIN_URL.html +1 -1
- package/docs/variables/OAUTH2_CLIENT_ID.html +1 -1
- package/docs/variables/OAUTH2_CLIENT_SECRET.html +1 -1
- package/docs/variables/OAUTH2_REDIRECT_URI.html +1 -1
- package/docs/variables/PLATFORM_NAME.html +1 -1
- package/docs/variables/PLUGIN_NAME.html +1 -1
- package/docs/variables/SECURE_URL.html +1 -1
- package/docs/variables/default.html +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAccessToken.d.ts","sourceRoot":"","sources":["../src/getAccessToken.ts"],"names":[],"mappings":"AAoBA,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,6CAG7D;AAED,wBAA8B,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"getAccessToken.d.ts","sourceRoot":"","sources":["../src/getAccessToken.ts"],"names":[],"mappings":"AAoBA,wBAAsB,kBAAkB,CAAC,aAAa,EAAE,MAAM,6CAG7D;AAED,wBAA8B,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,6CAoN9E"}
|
package/dist/getAccessToken.js
CHANGED
|
@@ -4,7 +4,7 @@ import * as cheerio from 'cheerio';
|
|
|
4
4
|
import pkg from 'lodash';
|
|
5
5
|
import { Issuer } from 'openid-client';
|
|
6
6
|
import { CookieJar } from 'tough-cookie';
|
|
7
|
-
import { OAUTH2_CLIENT_ID, OAUTH2_CLIENT_SECRET, OAUTH2_REDIRECT_URI } from './settings.js';
|
|
7
|
+
import { OAUTH2_CLIENT_ID, OAUTH2_CLIENT_SECRET, OAUTH2_REDIRECT_URI, LOGIN_URL } from './settings.js';
|
|
8
8
|
const { keyBy, mapValues } = pkg;
|
|
9
9
|
const oidcClient = Issuer.discover('https://accounts.brillion.geappliances.com/').then(geData => new geData.Client({
|
|
10
10
|
client_id: OAUTH2_CLIENT_ID,
|
|
@@ -35,10 +35,192 @@ export default async function getAccessToken(username, password) {
|
|
|
35
35
|
maxRedirects: 0,
|
|
36
36
|
validateStatus: () => true,
|
|
37
37
|
});
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
// If the initial POST did not return a redirect with the code, the login
|
|
39
|
+
// flow may have hit an intermediate page (MFA enrollment or Terms acceptance).
|
|
40
|
+
// Attempt to handle those pages automatically; fall back to an error with
|
|
41
|
+
// guidance if not possible.
|
|
42
|
+
const tryExtractCodeFromLocation = (location) => {
|
|
43
|
+
if (!location)
|
|
44
|
+
return null;
|
|
45
|
+
try {
|
|
46
|
+
return new URL(location).searchParams.get('code');
|
|
47
|
+
}
|
|
48
|
+
catch (e) {
|
|
49
|
+
// Handle relative URLs
|
|
50
|
+
try {
|
|
51
|
+
const full = location.startsWith('/') ? `${LOGIN_URL}${location}` : location;
|
|
52
|
+
return new URL(full).searchParams.get('code');
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
let code = tryExtractCodeFromLocation(res.headers.location);
|
|
60
|
+
if (!code) {
|
|
61
|
+
// Try to handle HTML response pages (MFA or Terms)
|
|
62
|
+
const asyncHandleOkResponse = async (respText) => {
|
|
63
|
+
// MFA enrollment page
|
|
64
|
+
if (respText.includes('Add Multi-Factor Authentication') || respText.includes('addMfaForm')) {
|
|
65
|
+
try {
|
|
66
|
+
const $ = cheerio.load(respText);
|
|
67
|
+
const mfaForm = $('#addMfaForm');
|
|
68
|
+
if (!mfaForm || mfaForm.length === 0) {
|
|
69
|
+
throw new Error('MFA form not found');
|
|
70
|
+
}
|
|
71
|
+
const formData = {};
|
|
72
|
+
mfaForm.find('input').each((i, el) => {
|
|
73
|
+
const name = $(el).attr('name');
|
|
74
|
+
if (!name)
|
|
75
|
+
return;
|
|
76
|
+
formData[name] = $(el).val() || '';
|
|
77
|
+
});
|
|
78
|
+
// Try meta tag for CSRF if not present
|
|
79
|
+
if (!formData['_csrf']) {
|
|
80
|
+
const csrfMeta = $('meta[name="_csrf"]').attr('content');
|
|
81
|
+
if (csrfMeta)
|
|
82
|
+
formData['_csrf'] = csrfMeta;
|
|
83
|
+
}
|
|
84
|
+
const postData = new URLSearchParams(formData);
|
|
85
|
+
const skipResp = await aclient({
|
|
86
|
+
method: 'POST',
|
|
87
|
+
url: `${LOGIN_URL}/account/active/redirect`,
|
|
88
|
+
data: postData,
|
|
89
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded' },
|
|
90
|
+
maxRedirects: 0,
|
|
91
|
+
validateStatus: () => true,
|
|
92
|
+
});
|
|
93
|
+
const loc = skipResp.headers.location;
|
|
94
|
+
const gotCode = tryExtractCodeFromLocation(loc);
|
|
95
|
+
if (gotCode)
|
|
96
|
+
return gotCode;
|
|
97
|
+
// Follow redirect manually if provided
|
|
98
|
+
if (loc) {
|
|
99
|
+
const resolved = loc.startsWith('/') ? `${LOGIN_URL}${loc}` : loc;
|
|
100
|
+
const redirectResp = await aclient.get(resolved, { maxRedirects: 0, validateStatus: () => true });
|
|
101
|
+
const finalLoc = redirectResp.headers.location;
|
|
102
|
+
const finalCode = tryExtractCodeFromLocation(finalLoc);
|
|
103
|
+
if (finalCode)
|
|
104
|
+
return finalCode;
|
|
105
|
+
if (redirectResp.status === 200)
|
|
106
|
+
return await asyncHandleOkResponse(await redirectResp.data);
|
|
107
|
+
}
|
|
108
|
+
if (skipResp.status === 200)
|
|
109
|
+
return await asyncHandleOkResponse(await skipResp.data);
|
|
110
|
+
throw new Error('MFA skip failed');
|
|
111
|
+
}
|
|
112
|
+
catch (e) {
|
|
113
|
+
throw new Error(`MFA handling failed: ${e.message}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Terms acceptance page
|
|
117
|
+
if (respText.includes('Almost Finished') && respText.includes('/oauth2/terms/accept')) {
|
|
118
|
+
try {
|
|
119
|
+
const $ = cheerio.load(respText);
|
|
120
|
+
let termsForm = $('#termsform');
|
|
121
|
+
if (!termsForm || termsForm.length === 0) {
|
|
122
|
+
termsForm = $("form[name='termsform']");
|
|
123
|
+
}
|
|
124
|
+
if (!termsForm || termsForm.length === 0) {
|
|
125
|
+
// Fallback: try to extract required fields with regex
|
|
126
|
+
const formData = {};
|
|
127
|
+
const sigMatch = respText.match(/name="signature"\\s+value="([^\"]+)"/);
|
|
128
|
+
if (sigMatch)
|
|
129
|
+
formData['signature'] = sigMatch[1];
|
|
130
|
+
const lasMatch = respText.match(/name="login_actions_signature"[^>]*value=([^>\\s>]+)/);
|
|
131
|
+
if (lasMatch)
|
|
132
|
+
formData['login_actions_signature'] = lasMatch[1].replace(/>$/, '');
|
|
133
|
+
const devMatch = respText.match(/name="isDeveloper"\\s+value="([^\"]+)"/);
|
|
134
|
+
if (devMatch)
|
|
135
|
+
formData['isDeveloper'] = devMatch[1];
|
|
136
|
+
const csrfMatch = respText.match(/name="_csrf"\\s+value="([^\"]+)"/);
|
|
137
|
+
if (csrfMatch)
|
|
138
|
+
formData['_csrf'] = csrfMatch[1];
|
|
139
|
+
formData['developerTerms'] = 'on';
|
|
140
|
+
formData['connected_terms'] = 'on';
|
|
141
|
+
const headers = {};
|
|
142
|
+
if (formData['_csrf'])
|
|
143
|
+
headers['X-CSRF-TOKEN'] = formData['_csrf'];
|
|
144
|
+
const termsResp = await aclient({
|
|
145
|
+
method: 'POST',
|
|
146
|
+
url: `${LOGIN_URL}/oauth2/terms/accept`,
|
|
147
|
+
data: new URLSearchParams(formData),
|
|
148
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded', ...headers },
|
|
149
|
+
maxRedirects: 0,
|
|
150
|
+
validateStatus: () => true,
|
|
151
|
+
});
|
|
152
|
+
const loc = termsResp.headers.location;
|
|
153
|
+
const gotCode = tryExtractCodeFromLocation(loc);
|
|
154
|
+
if (gotCode)
|
|
155
|
+
return gotCode;
|
|
156
|
+
if (loc) {
|
|
157
|
+
const resolved = loc.startsWith('/') ? `${LOGIN_URL}${loc}` : loc;
|
|
158
|
+
const redirectResp = await aclient.get(resolved, { maxRedirects: 0, validateStatus: () => true });
|
|
159
|
+
const finalCode = tryExtractCodeFromLocation(redirectResp.headers.location);
|
|
160
|
+
if (finalCode)
|
|
161
|
+
return finalCode;
|
|
162
|
+
if (redirectResp.status === 200)
|
|
163
|
+
return await asyncHandleOkResponse(await redirectResp.data);
|
|
164
|
+
}
|
|
165
|
+
if (termsResp.status === 200)
|
|
166
|
+
return await asyncHandleOkResponse(await termsResp.data);
|
|
167
|
+
throw new Error('Terms acceptance failed');
|
|
168
|
+
}
|
|
169
|
+
// Collect inputs from the form
|
|
170
|
+
const formData = {};
|
|
171
|
+
termsForm.find('input').each((i, el) => {
|
|
172
|
+
const name = $(el).attr('name');
|
|
173
|
+
if (!name)
|
|
174
|
+
return;
|
|
175
|
+
formData[name] = $(el).val() || '';
|
|
176
|
+
});
|
|
177
|
+
// Set checkboxes to accepted
|
|
178
|
+
formData['developerTerms'] = 'on';
|
|
179
|
+
formData['connected_terms'] = 'on';
|
|
180
|
+
if (!formData['_csrf']) {
|
|
181
|
+
const csrfMeta = $('meta[name="_csrf"]').attr('content');
|
|
182
|
+
if (csrfMeta)
|
|
183
|
+
formData['_csrf'] = csrfMeta;
|
|
184
|
+
}
|
|
185
|
+
const headers = {};
|
|
186
|
+
if (formData['_csrf'])
|
|
187
|
+
headers['X-CSRF-TOKEN'] = formData['_csrf'];
|
|
188
|
+
const termsResp = await aclient({
|
|
189
|
+
method: 'POST',
|
|
190
|
+
url: `${LOGIN_URL}/oauth2/terms/accept`,
|
|
191
|
+
data: new URLSearchParams(formData),
|
|
192
|
+
headers: { 'content-type': 'application/x-www-form-urlencoded', ...headers },
|
|
193
|
+
maxRedirects: 0,
|
|
194
|
+
validateStatus: () => true,
|
|
195
|
+
});
|
|
196
|
+
const loc = termsResp.headers.location;
|
|
197
|
+
const gotCode = tryExtractCodeFromLocation(loc);
|
|
198
|
+
if (gotCode)
|
|
199
|
+
return gotCode;
|
|
200
|
+
if (loc) {
|
|
201
|
+
const resolved = loc.startsWith('/') ? `${LOGIN_URL}${loc}` : loc;
|
|
202
|
+
const redirectResp = await aclient.get(resolved, { maxRedirects: 0, validateStatus: () => true });
|
|
203
|
+
const finalCode = tryExtractCodeFromLocation(redirectResp.headers.location);
|
|
204
|
+
if (finalCode)
|
|
205
|
+
return finalCode;
|
|
206
|
+
if (redirectResp.status === 200)
|
|
207
|
+
return await asyncHandleOkResponse(await redirectResp.data);
|
|
208
|
+
}
|
|
209
|
+
if (termsResp.status === 200)
|
|
210
|
+
return await asyncHandleOkResponse(await termsResp.data);
|
|
211
|
+
throw new Error('Terms acceptance failed');
|
|
212
|
+
}
|
|
213
|
+
catch (e) {
|
|
214
|
+
throw new Error(`Terms handling failed: ${e.message}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
throw new Error('Authentication failed: No authorization code received and no known intermediate page detected');
|
|
218
|
+
};
|
|
219
|
+
// If we have HTML in the response, try to handle it
|
|
220
|
+
if (res.data && typeof res.data === 'string') {
|
|
221
|
+
code = await asyncHandleOkResponse(res.data);
|
|
222
|
+
}
|
|
40
223
|
}
|
|
41
|
-
const code = new URL(res.headers.location).searchParams.get('code');
|
|
42
224
|
if (!code) {
|
|
43
225
|
throw new Error('Authentication failed: No authorization code received');
|
|
44
226
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getAccessToken.js","sourceRoot":"","sources":["../src/getAccessToken.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AACjD,OAAO,KAAK,OAAO,MAAM,SAAS,CAAA;AAClC,OAAO,GAAG,MAAM,QAAQ,CAAA;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"getAccessToken.js","sourceRoot":"","sources":["../src/getAccessToken.ts"],"names":[],"mappings":"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"}
|