Skip to content

Commit d196e3c

Browse files
committed
feat: add optional CSR field to enrollment schemas
1 parent 70602cc commit d196e3c

File tree

5 files changed

+20
-5
lines changed

5 files changed

+20
-5
lines changed

src/rasenmaeher_api/db/enrollments.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ class Enrollment(ORMBaseModel, table=True): # type: ignore[call-arg,misc]
168168
)
169169
state: int = Field(nullable=False, index=False, unique=False, default=EnrollmentState.PENDING)
170170
extra: Dict[str, Any] = Field(sa_type=JSONB, nullable=False, sa_column_kwargs={"server_default": "{}"})
171+
csr: Optional[str] = Field(default=None, nullable=True)
171172

172173
@classmethod
173174
async def by_pk_or_callsign(cls, inval: Union[str, uuid.UUID]) -> "Enrollment":
@@ -273,11 +274,16 @@ async def _generate_unused_code(cls) -> str:
273274

274275
@classmethod
275276
async def create_for_callsign(
276-
cls, callsign: str, pool: Optional[EnrollmentPool] = None, extra: Optional[Dict[str, Any]] = None
277+
cls,
278+
callsign: str,
279+
pool: Optional[EnrollmentPool] = None,
280+
extra: Optional[Dict[str, Any]] = None,
281+
csr: Optional[str] = None,
277282
) -> "Enrollment":
278283
"""Create a new one with random code for the callsign"""
279284
if callsign in RMSettings.singleton().valid_product_cns:
280285
raise CallsignReserved("Using product CNs as callsigns is forbidden")
286+
# FIXME: Verify the CSR has the callsign as CN
281287
with EngineWrapper.get_session() as session:
282288
try:
283289
await Enrollment.by_callsign(callsign)
@@ -294,6 +300,7 @@ async def create_for_callsign(
294300
state=EnrollmentState.PENDING,
295301
extra=extra,
296302
pool=poolpk,
303+
csr=csr,
297304
)
298305
session.add(obj)
299306
session.commit()

src/rasenmaeher_api/web/api/enrollment/schema.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Schema for enrollment."""
22

3-
from typing import List, Dict, Any
3+
from typing import List, Dict, Any, Optional
44

55
from pydantic import BaseModel, Extra, Field
66

@@ -105,6 +105,7 @@ class EnrollmentInitIn(BaseModel): # pylint: disable=too-few-public-methods
105105
"""Enrollment init in response schema"""
106106

107107
callsign: str = Field(description="Callsign to create enrollment for")
108+
csr: Optional[str] = Field(description="CSR for mTLS key in PEM format", default=None)
108109

109110
class Config: # pylint: disable=too-few-public-methods
110111
"""Example values for schema"""

src/rasenmaeher_api/web/api/enrollment/views.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,9 @@ async def request_enrollment_init(
188188

189189
# TODO ADD POOL NAME CHECK
190190

191-
new_enrollment = await Enrollment.create_for_callsign(callsign=request_in.callsign, pool=None, extra={})
191+
new_enrollment = await Enrollment.create_for_callsign(
192+
callsign=request_in.callsign, pool=None, extra={}, csr=request_in.csr
193+
)
192194
# Create JWT token for user
193195
claims = {"sub": request_in.callsign}
194196
new_jwt = Issuer.singleton().issue(claims)

src/rasenmaeher_api/web/api/firstuser/schema.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"""Schema for enrollment."""
22

3-
from pydantic import BaseModel, Extra
3+
from typing import Optional
4+
5+
from pydantic import BaseModel, Extra, Field
46

57

68
class FirstuserCheckCodeIn(BaseModel): # pylint: disable=too-few-public-methods
@@ -51,6 +53,7 @@ class FirstuserAddAdminIn(BaseModel): # pylint: disable=too-few-public-methods
5153

5254
# temp_admin_code: str
5355
callsign: str
56+
csr: Optional[str] = Field(default=None, description="CSR for mTLS key in PEM format")
5457

5558
class Config: # pylint: disable=too-few-public-methods
5659
"""Example values for schema"""

src/rasenmaeher_api/web/api/firstuser/views.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,9 @@ async def post_admin_add(
7878
await anon_user.assign_role(role="anon_admin")
7979

8080
# Create new admin user enrollment
81-
enrollment = await Enrollment.create_for_callsign(callsign=request_in.callsign, pool=None, extra={})
81+
enrollment = await Enrollment.create_for_callsign(
82+
callsign=request_in.callsign, pool=None, extra={}, csr=request_in.csr
83+
)
8284

8385
# Get the anon_admin 'user' that will be used to approve the new admin user
8486
# and approve the user

0 commit comments

Comments
 (0)