File size: 9,928 Bytes
494c89b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
#!/usr/bin/env python3
"""
Запуск полной отладки регистрации AWS Builder ID

Использование:
    python -m debugger.run
    
    # или из autoreg/
    python debugger/run.py
"""

import os
import sys
import time

# Добавляем путь к autoreg
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from debugger import DebugSession


def run_debug_registration():
    """Запускает полную отладку регистрации"""
    
    # Создаём сессию
    session = DebugSession()
    
    # Импортируем модули регистрации
    from registration.register import AWSRegistration
    from registration.browser import BrowserAutomation
    from registration.oauth_pkce import OAuthPKCE
    from core.email_generator import EmailGenerator
    
    reg = AWSRegistration(headless=False)
    
    try:
        # === INIT ===
        session.start_step("init")
        
        generator = EmailGenerator.from_env()
        email_result = generator.generate()
        session.note(f"Email: {email_result.registration_email}")
        session.note(f"Name: {email_result.display_name}")
        
        reg._init_mail()
        session.note("IMAP connected")
        
        session.end_step()
        
        # === OAUTH ===
        session.start_step("oauth_start")
        
        reg.oauth = OAuthPKCE()
        auth_url = reg.oauth.start(account_name=email_result.registration_email.split('@')[0])
        session.note(f"Auth URL: {auth_url[:60]}...")
        session.note(f"Callback port: {reg.oauth.port}")
        
        session.end_step()
        
        # === BROWSER ===
        session.start_step("browser_init")
        
        reg.browser = BrowserAutomation(headless=False, email=email_result.registration_email)
        
        # Подключаем дебаггер к браузеру
        session.attach(reg.browser.page)
        
        # Пропускаем prewarm для ускорения дебага
        # reg.browser.prewarm()
        session.note("Browser ready (prewarm skipped for debug)")
        
        session.end_step()
        
        # === NAVIGATE ===
        session.start_step("navigate")
        
        reg.browser.navigate(auth_url)
        session.collect()
        session.monitor(duration=5)
        
        session.end_step()
        
        # === EMAIL ===
        session.start_step("email_input")
        
        reg.browser.enter_email(email_result.registration_email)
        session.collect()
        
        reg.browser.click_continue()
        session.note("Clicked Continue")
        
        session.monitor(duration=10)
        
        session.end_step()
        
        # === NAME ===
        session.start_step("name_input")
        
        reg.browser.enter_name(email_result.display_name)
        session.collect()
        session.monitor(duration=5)
        
        session.end_step()
        
        # === VERIFICATION CODE ===
        session.start_step("verification_code")
        
        session.note("Waiting for email...")
        code = reg.mail_handler.get_verification_code(email_result.imap_lookup_email, timeout=90)
        
        if not code:
            session.end_step("No verification code received")
            raise Exception("No verification code")
        
        session.note(f"Code received: {code}")
        reg.browser.enter_verification_code(code)
        session.collect()
        session.monitor(duration=10)
        
        session.end_step()
        
        # === PASSWORD ===
        session.start_step("password_input")
        
        password = reg.browser.generate_password()
        session.note(f"Password: {password}")
        
        pwd_fields = reg.browser.page.eles('tag:input@@type=password', timeout=3)
        session.note(f"Found {len(pwd_fields)} password fields")
        
        if len(pwd_fields) >= 2:
            reg.browser.human_type(pwd_fields[0], password, field_type='password')
            session.note("First password entered")
            time.sleep(0.5)
            reg.browser.human_type(pwd_fields[1], password, field_type='password')
            session.note("Second password entered")
        
        session.collect()
        session.end_step()
        
        # === PASSWORD SUBMIT - КРИТИЧЕСКИЙ МОМЕНТ ===
        session.start_step("password_submit")
        
        reg.browser._click_if_exists(['@data-testid=test-primary-button'], timeout=1)
        session.note("Clicked Continue")
        
        # Мониторим долго - это где происходит зависание
        session.note("Monitoring redirect (up to 120s)...")
        
        workflow_success_detected = False
        
        def check_success():
            """Проверяет условия успеха"""
            nonlocal workflow_success_detected
            
            # Собираем данные
            session.collect()
            
            # Проверяем cookies
            for collector in session._collectors:
                if hasattr(collector, 'is_workflow_success') and collector.is_workflow_success():
                    if not workflow_success_detected:
                        session.note("🎉 WORKFLOW SUCCESS via cookie!")
                        workflow_success_detected = True
                    break
            
            # Проверяем URL
            url = session.page.url if session.page else ""
            if 'awsapps.com' in url:
                session.note(f"Reached awsapps.com")
                return True
            if '127.0.0.1' in url and 'callback' in url:
                session.note(f"Reached callback")
                return True
            
            return False
        
        success = session.monitor(duration=120, interval=1, stop_condition=check_success)
        
        # Если workflow success но редирект не произошёл - пробуем форсировать
        if workflow_success_detected and not success:
            session.note("⚠️ Workflow success but no redirect - trying to force...")
            
            # Пробуем получить redirect URL из страницы
            try:
                redirect_info = session.page.run_js(r'''
                    // Ищем redirect URL в странице
                    const scripts = document.querySelectorAll('script');
                    for (const s of scripts) {
                        const text = s.textContent || '';
                        const match = text.match(/redirect[Uu]rl["']?\s*[:=]\s*["']([^"']+)/);
                        if (match) return {found: true, url: match[1]};
                    }
                    
                    // Ищем в meta refresh
                    const meta = document.querySelector('meta[http-equiv="refresh"]');
                    if (meta) {
                        const content = meta.getAttribute('content') || '';
                        const match = content.match(/url=(.+)/i);
                        if (match) return {found: true, url: match[1]};
                    }
                    
                    // Ищем ссылки на awsapps
                    const links = document.querySelectorAll('a[href*="awsapps"]');
                    if (links.length) return {found: true, url: links[0].href};
                    
                    return {found: false};
                ''')
                
                if redirect_info and redirect_info.get('found'):
                    session.note(f"Found redirect URL: {redirect_info.get('url', '')[:50]}...")
                else:
                    session.note("No redirect URL found in page")
                    
            except Exception as e:
                session.note(f"Error searching for redirect: {e}")
        
        if not success:
            session.note("Timeout waiting for redirect")
        
        session.end_step()
        
        # === ALLOW ACCESS ===
        session.start_step("allow_access")
        
        current_url = session.page.url if session.page else ""
        if 'awsapps.com' in current_url:
            session.note("On awsapps.com, clicking Allow access...")
            reg.browser.click_allow_access()
            session.monitor(duration=10)
        else:
            session.note(f"Not on awsapps.com, current URL: {current_url[:50]}...")
        
        session.end_step()
        
        # === OAUTH CALLBACK ===
        session.start_step("oauth_callback")
        
        success = reg.oauth.wait_for_callback(timeout=30)
        if success:
            session.note(f"Token: {reg.oauth.get_token_filename()}")
        else:
            session.note("Callback timeout")
        
        session.end_step()
        
    except Exception as e:
        import traceback
        session.note(f"EXCEPTION: {e}")
        session.note(traceback.format_exc())
        if session.current_step:
            session.end_step(str(e))
    
    finally:
        # Анализируем проблемы с редиректом
        from debugger.analyzers import RedirectAnalyzer
        redirect_analysis = RedirectAnalyzer(session).print_report()
        
        # Сохраняем отчёт
        report_path = session.save()
        
        # Экспортируем HAR
        from debugger.exporters import HARExporter
        har_path = HARExporter(session).export()
        
        reg.close()
        
        print(f"\n{'='*60}")
        print(f"DEBUG COMPLETE")
        print(f"Report: {report_path}")
        print(f"HAR: {har_path}")
        print(f"HTML: {session.session_dir / 'report.html'}")
        print(f"{'='*60}")


if __name__ == '__main__':
    run_debug_registration()