Spaces:
Sleeping
Sleeping
Upload app.py
Browse files
app.py
CHANGED
|
@@ -56,27 +56,72 @@ except ImportError as e:
|
|
| 56 |
class InputValidator:
|
| 57 |
def __init__(self, max_length=1000):
|
| 58 |
self.max_length = max_length
|
| 59 |
-
|
| 60 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 61 |
|
| 62 |
class RateLimiter:
|
| 63 |
def __init__(self, requests_per_minute=60, requests_per_hour=1000):
|
| 64 |
-
|
| 65 |
-
|
|
|
|
|
|
|
| 66 |
return True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
|
| 68 |
class SessionManager:
|
| 69 |
def __init__(self, session_timeout_minutes=30):
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
def
|
| 74 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
|
| 76 |
class ErrorHandler:
|
| 77 |
-
def
|
|
|
|
|
|
|
|
|
|
| 78 |
logger.error(f"Error: {error} - Context: {context}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
return "An error occurred. Please try again."
|
|
|
|
|
|
|
|
|
|
| 80 |
|
| 81 |
# Fallback decorators
|
| 82 |
def handle_errors(func):
|
|
|
|
| 56 |
class InputValidator:
|
| 57 |
def __init__(self, max_length=1000):
|
| 58 |
self.max_length = max_length
|
| 59 |
+
|
| 60 |
+
def _truncate(self, text: str) -> str:
|
| 61 |
+
return (text or "")[: self.max_length]
|
| 62 |
+
|
| 63 |
+
def validate(self, text: str) -> str:
|
| 64 |
+
return self._truncate(text)
|
| 65 |
+
|
| 66 |
+
def validate_user_id(self, user_id: str) -> str:
|
| 67 |
+
return self._truncate(user_id)
|
| 68 |
+
|
| 69 |
+
def validate_message(self, message: str) -> str:
|
| 70 |
+
return self._truncate(message)
|
| 71 |
+
|
| 72 |
+
def validate_input(self, value: str, _name: str = "") -> str:
|
| 73 |
+
return self._truncate(value)
|
| 74 |
|
| 75 |
class RateLimiter:
|
| 76 |
def __init__(self, requests_per_minute=60, requests_per_hour=1000):
|
| 77 |
+
self.requests_per_minute = requests_per_minute
|
| 78 |
+
self.requests_per_hour = requests_per_hour
|
| 79 |
+
|
| 80 |
+
def check_rate_limit(self, user_id: str) -> bool:
|
| 81 |
return True
|
| 82 |
+
|
| 83 |
+
def get_remaining_requests(self, _user_id: str) -> dict:
|
| 84 |
+
return {
|
| 85 |
+
"per_minute_remaining": self.requests_per_minute,
|
| 86 |
+
"per_hour_remaining": self.requests_per_hour,
|
| 87 |
+
}
|
| 88 |
|
| 89 |
class SessionManager:
|
| 90 |
def __init__(self, session_timeout_minutes=30):
|
| 91 |
+
self.session_timeout_minutes = session_timeout_minutes
|
| 92 |
+
self.sessions: Dict[str, dict] = {}
|
| 93 |
+
|
| 94 |
+
def create_session(self, user_id: str, data: Optional[dict] = None) -> str:
|
| 95 |
+
session_id = f"session_{user_id}_{datetime.now().timestamp()}"
|
| 96 |
+
self.sessions[session_id] = {
|
| 97 |
+
"user_id": user_id,
|
| 98 |
+
"created_at": datetime.now(),
|
| 99 |
+
"last_activity": datetime.now(),
|
| 100 |
+
"data": data or {},
|
| 101 |
+
}
|
| 102 |
+
return session_id
|
| 103 |
+
|
| 104 |
+
def validate_session(self, session_id: str) -> Optional[dict]:
|
| 105 |
+
return self.sessions.get(session_id)
|
| 106 |
+
|
| 107 |
+
def destroy_session(self, session_id: str) -> None:
|
| 108 |
+
self.sessions.pop(session_id, None)
|
| 109 |
|
| 110 |
class ErrorHandler:
|
| 111 |
+
def __init__(self):
|
| 112 |
+
self._errors: List[dict] = []
|
| 113 |
+
|
| 114 |
+
def handle_error(self, error, context: str = ""):
|
| 115 |
logger.error(f"Error: {error} - Context: {context}")
|
| 116 |
+
self._errors.append({
|
| 117 |
+
"error": str(error),
|
| 118 |
+
"context": context,
|
| 119 |
+
"time": datetime.now().isoformat(),
|
| 120 |
+
})
|
| 121 |
return "An error occurred. Please try again."
|
| 122 |
+
|
| 123 |
+
def get_error_statistics(self) -> dict:
|
| 124 |
+
return {"total_errors": len(self._errors)}
|
| 125 |
|
| 126 |
# Fallback decorators
|
| 127 |
def handle_errors(func):
|