Add fallback UID range options at compile-time

Signed-off-by: AnErrupTion <anerruption@disroot.org>
This commit is contained in:
AnErrupTion
2025-11-30 09:47:50 +01:00
parent 8c964d9ce5
commit fe354a4809
23 changed files with 42 additions and 4 deletions

View File

@@ -44,6 +44,8 @@ pub fn build(b: *std.Build) !void {
const enable_x11_support = b.option(bool, "enable_x11_support", "Enable X11 support (default is on)") orelse true; const enable_x11_support = b.option(bool, "enable_x11_support", "Enable X11 support (default is on)") orelse true;
const default_tty = b.option(u8, "default_tty", "Set the TTY (default is 2)") orelse 2; const default_tty = b.option(u8, "default_tty", "Set the TTY (default is 2)") orelse 2;
const fallback_tty = b.option(u8, "fallback_tty", "Set the fallback TTY (default is 2). This value gets embedded into the binary") orelse 2; const fallback_tty = b.option(u8, "fallback_tty", "Set the fallback TTY (default is 2). This value gets embedded into the binary") orelse 2;
const fallback_uid_min = b.option(std.posix.uid_t, "fallback_uid_min", "Set the fallback minimum UID (default is 1000). This value gets embedded into the binary") orelse 2;
const fallback_uid_max = b.option(std.posix.uid_t, "fallback_uid_max", "Set the fallback maximum UID (default is 60000). This value gets embedded into the binary") orelse 2;
default_tty_str = try std.fmt.allocPrint(b.allocator, "{d}", .{default_tty}); default_tty_str = try std.fmt.allocPrint(b.allocator, "{d}", .{default_tty});
@@ -52,6 +54,8 @@ pub fn build(b: *std.Build) !void {
build_options.addOption([]const u8, "version", version_str); build_options.addOption([]const u8, "version", version_str);
build_options.addOption(u8, "tty", default_tty); build_options.addOption(u8, "tty", default_tty);
build_options.addOption(u8, "fallback_tty", fallback_tty); build_options.addOption(u8, "fallback_tty", fallback_tty);
build_options.addOption(std.posix.uid_t, "fallback_uid_min", fallback_uid_min);
build_options.addOption(std.posix.uid_t, "fallback_uid_max", fallback_uid_max);
build_options.addOption(bool, "enable_x11_support", enable_x11_support); build_options.addOption(bool, "enable_x11_support", enable_x11_support);
const target = b.standardTargetOptions(.{}); const target = b.standardTargetOptions(.{});

View File

@@ -50,6 +50,7 @@ err_sleep = فشل في تنفيذ أمر sleep
err_tty_ctrl = فشل في نقل تحكم الطرفية (TTY) err_tty_ctrl = فشل في نقل تحكم الطرفية (TTY)
err_user_gid = فشل في تعيين معرّف المجموعة (GID) للمستخدم err_user_gid = فشل في تعيين معرّف المجموعة (GID) للمستخدم
err_user_init = فشل في تهيئة بيانات المستخدم err_user_init = فشل في تهيئة بيانات المستخدم
err_user_uid = فشل في تعيين معرّف المستخدم (UID) err_user_uid = فشل في تعيين معرّف المستخدم (UID)

View File

@@ -50,6 +50,7 @@ err_pwnam = error en obtenir la informació de l'usuari
err_user_gid = error en establir el GID de l'usuari err_user_gid = error en establir el GID de l'usuari
err_user_init = error en inicialitzar usuari err_user_init = error en inicialitzar usuari
err_user_uid = error en establir l'UID de l'usuari err_user_uid = error en establir l'UID de l'usuari

View File

@@ -50,6 +50,7 @@ err_pwnam = nelze získat informace o uživateli
err_user_gid = nastavení GID uživatele selhalo err_user_gid = nastavení GID uživatele selhalo
err_user_init = inicializace uživatele selhala err_user_init = inicializace uživatele selhala
err_user_uid = nastavení UID uživateli selhalo err_user_uid = nastavení UID uživateli selhalo

View File

@@ -50,6 +50,7 @@ err_sleep = Sleep-Befehl fehlgeschlagen
err_tty_ctrl = Fehler bei der TTY-Uebergabe err_tty_ctrl = Fehler bei der TTY-Uebergabe
err_user_gid = Fehler beim Setzen der Gruppen-ID err_user_gid = Fehler beim Setzen der Gruppen-ID
err_user_init = Nutzer-Initialisierung fehlgeschlagen err_user_init = Nutzer-Initialisierung fehlgeschlagen
err_user_uid = Setzen der Benutzer-ID fehlgeschlagen err_user_uid = Setzen der Benutzer-ID fehlgeschlagen

View File

@@ -11,7 +11,7 @@ err_brightness_change = failed to change brightness
err_chdir = failed to open home folder err_chdir = failed to open home folder
err_clock_too_long = clock string too long err_clock_too_long = clock string too long
err_config = unable to parse config file err_config = unable to parse config file
err_crawl = failed to crawl session directories
err_dgn_oob = log message err_dgn_oob = log message
err_domain = invalid domain err_domain = invalid domain
err_empty_password = empty password not allowed err_empty_password = empty password not allowed
@@ -50,6 +50,7 @@ err_battery = failed to load battery status
err_switch_tty = failed to switch tty err_switch_tty = failed to switch tty
err_tty_ctrl = tty control transfer failed err_tty_ctrl = tty control transfer failed
err_no_users = no users found err_no_users = no users found
err_uid_range = failed to dynamically get uid range
err_user_gid = failed to set user GID err_user_gid = failed to set user GID
err_user_init = failed to initialize user err_user_init = failed to initialize user
err_user_uid = failed to set user UID err_user_uid = failed to set user UID

View File

@@ -50,6 +50,7 @@ err_pwnam = error al obtener la información del usuario
err_user_gid = error al establecer el GID del usuario err_user_gid = error al establecer el GID del usuario
err_user_init = error al inicializar usuario err_user_init = error al inicializar usuario
err_user_uid = error al establecer el UID del usuario err_user_uid = error al establecer el UID del usuario

View File

@@ -50,6 +50,7 @@ err_battery = échec de lecture de l'état de la batterie
err_switch_tty = échec du changement de terminal err_switch_tty = échec du changement de terminal
err_tty_ctrl = échec du transfert de contrôle du terminal err_tty_ctrl = échec du transfert de contrôle du terminal
err_no_users = aucun utilisateur trouvé err_no_users = aucun utilisateur trouvé
err_uid_range = échec de récupération dynamique de la plage d'UID
err_user_gid = échec de modification du GID err_user_gid = échec de modification du GID
err_user_init = échec d'initialisation de l'utilisateur err_user_init = échec d'initialisation de l'utilisateur
err_user_uid = échec de modification du UID err_user_uid = échec de modification du UID

View File

@@ -50,6 +50,7 @@ err_pwnam = impossibile ottenere dati utente
err_user_gid = impossibile impostare GID utente err_user_gid = impossibile impostare GID utente
err_user_init = impossibile inizializzare utente err_user_init = impossibile inizializzare utente
err_user_uid = impossible impostare UID utente err_user_uid = impossible impostare UID utente

View File

@@ -50,6 +50,7 @@ err_sleep = スリープコマンドの実行に失敗しました
err_tty_ctrl = TTY制御の転送に失敗しました err_tty_ctrl = TTY制御の転送に失敗しました
err_user_gid = ユーザーGIDの設定に失敗しました err_user_gid = ユーザーGIDの設定に失敗しました
err_user_init = ユーザーの初期化に失敗しました err_user_init = ユーザーの初期化に失敗しました
err_user_uid = ユーザーUIDの設定に失敗しました err_user_uid = ユーザーUIDの設定に失敗しました

View File

@@ -50,6 +50,7 @@ err_battery = neizdevās ielādēt akumulatora stāvokli
err_switch_tty = neizdevās pārslēgt tty err_switch_tty = neizdevās pārslēgt tty
err_tty_ctrl = tty vadības nodošana neizdevās err_tty_ctrl = tty vadības nodošana neizdevās
err_no_users = lietotāji nav atrasti err_no_users = lietotāji nav atrasti
err_user_gid = neizdevās iestatīt lietotāja GID err_user_gid = neizdevās iestatīt lietotāja GID
err_user_init = neizdevās inicializēt lietotāju err_user_init = neizdevās inicializēt lietotāju
err_user_uid = neizdevās iestatīt lietotāja UID err_user_uid = neizdevās iestatīt lietotāja UID

View File

@@ -50,6 +50,7 @@ err_battery = nie udało się sprawdzić statusu baterii
err_switch_tty = nie można przełączyć tty err_switch_tty = nie można przełączyć tty
err_tty_ctrl = nie udało się przekazać kontroli tty err_tty_ctrl = nie udało się przekazać kontroli tty
err_no_users = nie znaleziono żadnego użytkownika err_no_users = nie znaleziono żadnego użytkownika
err_user_gid = nie udało się ustawić GID użytkownika err_user_gid = nie udało się ustawić GID użytkownika
err_user_init = nie udało się zainicjalizować użytkownika err_user_init = nie udało się zainicjalizować użytkownika
err_user_uid = nie udało się ustawić UID użytkownika err_user_uid = nie udało się ustawić UID użytkownika

View File

@@ -50,6 +50,7 @@ err_pwnam = erro ao obter informação do utilizador
err_user_gid = erro ao definir o GID do utilizador err_user_gid = erro ao definir o GID do utilizador
err_user_init = erro ao iniciar o utilizador err_user_init = erro ao iniciar o utilizador
err_user_uid = erro ao definir o UID do utilizador err_user_uid = erro ao definir o UID do utilizador

View File

@@ -50,6 +50,7 @@ err_pwnam = não foi possível obter informações do usuário
err_user_gid = não foi possível definir o GID do usuário err_user_gid = não foi possível definir o GID do usuário
err_user_init = não foi possível iniciar o usuário err_user_init = não foi possível iniciar o usuário
err_user_uid = não foi possível definir o UID do usuário err_user_uid = não foi possível definir o UID do usuário

View File

@@ -59,6 +59,7 @@ err_perm_user = nu s-a putut face downgrade permisiunilor de utilizator
login = utilizator login = utilizator
logout = opreşte sesiunea logout = opreşte sesiunea

View File

@@ -50,6 +50,7 @@ err_battery = не удалось получить статус батареи
err_switch_tty = не удалось переключить tty err_switch_tty = не удалось переключить tty
err_tty_ctrl = передача управления tty не удалась err_tty_ctrl = передача управления tty не удалась
err_no_users = пользователи не найдены err_no_users = пользователи не найдены
err_user_gid = не удалось установить GID пользователя err_user_gid = не удалось установить GID пользователя
err_user_init = не удалось инициализировать пользователя err_user_init = не удалось инициализировать пользователя
err_user_uid = не удалось установить UID пользователя err_user_uid = не удалось установить UID пользователя

View File

@@ -50,6 +50,7 @@ err_pwnam = neuspijesno skupljanje informacija o korisniku
err_user_gid = neuspijesno postavljanje korisničkog GID-a err_user_gid = neuspijesno postavljanje korisničkog GID-a
err_user_init = neuspijensa inicijalizacija korisnika err_user_init = neuspijensa inicijalizacija korisnika
err_user_uid = neuspijesno postavljanje UID-a korisnika err_user_uid = neuspijesno postavljanje UID-a korisnika

View File

@@ -50,6 +50,7 @@ err_pwnam = misslyckades att hämta användarinfo
err_user_gid = misslyckades att ställa in användar-GID err_user_gid = misslyckades att ställa in användar-GID
err_user_init = misslyckades att initialisera användaren err_user_init = misslyckades att initialisera användaren
err_user_uid = misslyckades att ställa in användar-UID err_user_uid = misslyckades att ställa in användar-UID

View File

@@ -50,6 +50,7 @@ err_pwnam = kullanici bilgileri alinamadi
err_user_gid = kullanici icin GID ayarlanamadi err_user_gid = kullanici icin GID ayarlanamadi
err_user_init = kullanici oturumu baslatilamadi err_user_init = kullanici oturumu baslatilamadi
err_user_uid = kullanici icin UID ayarlanamadi err_user_uid = kullanici icin UID ayarlanamadi

View File

@@ -50,6 +50,7 @@ err_pwnam = не вдалося отримати дані користувача
err_user_gid = не вдалося змінити GID користувача err_user_gid = не вдалося змінити GID користувача
err_user_init = не вдалося ініціалізувати користувача err_user_init = не вдалося ініціалізувати користувача
err_user_uid = не вдалося змінити UID користувача err_user_uid = не вдалося змінити UID користувача

View File

@@ -50,6 +50,7 @@ err_pwnam = 获取用户信息失败
err_user_gid = 设置用户GID失败 err_user_gid = 设置用户GID失败
err_user_init = 初始化用户失败 err_user_init = 初始化用户失败
err_user_uid = 设置用户UID失败 err_user_uid = 设置用户UID失败

View File

@@ -55,6 +55,7 @@ err_battery: []const u8 = "failed to load battery status",
err_switch_tty: []const u8 = "failed to switch tty", err_switch_tty: []const u8 = "failed to switch tty",
err_tty_ctrl: []const u8 = "tty control transfer failed", err_tty_ctrl: []const u8 = "tty control transfer failed",
err_no_users: []const u8 = "no users found", err_no_users: []const u8 = "no users found",
err_uid_range: []const u8 = "failed to dynamically get uid range",
err_user_gid: []const u8 = "failed to set user GID", err_user_gid: []const u8 = "failed to set user GID",
err_user_init: []const u8 = "failed to initialize user", err_user_init: []const u8 = "failed to initialize user",
err_user_uid: []const u8 = "failed to set user UID", err_user_uid: []const u8 = "failed to set user UID",

View File

@@ -26,6 +26,7 @@ const SavedUsers = @import("config/SavedUsers.zig");
const migrator = @import("config/migrator.zig"); const migrator = @import("config/migrator.zig");
const SharedError = @import("SharedError.zig"); const SharedError = @import("SharedError.zig");
const LogFile = @import("LogFile.zig"); const LogFile = @import("LogFile.zig");
const UidRange = @import("UidRange.zig");
const StringList = std.ArrayListUnmanaged([]const u8); const StringList = std.ArrayListUnmanaged([]const u8);
const Ini = ini.Ini; const Ini = ini.Ini;
@@ -219,7 +220,8 @@ pub fn main() !void {
migrator.lateConfigFieldHandler(&config); migrator.lateConfigFieldHandler(&config);
} }
var usernames = try getAllUsernames(allocator, config.login_defs_path); var maybe_uid_range_error: ?anyerror = null;
var usernames = try getAllUsernames(allocator, config.login_defs_path, &maybe_uid_range_error);
defer { defer {
for (usernames.items) |username| allocator.free(username); for (usernames.items) |username| allocator.free(username);
usernames.deinit(allocator); usernames.deinit(allocator);
@@ -344,6 +346,11 @@ pub fn main() !void {
try log_writer.print("unable to parse argument '{s}{s}': {s}\n", .{ longest.kind.prefix(), longest.name, @errorName(arg_parse_error) }); try log_writer.print("unable to parse argument '{s}{s}': {s}\n", .{ longest.kind.prefix(), longest.name, @errorName(arg_parse_error) });
} }
if (maybe_uid_range_error) |err| {
try info_line.addMessage(lang.err_uid_range, config.error_bg, config.error_fg);
try log_writer.print("failed to get uid range: {s}; falling back to default\n", .{@errorName(err)});
}
if (maybe_config_load_error) |err| { if (maybe_config_load_error) |err| {
// We can't localize this since the config failed to load so we'd fallback to the default language anyway // We can't localize this since the config failed to load so we'd fallback to the default language anyway
try info_line.addMessage("unable to parse config file", config.error_bg, config.error_fg); try info_line.addMessage("unable to parse config file", config.error_bg, config.error_fg);
@@ -1277,8 +1284,14 @@ fn findSessionByName(session: *Session, name: []const u8) ?usize {
return null; return null;
} }
fn getAllUsernames(allocator: std.mem.Allocator, login_defs_path: []const u8) !StringList { fn getAllUsernames(allocator: std.mem.Allocator, login_defs_path: []const u8, uid_range_error: *?anyerror) !StringList {
const uid_range = try interop.getUserIdRange(allocator, login_defs_path); const uid_range = interop.getUserIdRange(allocator, login_defs_path) catch |err| no_uid_range: {
uid_range_error.* = err;
break :no_uid_range UidRange{
.uid_min = build_options.fallback_uid_min,
.uid_max = build_options.fallback_uid_max,
};
};
var usernames: StringList = .empty; var usernames: StringList = .empty;
var maybe_entry = interop.getNextUsernameEntry(); var maybe_entry = interop.getNextUsernameEntry();