@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.
@@ -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,6CAuC9E"}
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"}
@@ -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
- if (!res.headers.location) {
39
- throw new Error('Authentication failed: No redirect location received');
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":"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"}
1
+ {"version":3,"file":"getAccessToken.js","sourceRoot":"","sources":["../src/getAccessToken.ts"],"names":[],"mappings":"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"}