Skip to content

Commit ee8b3e3

Browse files
authored
sources/kerberos: update to new python-kadmin-rs (#19491)
1 parent c2171c3 commit ee8b3e3

8 files changed

Lines changed: 69 additions & 25 deletions

File tree

.github/actions/setup/action.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ runs:
1818
run: |
1919
sudo apt-get remove --purge man-db
2020
sudo apt-get update
21-
sudo apt-get install --no-install-recommends -y libpq-dev openssl libxmlsec1-dev pkg-config gettext libkrb5-dev krb5-kdc krb5-user krb5-admin-server
21+
sudo apt-get install --no-install-recommends -y libpq-dev openssl libxmlsec1-dev pkg-config gettext krb5-multidev libkrb5-dev heimdal-multidev libclang-dev krb5-kdc krb5-user krb5-admin-server
2222
sudo rm -rf /usr/local/lib/android
2323
- name: Install uv
2424
if: ${{ contains(inputs.dependencies, 'python') }}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Generated by Django 5.2.7 on 2025-10-31 15:27
2+
3+
from django.db import migrations, models
4+
5+
6+
def migrate_kadmin_type(apps, schema_editor):
7+
KerberosSource = apps.get_model("authentik_sources_kerberos", "KerberosSource")
8+
db_alias = schema_editor.connection.alias
9+
10+
for source in KerberosSource.objects.using(db_alias).all():
11+
if source.kadmin_type not in ("MIT", "Heimdal"):
12+
source.kadmin_type = "MIT"
13+
source.save(using=db_alias)
14+
15+
16+
class Migration(migrations.Migration):
17+
dependencies = [
18+
("authentik_sources_kerberos", "0004_kerberossource_sync_outgoing_trigger_mode"),
19+
]
20+
21+
operations = [
22+
migrations.RunPython(migrate_kadmin_type, reverse_code=migrations.RunPython.noop),
23+
migrations.AlterField(
24+
model_name="kerberossource",
25+
name="kadmin_type",
26+
field=models.TextField(
27+
choices=[("MIT", "Mit"), ("Heimdal", "Heimdal")],
28+
default="MIT",
29+
help_text="KAdmin server type",
30+
),
31+
),
32+
]

authentik/sources/kerberos/models.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
"""authentik Kerberos Source Models"""
22

33
import os
4+
from base64 import b64decode
45
from pathlib import Path
56
from tempfile import gettempdir
67
from typing import Any
78

89
import gssapi
910
import pglock
1011
from django.db import connection, models
11-
from django.db.models.fields import b64decode
1212
from django.http import HttpRequest
1313
from django.shortcuts import reverse
1414
from django.templatetags.static import static
1515
from django.utils.timezone import now
1616
from django.utils.translation import gettext_lazy as _
17-
from kadmin import KAdmin, KAdminApiVersion
18-
from kadmin.exceptions import PyKAdminException
17+
from kadmin import KAdm5Variant, KAdmin, KAdminApiVersion
18+
from kadmin import exceptions as kadmin_exceptions
1919
from rest_framework.serializers import Serializer
2020
from structlog.stdlib import get_logger
2121

@@ -42,7 +42,6 @@
4242
class KAdminType(models.TextChoices):
4343
MIT = "MIT"
4444
HEIMDAL = "Heimdal"
45-
OTHER = "other"
4645

4746

4847
class KerberosSource(IncomingSyncSource):
@@ -54,7 +53,7 @@ class KerberosSource(IncomingSyncSource):
5453
help_text=_("Custom krb5.conf to use. Uses the system one by default"),
5554
)
5655
kadmin_type = models.TextField(
57-
choices=KAdminType.choices, default=KAdminType.OTHER, help_text=_("KAdmin server type")
56+
choices=KAdminType.choices, default=KAdminType.MIT, help_text=_("KAdmin server type")
5857
)
5958

