@sudobility/testomniac_runner_service 0.1.74 → 0.1.75

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.
Files changed (47) hide show
  1. package/dist/analyzer/page-analyzer/generators/login.d.ts +15 -0
  2. package/dist/analyzer/page-analyzer/generators/login.d.ts.map +1 -0
  3. package/dist/analyzer/page-analyzer/generators/login.js +209 -0
  4. package/dist/analyzer/page-analyzer/generators/login.js.map +1 -0
  5. package/dist/analyzer/page-analyzer/index.d.ts.map +1 -1
  6. package/dist/analyzer/page-analyzer/index.js +16 -0
  7. package/dist/analyzer/page-analyzer/index.js.map +1 -1
  8. package/dist/analyzer/page-analyzer/types.d.ts +5 -0
  9. package/dist/analyzer/page-analyzer/types.d.ts.map +1 -1
  10. package/dist/api/client.d.ts +11 -0
  11. package/dist/api/client.d.ts.map +1 -1
  12. package/dist/api/client.js +6 -0
  13. package/dist/api/client.js.map +1 -1
  14. package/dist/crawler/link-extractor.d.ts +1 -1
  15. package/dist/crawler/link-extractor.d.ts.map +1 -1
  16. package/dist/crawler/link-extractor.js +4 -1
  17. package/dist/crawler/link-extractor.js.map +1 -1
  18. package/dist/crawler/scope-checker.d.ts +6 -0
  19. package/dist/crawler/scope-checker.d.ts.map +1 -0
  20. package/dist/crawler/scope-checker.js +14 -0
  21. package/dist/crawler/scope-checker.js.map +1 -0
  22. package/dist/index.d.ts +3 -0
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +2 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/orchestrator/login-manager.d.ts +62 -0
  27. package/dist/orchestrator/login-manager.d.ts.map +1 -0
  28. package/dist/orchestrator/login-manager.js +241 -0
  29. package/dist/orchestrator/login-manager.js.map +1 -0
  30. package/dist/orchestrator/runner.d.ts.map +1 -1
  31. package/dist/orchestrator/runner.js +49 -1
  32. package/dist/orchestrator/runner.js.map +1 -1
  33. package/dist/orchestrator/sso-handler.d.ts +29 -0
  34. package/dist/orchestrator/sso-handler.d.ts.map +1 -0
  35. package/dist/orchestrator/sso-handler.js +223 -0
  36. package/dist/orchestrator/sso-handler.js.map +1 -0
  37. package/dist/orchestrator/test-interaction-executor.d.ts +1 -1
  38. package/dist/orchestrator/test-interaction-executor.d.ts.map +1 -1
  39. package/dist/orchestrator/test-interaction-executor.js +35 -1
  40. package/dist/orchestrator/test-interaction-executor.js.map +1 -1
  41. package/dist/orchestrator/types.d.ts +5 -0
  42. package/dist/orchestrator/types.d.ts.map +1 -1
  43. package/dist/scanner/login-detector.d.ts +25 -0
  44. package/dist/scanner/login-detector.d.ts.map +1 -0
  45. package/dist/scanner/login-detector.js +232 -0
  46. package/dist/scanner/login-detector.js.map +1 -0
  47. package/package.json +3 -3
