Skip to content

Commit 54b7fec

Browse files
committed
FIX: Login endpoint compatibility
It was previously missed, that the login endpoint unintentionally changes the input format from HTTP Form to JSON. It's now fixed and tested.
1 parent 4a7be53 commit 54b7fec

3 files changed

Lines changed: 46 additions & 8 deletions

File tree

intelmq_api/api.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
from .dependencies import (api_config, cached_response, session_store,
3030
token_authorization)
31-
from .models import LoginForm, TokenResponse
31+
from .models import TokenResponse
3232

3333
api = APIRouter()
3434

@@ -137,8 +137,8 @@ def config(file: str, fetch: bool = False,
137137

138138

139139
@api.post("/api/login", status_code=status.HTTP_200_OK, response_model=TokenResponse)
140-
def login(login_form: LoginForm, session: session.SessionStore = Depends(session_store)):
141-
username, password = login_form.username, login_form.password
140+
def login(username: str = Form(), password: str = Form(),
141+
session: session.SessionStore = Depends(session_store)):
142142
if session is None:
143143
raise HTTPException(
144144
status_code=status.HTTP_400_BAD_REQUEST,

intelmq_api/models.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,6 @@
77
from pydantic import BaseModel
88

99

10-
class LoginForm(BaseModel):
11-
username: str
12-
password: str
13-
14-
1510
class TokenResponse(BaseModel):
1611
login_token: str
1712
username: str

tests/test_api.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import json
88
import os
99
import subprocess
10+
import tempfile
1011
from tempfile import TemporaryDirectory
1112
from typing import Dict, List, Optional
1213
from unittest import TestCase, mock
@@ -17,8 +18,10 @@
1718
from intelmq_api import dependencies
1819
from intelmq_api.api import runner
1920
from intelmq_api.config import Config
21+
from intelmq_api.dependencies import session_store
2022
from intelmq_api.main import app
2123
from intelmq_api.runctl import RunIntelMQCtl
24+
from intelmq_api.session import SessionStore
2225
from intelmq_api.version import __version__
2326

2427

@@ -165,3 +168,43 @@ def test_post_positions(self):
165168
with open(f"{self.conf_dir.name}/manager/positions.conf", "r") as f:
166169
saved = json.load(f)
167170
self.assertEqual(saved, data)
171+
172+
173+
class TestAPILogin(TestCase):
174+
def setUp(self) -> None:
175+
self.client = TestClient(app=app)
176+
dependencies.startup(DummyConfig())
177+
self.temp_dir = tempfile.TemporaryDirectory()
178+
self.addCleanup(self.temp_dir.cleanup)
179+
180+
self.session = SessionStore(os.path.join(self.temp_dir.name, 'sessionsb'), 1000000)
181+
self.session.add_user('test', 'pass')
182+
183+
app.dependency_overrides[session_store] = lambda: self.session
184+
app.dependency_overrides[runner] = get_dummy_reader()
185+
186+
def tearDown(self) -> None:
187+
app.dependency_overrides = {}
188+
189+
def test_login(self):
190+
response = self.client.post("/v1/api/login", data={"username": "test", "password": "pass"})
191+
self.assertEqual(response.status_code, 200)
192+
self.assertIsNotNone(response.json().get("login_token"))
193+
194+
def test_login_and_call(self):
195+
response = self.client.post("/v1/api/login", data={"username": "test", "password": "pass"})
196+
self.assertEqual(response.status_code, 200)
197+
198+
token = response.json().get("login_token")
199+
authorized_response = self.client.get("/v1/api/version", headers={"authorization": token})
200+
self.assertEqual(authorized_response.status_code, 200)
201+
self.assertEqual(authorized_response.json()["intelmq-api"], __version__)
202+
203+
def test_unauthorized_call(self):
204+
response = self.client.get("/v1/api/version")
205+
self.assertEqual(response.status_code, 401)
206+
207+
def test_bad_token(self):
208+
response = self.client.get(
209+
"/v1/api/version", headers={"authorization": "not-a-valid-token"})
210+
self.assertEqual(response.status_code, 401)

0 commit comments

Comments
 (0)