diff --git a/webservice/dbfunctions.py b/webservice/dbfunctions.py index 6eda316..607c762 100644 --- a/webservice/dbfunctions.py +++ b/webservice/dbfunctions.py @@ -1,8 +1,7 @@ import os from sqlmodel import create_engine, Session from dotenv import load_dotenv -from models import SensorData, Client -from models import Session as SessionModel +from models import User, SensorData, Client, Session as SessionModel from datetime import datetime @@ -20,13 +19,35 @@ def save_sensor_data(db: Session, sensor_data: SensorData): db.refresh(sensor_data) # Holt die letzten Informationen des hinzugefügten Eintrags return sensor_data -# dbfunctions.py def get_client_id_by_name(db: Session, client_name: str): client = db.query(Client).filter(Client.name == client_name).first() return client.id if client else None # Gibt die clientid zurück oder None, wenn nicht gefunden -def validate_token(db: Session, token: str) -> bool: +def validate_token_with_access(db: Session, token: str) -> bool: session = db.query(SessionModel).filter(SessionModel.token == token).first() + + # Wenn die Sitzung nicht gefunden wird, ist der Zugriff verweigert if not session: return False - return session.validuntil >= datetime.now().date() # Überprüfe, ob das Token gültig ist \ No newline at end of file + + # Hole den Benutzer basierend auf userid + user = db.query(User).filter(User.id == session.userid).first() + + # Überprüfe, ob das Token gültig ist und ob api_access True ist + if session.validuntil <= datetime.now().date() or not user.api_access: + return False + + return True # Token ist gültig und User hat API-Zugriff + +def check_api_access(db: Session, token: str) -> bool: + session = db.query(SessionModel).filter(SessionModel.token == token).first() + + # Wenn die Sitzung nicht gefunden wird, ist der Zugriff verweigert + if not session: + return False + + # Hole den Benutzer basierend auf userid + user = db.query(User).filter(User.id == session.userid).first() + + # Überprüfe, ob api_access True ist + return user.api_access if user else False # Gibt True oder False zurück \ No newline at end of file diff --git a/webservice/webservice.py b/webservice/webservice.py index b9e84a7..e994ea0 100644 --- a/webservice/webservice.py +++ b/webservice/webservice.py @@ -4,7 +4,7 @@ ################ IMPORTS ################ from fastapi import FastAPI, Depends, HTTPException, Header from sqlmodel import Session -from dbfunctions import save_sensor_data, get_client_id_by_name, validate_token, engine +from dbfunctions import save_sensor_data, get_client_id_by_name, validate_token_with_access, engine from models import SensorDataIn, SensorData, MessageOnly @@ -24,18 +24,19 @@ def get_db(): finally: db.close() -def authenticate_user(token: str, db: Session = Depends(get_db)): - if not validate_token(db, token): - raise HTTPException(status_code=401, detail="Invalid or expired token") +def authenticate_user(token: str = Header(...), db: Session = Depends(get_db)): # Token aus Header + if not validate_token_with_access(db, token): + raise HTTPException(status_code=401, detail="Invalid or expired token, or insufficient permissions") @app.post("/sensors/push-data", response_model=MessageOnly, tags=["sensors"]) -async def saveNewSensorData(client: str, data: SensorDataIn, token: str = Header(...), db: Session = Depends(get_db)): +async def saveNewSensorData( + client: str, + data: SensorDataIn, + db: Session = Depends(get_db), + auth: bool = Depends(authenticate_user) # Hier wird das Token durch die Dependency validiert +): try: - # Token-Validierung - if not validate_token(db, token): - raise HTTPException(status_code=401, detail="Invalid or expired token") - # Ermittle die clientid basierend auf dem Client-Namen client_id = get_client_id_by_name(db, client) if client_id is None: