schoolapp-api 2.1.4__tar.gz → 2.1.5__tar.gz
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.
- {schoolapp_api-2.1.4/schoolapp_api.egg-info → schoolapp_api-2.1.5}/PKG-INFO +1 -1
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/pyproject.toml +1 -1
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/auth.py +20 -10
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/http_client.py +4 -5
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5/schoolapp_api.egg-info}/PKG-INFO +1 -1
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/LICENSE +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/README.md +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/__init__.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/constants.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/managers/__init__.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/managers/attendance_manager.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/managers/base_manager.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/managers/course_manager.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/managers/grades_manager.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/managers/profile_manager.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/parsers/__init__.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/parsers/absences.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/parsers/annees.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/parsers/filieres.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/parsers/modules.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/parsers/note_elem.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/parsers/note_mod.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/parsers/profile.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/parsers/sanctions.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/parsers/semestres.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/parsers/stats.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/school_app_client.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/types/__init__.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/types/annee.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/types/base.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/types/element.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/types/module.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api/types/semestre.py +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api.egg-info/SOURCES.txt +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api.egg-info/dependency_links.txt +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api.egg-info/requires.txt +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/schoolapp_api.egg-info/top_level.txt +0 -0
- {schoolapp_api-2.1.4 → schoolapp_api-2.1.5}/setup.cfg +0 -0
|
@@ -70,20 +70,30 @@ class AuthManager:
|
|
|
70
70
|
return self.logged_in
|
|
71
71
|
|
|
72
72
|
def check_session(self):
|
|
73
|
-
"""
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
73
|
+
"""Confirm whether the session is still valid by visiting the index page"""
|
|
74
|
+
try:
|
|
75
|
+
from schoolapp_api.constants import INDEX_URL
|
|
76
|
+
code, url, content = self.http_client.get(INDEX_URL)
|
|
77
|
+
|
|
78
|
+
# If url is None (exception) or it contains "/login", session is dead
|
|
79
|
+
if not url or "/login" in url.lower():
|
|
80
|
+
logger.warning(f"Session check: Redirected to {url or 'None'} - session invalid")
|
|
81
|
+
self.logged_in = False
|
|
82
|
+
return False
|
|
83
|
+
|
|
84
|
+
# If content is very short or contains login-like keywords, it's also dead
|
|
85
|
+
if content and (len(content) < 1000 or "login" in content.lower()[:500]):
|
|
86
|
+
logger.warning("Session check: Content looks like a login page - session invalid")
|
|
87
|
+
self.logged_in = False
|
|
88
|
+
return False
|
|
78
89
|
|
|
79
|
-
|
|
80
|
-
|
|
90
|
+
self.logged_in = True
|
|
91
|
+
return True
|
|
92
|
+
except Exception as e:
|
|
93
|
+
logger.error(f"Error during check_session: {e}")
|
|
81
94
|
self.logged_in = False
|
|
82
95
|
return False
|
|
83
96
|
|
|
84
|
-
self.logged_in = True
|
|
85
|
-
return True
|
|
86
|
-
|
|
87
97
|
def refresh_csrf_from_url(self, url):
|
|
88
98
|
"""Fetch a fresh CSRF token from a specific page"""
|
|
89
99
|
try:
|
|
@@ -46,15 +46,14 @@ class HTTPClient:
|
|
|
46
46
|
return code, response_url, content
|
|
47
47
|
|
|
48
48
|
except urllib.error.HTTPError as e:
|
|
49
|
-
# Still get content from error page if possible (some portals return 401 with nice HTML)
|
|
50
49
|
try:
|
|
51
50
|
content = e.read().decode("utf-8")
|
|
52
51
|
except:
|
|
53
52
|
content = None
|
|
54
|
-
logger.error(f"HTTP Error {e.code}: {e.reason}")
|
|
53
|
+
logger.error(f"HTTP Error {e.code} on {url}: {e.reason}")
|
|
55
54
|
return e.code, e.url, content
|
|
56
55
|
except Exception as e:
|
|
57
|
-
logger.error(f"GET Error: {e}")
|
|
56
|
+
logger.error(f"GET Error on {url}: {e}")
|
|
58
57
|
return None, None, None
|
|
59
58
|
|
|
60
59
|
def post(self, url, data, referer=None):
|
|
@@ -77,8 +76,8 @@ class HTTPClient:
|
|
|
77
76
|
content = e.read().decode("utf-8")
|
|
78
77
|
except:
|
|
79
78
|
content = None
|
|
80
|
-
logger.error(f"HTTP Error {e.code}: {e.reason}")
|
|
79
|
+
logger.error(f"HTTP Error {e.code} on {url}: {e.reason}")
|
|
81
80
|
return e.code, e.url, content
|
|
82
81
|
except Exception as e:
|
|
83
|
-
logger.error(f"POST Error: {e}")
|
|
82
|
+
logger.error(f"POST Error on {url}: {e}")
|
|
84
83
|
return None, None, None
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|