6059
sync_users = models.BooleanField(
@@ -239,20 +238,22 @@ def krb5_conf_path(self) -> str | None:
239238
return str(conf_path)
240239

241240
def _kadmin_init(self) -> KAdmin | None:
242-
api_version = None
241+
variant = KAdm5Variant.MitClient
242+
api_version = KAdminApiVersion.Version2
243243
match self.kadmin_type:
244244
case KAdminType.MIT:
245+
variant = KAdm5Variant.MitClient
245246
api_version = KAdminApiVersion.Version4
246247
case KAdminType.HEIMDAL:
247-
api_version = KAdminApiVersion.Version2
248-
case KAdminType.OTHER:
248+
variant = KAdm5Variant.HeimdalClient
249249
api_version = KAdminApiVersion.Version2
250250
# kadmin doesn't use a ccache for its connection
251251
# as such, we don't need to create a separate ccache for each source
252252
if not self.sync_principal:
253253
return None
254254
if self.sync_password:
255255
return KAdmin.with_password(
256+
variant,
256257
self.sync_principal,
257258
self.sync_password,
258259
api_version=api_version,
@@ -265,12 +266,14 @@ def _kadmin_init(self) -> KAdmin | None:
265266
keytab_path.write_bytes(b64decode(self.sync_keytab))
266267
keytab = f"FILE:{keytab_path}"
267268
return KAdmin.with_keytab(
269+
variant,
268270
self.sync_principal,
269271
keytab,
270272
api_version=api_version,
271273
)
272274
if self.sync_ccache:
273275
return KAdmin.with_ccache(
276+
variant,
274277
self.sync_principal,
275278
self.sync_ccache,
276279
api_version=api_version,
@@ -285,9 +288,9 @@ def connection(self) -> KAdmin | None:
285288
_kadmin_connections[str(self.pk)] = self._kadmin_init()
286289
return _kadmin_connections.get(str(self.pk), None)
287290

288-
def check_connection(self) -> dict[str, str]:
291+
def check_connection(self) -> dict[str, str | bool]:
289292
"""Check Kerberos Connection"""
290-
status = {"status": "ok"}
293+
status: dict[str, str | bool] = {"status": "ok"}
291294
if not self.sync_users:
292295
return status
293296
with Krb5ConfContext(self):
@@ -297,7 +300,7 @@ def check_connection(self) -> dict[str, str]:
297300
status["status"] = "no connection"
298301
return status
299302
status["principal_exists"] = kadm.principal_exists(self.sync_principal)
300-
except PyKAdminException as exc:
303+
except kadmin_exceptions.PyKAdminException as exc:
301304
status["status"] = str(exc)
302305
return status
303306

authentik/sources/kerberos/signals.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""authentik kerberos source signals"""
22

33
from django.dispatch import receiver
4-
from kadmin.exceptions import PyKAdminException
4+
from kadmin import exceptions as kadmin_exceptions
55
from rest_framework.serializers import ValidationError
66
from structlog.stdlib import get_logger
77

@@ -38,7 +38,7 @@ def kerberos_sync_password(sender, user: User, password: str, **_):
3838
kadm,
3939
password,
4040
)
41-
except PyKAdminException as exc:
41+
except kadmin_exceptions.PyKAdminException as exc:
4242
LOGGER.warning("failed to set Kerberos password", exc=exc, source=source)
4343
Event.new(
4444
EventAction.CONFIGURATION_ERROR,

lifecycle/container/Dockerfile

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ RUN --mount=type=cache,id=apt-$TARGETARCH$TARGETVARIANT,sharing=locked,target=/v
114114
# postgresql
115115
libpq-dev \
116116
# python-kadmin-rs
117-
clang libkrb5-dev sccache \
117+
krb5-multidev libkrb5-dev heimdal-multidev libclang-dev \
118118
# xmlsec
119119
libltdl-dev && \
120120
curl https://sh.rustup.rs -sSf | sh -s -- -y
@@ -156,7 +156,11 @@ WORKDIR /
156156
RUN apt-get update && \
157157
apt-get upgrade -y && \
158158
# Required for runtime
159-
apt-get install -y --no-install-recommends libpq5 libmaxminddb0 ca-certificates libkrb5-3 libkadm5clnt-mit12 libkdb5-10 libltdl7 libxslt1.1 && \
159+
apt-get install -y --no-install-recommends \
160+
libpq5 libmaxminddb0 ca-certificates \
161+
krb5-multidev libkrb5-3 libkdb5-10 libkadm5clnt-mit12 \
162+
heimdal-multidev libkadm5clnt7t64-heimdal \
163+
libltdl7 libxslt1.1 && \
160164
# Required for bootstrap & healtcheck
161165
apt-get install -y --no-install-recommends runit && \
162166
pip3 install --no-cache-dir --upgrade pip && \

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ dependencies = [
5454
"pydantic==2.12.5",
5555
"pyjwt==2.10.1",
5656
"pyrad==2.4",
57-
"python-kadmin-rs==0.6.3",
57+
"python-kadmin-rs==0.7.0",
5858
"pyyaml==6.0.3",
5959
"requests-oauthlib==2.0.0",
6060
"scim2-filter-parser==0.7.0",

uv.lock

Lines changed: 13 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

web/src/admin/sources/kerberos/KerberosSourceForm.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -244,11 +244,6 @@ export class KerberosSourceForm extends BaseSourceForm<KerberosSource> {
244244
value: KadminTypeEnum.Heimdal,
245245
description: html`${msg("Heimdal kadmin")}`,
246246
},
247-
{
248-
label: msg("Other"),
249-
value: KadminTypeEnum.Other,
250-
description: html`${msg("Other type of kadmin")}`,
251-
},
252247
]}
253248
.value=${this.instance?.kadminType}
254249
>

0 commit comments

Comments
 (0)