@@ -0,0 +1,232 @@
1
+ // =============================================================================
2
+ // Constants
3
+ // =============================================================================
4
+ const LOGIN_URL_PATTERNS = [
5
+ /\/login\b/i,
6
+ /\/signin\b/i,
7
+ /\/sign-in\b/i,
8
+ /\/auth\b/i,
9
+ /\/sso\b/i,
10
+ /\/authenticate\b/i,
11
+ /\/log-in\b/i,
12
+ /\/account\/login/i,
13
+ ];
14
+ const SSO_PROVIDER_PATTERNS = [
15
+ {
16
+ provider: "google",
17
+ textPatterns: [
18
+ /sign\s*in\s*with\s*google/i,
19
+ /continue\s*with\s*google/i,
20
+ /log\s*in\s*with\s*google/i,
21
+ /google\s*sign[\s-]*in/i,
22
+ ],
23
+ hrefPatterns: [/accounts\.google\.com/i, /googleapis\.com\/auth/i],
24
+ },
25
+ {
26
+ provider: "apple",
27
+ textPatterns: [/sign\s*in\s*with\s*apple/i, /continue\s*with\s*apple/i],
28
+ hrefPatterns: [/appleid\.apple\.com/i],
29
+ },
30
+ {
31
+ provider: "microsoft",
32
+ textPatterns: [
33
+ /sign\s*in\s*with\s*microsoft/i,
34
+ /continue\s*with\s*microsoft/i,
35
+ ],
36
+ hrefPatterns: [/login\.microsoftonline\.com/i, /login\.live\.com/i],
37
+ },
38
+ {
39
+ provider: "twitter",
40
+ textPatterns: [
41
+ /sign\s*in\s*with\s*twitter/i,
42
+ /continue\s*with\s*twitter/i,
43
+ /sign\s*in\s*with\s*x\b/i,
44
+ ],
45
+ hrefPatterns: [/api\.twitter\.com\/oauth/i, /twitter\.com\/i\/oauth/i],
46
+ },
47
+ {
48
+ provider: "facebook",
49
+ textPatterns: [
50
+ /sign\s*in\s*with\s*facebook/i,
51
+ /continue\s*with\s*facebook/i,
52
+ /log\s*in\s*with\s*facebook/i,
53
+ ],
54
+ hrefPatterns: [/facebook\.com\/v\d+.*\/dialog\/oauth/i],
55
+ },
56
+ {
57
+ provider: "github",
58
+ textPatterns: [/sign\s*in\s*with\s*github/i, /continue\s*with\s*github/i],
59
+ hrefPatterns: [/github\.com\/login\/oauth/i],
60
+ },
61
+ {
62
+ provider: "linkedin",
63
+ textPatterns: [
64
+ /sign\s*in\s*with\s*linkedin/i,
65
+ /continue\s*with\s*linkedin/i,
66
+ ],
67
+ hrefPatterns: [/linkedin\.com\/oauth/i],
68
+ },
69
+ {
70
+ provider: "okta",
71
+ textPatterns: [/sign\s*in\s*with\s*okta/i],
72
+ hrefPatterns: [/\.okta\.com/i, /\.oktapreview\.com/i],
73
+ },
74
+ ];
75
+ // =============================================================================
76
+ // Detection
77
+ // =============================================================================
78
+ function matchesUrlPattern(url) {
79
+ return LOGIN_URL_PATTERNS.some(pattern => pattern.test(url));
80
+ }
81
+ function isLoginForm(form) {
82
+ const hasPassword = form.fields.some(f => f.type === "password");
83
+ const hasEmailOrUsername = form.fields.some(f => f.type === "email" ||
84
+ f.name?.toLowerCase().includes("email") ||
85
+ f.name?.toLowerCase().includes("user") ||
86
+ f.name?.toLowerCase().includes("login") ||
87
+ f.placeholder?.toLowerCase().includes("email") ||
88
+ f.placeholder?.toLowerCase().includes("username"));
89
+ const fieldCount = form.fields.filter(f => f.type !== "hidden" && f.type !== "submit").length;
90
+ return hasPassword && hasEmailOrUsername && fieldCount <= 4;
91
+ }
92
+ /**
93
+ * Detect SSO buttons on the current page by evaluating the DOM.
94
+ */
95
+ async function detectSSOButtons(adapter) {
96
+ const buttonData = await adapter.evaluate(() => {
97
+ const results = [];
98
+ const candidates = document.querySelectorAll('a, button, [role="button"], [type="submit"]');
99
+ candidates.forEach((el, idx) => {
100
+ const text = el.textContent?.trim().replace(/\s+/g, " ").slice(0, 200);
101
+ const href = el.getAttribute("href") || "";
102
+ const id = el.id ? `#${el.id}` : "";
103
+ const cls = el.className
104
+ ? `.${String(el.className).split(" ").filter(Boolean).slice(0, 2).join(".")}`
105
+ : "";
106
+ const tag = el.tagName.toLowerCase();
107
+ const selector = id || cls ? `${tag}${id}${cls}` : `${tag}:nth-of-type(${idx + 1})`;
108
+ if (text || href) {
109
+ results.push({ text: text || "", href, selector });
110
+ }
111
+ });
112
+ return results;
113
+ });
114
+ const ssoButtons = [];
115
+ for (const btn of buttonData) {
116
+ for (const providerDef of SSO_PROVIDER_PATTERNS) {
117
+ const textMatch = providerDef.textPatterns.some(p => p.test(btn.text));
118
+ const hrefMatch = providerDef.hrefPatterns.some(p => p.test(btn.href));
119
+ if (textMatch || hrefMatch) {
120
+ ssoButtons.push({
121
+ provider: providerDef.provider,
122
+ selector: btn.selector,
123
+ label: btn.text.slice(0, 100),
124
+ });
125
+ break;
126
+ }
127
+ }
128
+ }
129
+ return ssoButtons;
130
+ }
131
+ async function detectLoginHeadings(adapter) {
132
+ return adapter.evaluate(() => {
133
+ const headings = Array.from(document.querySelectorAll("h1, h2, h3"));
134
+ const patterns = [
135
+ /^sign\s*in$/i,
136
+ /^log\s*in$/i,
137
+ /^login$/i,
138
+ /^welcome\s*back$/i,
139
+ /^sign\s*in\s*to/i,
140
+ /^log\s*in\s*to/i,
141
+ ];
142
+ for (const h of headings) {
143
+ const text = h.textContent?.trim() ?? "";
144
+ if (patterns.some(p => p.test(text)))
145
+ return true;
146
+ }
147
+ return false;
148
+ });
149
+ }
150
+ /**
151
+ * Detect whether the current page is a login page using multiple heuristics.
152
+ */
153
+ export async function detectLoginPage(adapter, currentUrl, forms) {
154
+ const signals = [];
155
+ let loginForm = null;
156
+ const ssoButtons = [];
157
+ // 1. URL pattern check
158
+ if (matchesUrlPattern(currentUrl)) {
159
+ signals.push("url_pattern");
160
+ }
161
+ // 2. Password field check
162
+ const hasPasswordField = await adapter.evaluate(() => {
163
+ const fields = Array.from(document.querySelectorAll('input[type="password"]'));
164
+ for (const f of fields) {
165
+ const el = f;
166
+ if (el.offsetParent !== null || el.offsetWidth > 0)
167
+ return true;
168
+ }
169
+ return false;
170
+ });
171
+ if (hasPasswordField) {
172
+ signals.push("password_field");
173
+ }
174
+ // 3. Email + password form check
175
+ for (const form of forms) {
176
+ if (isLoginForm(form)) {
177
+ signals.push("email_password_form");
178
+ loginForm = form;
179
+ break;
180
+ }
181
+ }
182
+ // 4. SSO button check
183
+ const detectedSSO = await detectSSOButtons(adapter);
184
+ if (detectedSSO.length > 0) {
185
+ signals.push("sso_button");
186
+ ssoButtons.push(...detectedSSO);
187
+ }
188
+ // 5. Login heading check
189
+ const hasLoginHeading = await detectLoginHeadings(adapter);
190
+ if (hasLoginHeading) {
191
+ signals.push("login_heading");
192
+ }
193
+ // Determine confidence
194
+ let confidence = "low";
195
+ const hasFormSignal = signals.includes("email_password_form") ||
196
+ signals.includes("password_field");
197
+ const hasUrlSignal = signals.includes("url_pattern");
198
+ const hasSSOSignal = signals.includes("sso_button");
199
+ if (hasFormSignal && hasUrlSignal) {
200
+ confidence = "high";
201
+ }
202
+ else if (hasFormSignal || (hasUrlSignal && hasSSOSignal)) {
203
+ confidence = "medium";
204
+ }
205
+ const isLoginPage = confidence === "high" ||
206
+ confidence === "medium" ||
207
+ (signals.length >= 2 && confidence === "low");
208
+ return {
209
+ isLoginPage,
210
+ confidence,
211
+ signals,
212
+ loginForm,
213
+ ssoButtons,
214
+ };
215
+ }
216
+ /**
217
+ * Check if a URL matches the explicit login URL or known auth URL patterns.
218
+ */
219
+ export function isLoginUrl(url, explicitLoginUrl) {
220
+ if (explicitLoginUrl) {
221
+ try {
222
+ const current = new URL(url);
223
+ const login = new URL(explicitLoginUrl, url);
224
+ return (current.origin === login.origin && current.pathname === login.pathname);
225
+ }
226
+ catch {
227
+ return url.includes(explicitLoginUrl);
228
+ }
229
+ }
230
+ return matchesUrlPattern(url);
231
+ }
232
+ //# sourceMappingURL=login-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-detector.js","sourceRoot":"","sources":["../../src/scanner/login-detector.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sudobility/testomniac_runner_service",
3
- "version": "0.1.74",
3
+ "version": "0.1.75",
4
4
  "description": "Shared scanning logic for Testomniac scanner and Chrome extension",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -37,7 +37,7 @@
37
37
  "author": "Sudobility",
38
38
  "license": "BUSL-1.1",
39
39
  "peerDependencies": {
40
- "@sudobility/testomniac_types": "^0.0.55",
40
+ "@sudobility/testomniac_types": "^0.0.56",
41
41
  "openai": ">=6.0.0",
42
42
  "react": ">=18.0.0"
43
43
  },
@@ -51,7 +51,7 @@
51
51
  },
52
52
  "devDependencies": {
53
53
  "@eslint/js": "^9.38.0",
54
- "@sudobility/testomniac_types": "^0.0.55",
54
+ "@sudobility/testomniac_types": "^0.0.56",
55
55
  "@types/node": "^25.6.0",
56
56
  "@types/react": "^19.2.0",
57
57
  "@typescript-eslint/eslint-plugin": "^8.46.2",