|
|
@@ -11,6 +11,8 @@ from datetime import datetime, timedelta
|
|
|
import locales
|
|
|
from dependencies import get_current_user, require_admin
|
|
|
import config
|
|
|
+import secrets
|
|
|
+from services.email_service import send_verification_email
|
|
|
|
|
|
try:
|
|
|
from google.oauth2 import id_token
|
|
|
@@ -31,15 +33,39 @@ async def register(request: Request, user: schemas.UserCreate, lang: str = "en")
|
|
|
hashed_password = auth_utils.get_password_hash(user.password)
|
|
|
|
|
|
query = """
|
|
|
- INSERT INTO users (email, password_hash, first_name, last_name, phone, shipping_address, preferred_language, role, ip_address, is_company, company_name, company_pib, company_address)
|
|
|
- VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
|
|
|
+ INSERT INTO users (email, password_hash, first_name, last_name, phone, shipping_address, preferred_language, role, ip_address, is_company, company_name, company_pib, company_address, is_active)
|
|
|
+ VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, 0)
|
|
|
"""
|
|
|
params = (user.email, hashed_password, user.first_name, user.last_name, user.phone, user.shipping_address, user.preferred_language, 'user', ip_address, user.is_company, user.company_name, user.company_pib, user.company_address)
|
|
|
|
|
|
user_id = db.execute_commit(query, params)
|
|
|
+
|
|
|
+ # Generate Verification Token
|
|
|
+ token = secrets.token_urlsafe(32)
|
|
|
+ expires_at = datetime.utcnow() + timedelta(hours=24)
|
|
|
+ db.execute_commit("INSERT INTO email_verification_tokens (user_id, token, expires_at) VALUES (%s, %s, %s)", (user_id, token, expires_at))
|
|
|
+
|
|
|
+ # Send Email
|
|
|
+ send_verification_email(user.email, token, user.preferred_language or lang)
|
|
|
+
|
|
|
new_user = db.execute_query("SELECT id, email, first_name, last_name, phone, shipping_address, preferred_language, role, can_chat, is_active, is_company, company_name, company_pib, company_address, ip_address, created_at FROM users WHERE id = %s", (user_id,))
|
|
|
return new_user[0]
|
|
|
|
|
|
+@router.get("/verify-email")
|
|
|
+async def verify_email(token: str, lang: str = "en"):
|
|
|
+ res = db.execute_query("SELECT user_id, expires_at FROM email_verification_tokens WHERE token = %s", (token,))
|
|
|
+ if not res:
|
|
|
+ raise HTTPException(status_code=400, detail="Invalid verification token")
|
|
|
+
|
|
|
+ user_id, expires_at = res[0]['user_id'], res[0]['expires_at']
|
|
|
+ if expires_at < datetime.utcnow():
|
|
|
+ raise HTTPException(status_code=400, detail="Verification token expired")
|
|
|
+
|
|
|
+ db.execute_commit("UPDATE users SET is_active = 1 WHERE id = %s", (user_id,))
|
|
|
+ db.execute_commit("DELETE FROM email_verification_tokens WHERE user_id = %s", (user_id,))
|
|
|
+
|
|
|
+ return {"message": "Email verified successfully. You can now log in."}
|
|
|
+
|
|
|
@router.post("/login", response_model=schemas.Token)
|
|
|
async def login(request: Request, user_data: schemas.UserLogin, lang: str = "en"):
|
|
|
ip = request.client.host if request.client else "unknown"
|
|
|
@@ -75,7 +101,9 @@ async def login(request: Request, user_data: schemas.UserLogin, lang: str = "en"
|
|
|
raise HTTPException(status_code=401, detail=locales.translate_error("incorrect_credentials", lang))
|
|
|
|
|
|
if not user[0].get('is_active', True):
|
|
|
- raise HTTPException(status_code=403, detail="Your account has been suspended.")
|
|
|
+ # We assume if it's 0 it might be unverified or suspended.
|
|
|
+ # For simplicity, let's say "Account not active".
|
|
|
+ raise HTTPException(status_code=403, detail="Your account is not active. Please verify your email or contact support.")
|
|
|
|
|
|
# 5. Success - Reset Rate Limits
|
|
|
rate_limit_service.reset_attempts(email, ip)
|
|
|
@@ -136,8 +164,8 @@ async def social_login(request: Request, data: schemas.SocialLogin):
|
|
|
hashed_password = auth_utils.get_password_hash(str(uuid.uuid4()))
|
|
|
|
|
|
query = """
|
|
|
- INSERT INTO users (email, password_hash, first_name, last_name, preferred_language, role, ip_address)
|
|
|
- VALUES (%s, %s, %s, %s, %s, %s, %s)
|
|
|
+ INSERT INTO users (email, password_hash, first_name, last_name, preferred_language, role, ip_address, is_active)
|
|
|
+ VALUES (%s, %s, %s, %s, %s, %s, %s, 1)
|
|
|
"""
|
|
|
params = (email, hashed_password, first_name, last_name, data.preferred_language, 'user', ip_address)
|
|
|
user_id = db.execute_commit(query, params)
|