Skip to content

Commit 52f3440

Browse files
committed
Add forum info found
1 parent 984ec5b commit 52f3440

File tree

2 files changed

+80
-26
lines changed

2 files changed

+80
-26
lines changed

airos/base.py

Lines changed: 79 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -327,47 +327,80 @@ async def login(self) -> None:
327327
self._login_urls["v6_login_cgi"],
328328
]
329329

330-
# Prepare form-urlencoded data (simple dict for 'ct_form=True')
331-
v6_urlencoded_data = {
330+
# --- Data Set 1: SIMPLE (Original, minimal fields) ---
331+
v6_simple_urlencoded_data = {
332332
"uri": "/index.cgi",
333333
"username": self.username,
334334
"password": self.password,
335335
}
336-
337-
# Prepare multipart/form-data (aiohttp.FormData)
338-
v6_multipart_form_data = aiohttp.FormData()
339-
v6_multipart_form_data.add_field("uri", "/index.cgi")
340-
v6_multipart_form_data.add_field("username", self.username)
341-
v6_multipart_form_data.add_field("password", self.password)
336+
v6_simple_multipart_form_data = aiohttp.FormData()
337+
v6_simple_multipart_form_data.add_field("uri", "/index.cgi")
338+
v6_simple_multipart_form_data.add_field("username", self.username)
339+
v6_simple_multipart_form_data.add_field("password", self.password)
340+
341+
# --- Data Set 2: EXTENDED (Includes fields found in curl traffic) ---
342+
v6_extended_urlencoded_data = {
343+
**v6_simple_urlencoded_data, # Start with simple data
344+
"country": "56",
345+
"ui_language": "en_US",
346+
"lang_changed": "no",
347+
}
348+
v6_extended_multipart_form_data = aiohttp.FormData()
349+
v6_extended_multipart_form_data.add_field("uri", "/index.cgi")
350+
v6_extended_multipart_form_data.add_field("username", self.username)
351+
v6_extended_multipart_form_data.add_field("password", self.password)
352+
v6_extended_multipart_form_data.add_field("country", "56")
353+
v6_extended_multipart_form_data.add_field("ui_language", "en_US")
354+
v6_extended_multipart_form_data.add_field("lang_changed", "no")
342355

343356
login_headers = {
344-
# Removed User-Agent as it's often optional/can be simplified
345357
"Referer": self._login_urls["v6_login_cgi"],
346358
}
347359

348360
for url_to_try in v6_urls_to_try:
349-
# --- Attempt 1: application/x-www-form-urlencoded (preferred modern method) ---
361+
# --- ATTEMPT A: Simple Payload (form-urlencoded) ---
350362
try:
351363
_LOGGER.error(
352-
"TESTv6 - Trying to authenticate V6 POST to %s with application/x-www-form-urlencoded",
364+
"TESTv6 - Trying V6 POST to %s with SIMPLE form-urlencoded",
353365
url_to_try,
354366
)
355367
await self._request_json(
356368
"POST",
357369
url_to_try,
358370
headers=login_headers,
359-
form_data=v6_urlencoded_data,
371+
form_data=v6_simple_urlencoded_data,
360372
authenticated=True,
361-
ct_form=True, # Flag to tell _request_json to use form-urlencoded Content-Type
373+
ct_form=True,
362374
)
363-
except AirOSUrlNotFoundError:
375+
except (AirOSUrlNotFoundError, AirOSConnectionSetupError) as err:
364376
_LOGGER.warning(
365-
"TESTv6 - V6 URL not found (%s) for form-urlencoded, trying multipart.",
377+
"TESTv6 - V6 simple form-urlencoded failed (%s) on %s. Error: %s",
378+
type(err).__name__,
379+
url_to_try,
380+
err,
381+
)
382+
except AirOSConnectionAuthenticationError:
383+
raise
384+
else:
385+
return # Success
386+
387+
# --- ATTEMPT B: Simple Payload (multipart/form-data) ---
388+
try:
389+
_LOGGER.error(
390+
"TESTv6 - Trying V6 POST to %s with SIMPLE multipart/form-data",
366391
url_to_try,
367392
)
368-
except AirOSConnectionSetupError as err:
393+
await self._request_json(
394+
"POST",
395+
url_to_try,
396+
headers=login_headers,
397+
form_data=v6_simple_multipart_form_data,
398+
authenticated=True,
399+
)
400+
except (AirOSUrlNotFoundError, AirOSConnectionSetupError) as err:
369401
_LOGGER.warning(
370-
"TESTv6 - V6 connection setup failed (%s) for form-urlencoded, trying multipart. Error: %s",
402+
"TESTv6 - V6 simple multipart failed (%s) on %s. Error: %s",
403+
type(err).__name__,
371404
url_to_try,
372405
err,
373406
)
@@ -376,29 +409,50 @@ async def login(self) -> None:
376409
else:
377410
return # Success
378411

379-
# --- Attempt 2: multipart/form-data (fallback for older/different servers) ---
412+
# --- ATTEMPT C: Extended Payload (form-urlencoded) ---
380413
try:
381414
_LOGGER.error(
382-
"TESTv6 - Trying to authenticate V6 POST to %s with multipart/form-data",
415+
"TESTv6 - Trying V6 POST to %s with EXTENDED form-urlencoded",
383416
url_to_try,
384417
)
385418
await self._request_json(
386419
"POST",
387420
url_to_try,
388421
headers=login_headers,
389-
form_data=v6_multipart_form_data,
422+
form_data=v6_extended_urlencoded_data,
390423
authenticated=True,
424+
ct_form=True,
391425
)
392-
except AirOSUrlNotFoundError:
426+
except (AirOSUrlNotFoundError, AirOSConnectionSetupError) as err:
393427
_LOGGER.warning(
394-
"TESTv6 - V6 URL not found (%s) for multipart, trying next URL.",
428+
"TESTv6 - V6 extended form-urlencoded failed (%s) on %s. Error: %s",
429+
type(err).__name__,
395430
url_to_try,
431+
err,
396432
)
397-
except AirOSConnectionSetupError as err:
433+
except AirOSConnectionAuthenticationError:
434+
raise
435+
else:
436+
return # Success
437+
438+
# --- ATTEMPT D: Extended Payload (multipart/form-data) ---
439+
try:
440+
_LOGGER.error(
441+
"TESTv6 - Trying V6 POST to %s with EXTENDED multipart/form-data",
442+
url_to_try,
443+
)
444+
await self._request_json(
445+
"POST",
446+
url_to_try,
447+
headers=login_headers,
448+
form_data=v6_extended_multipart_form_data,
449+
authenticated=True,
450+
)
451+
except (AirOSUrlNotFoundError, AirOSConnectionSetupError) as err:
398452
_LOGGER.warning(
399-
"TESTv6 - V6 connection setup failed (%s) for multipart, trying next URL. Error: %s",
453+
"TESTv6 - V6 extended multipart failed (%s) on %s. Trying next URL.",
454+
type(err).__name__,
400455
url_to_try,
401-
err,
402456
)
403457
except AirOSConnectionAuthenticationError:
404458
raise

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "airos"
7-
version = "0.5.7a3"
7+
version = "0.5.7a4"
88
license = "MIT"
99
description = "Ubiquiti airOS module(s) for Python 3."
1010
readme = "README.md"

0 commit comments

Comments
 (0)