diff --git a/build.zig b/build.zig index bf23051..fe73229 100644 --- a/build.zig +++ b/build.zig @@ -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 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_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}); @@ -52,6 +54,8 @@ pub fn build(b: *std.Build) !void { build_options.addOption([]const u8, "version", version_str); build_options.addOption(u8, "tty", default_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); const target = b.standardTargetOptions(.{}); diff --git a/res/lang/ar.ini b/res/lang/ar.ini index f98c911..a35d449 100644 --- a/res/lang/ar.ini +++ b/res/lang/ar.ini @@ -50,6 +50,7 @@ err_sleep = فشل في تنفيذ أمر sleep err_tty_ctrl = فشل في نقل تحكم الطرفية (TTY) + err_user_gid = فشل في تعيين معرّف المجموعة (GID) للمستخدم err_user_init = فشل في تهيئة بيانات المستخدم err_user_uid = فشل في تعيين معرّف المستخدم (UID) diff --git a/res/lang/cat.ini b/res/lang/cat.ini index a0bd809..f11930e 100644 --- a/res/lang/cat.ini +++ b/res/lang/cat.ini @@ -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_init = error en inicialitzar usuari err_user_uid = error en establir l'UID de l'usuari diff --git a/res/lang/cs.ini b/res/lang/cs.ini index a84757b..ee52e2a 100644 --- a/res/lang/cs.ini +++ b/res/lang/cs.ini @@ -50,6 +50,7 @@ err_pwnam = nelze získat informace o uživateli + err_user_gid = nastavení GID uživatele selhalo err_user_init = inicializace uživatele selhala err_user_uid = nastavení UID uživateli selhalo diff --git a/res/lang/de.ini b/res/lang/de.ini index 4f52bea..0715006 100644 --- a/res/lang/de.ini +++ b/res/lang/de.ini @@ -50,6 +50,7 @@ err_sleep = Sleep-Befehl fehlgeschlagen err_tty_ctrl = Fehler bei der TTY-Uebergabe + err_user_gid = Fehler beim Setzen der Gruppen-ID err_user_init = Nutzer-Initialisierung fehlgeschlagen err_user_uid = Setzen der Benutzer-ID fehlgeschlagen diff --git a/res/lang/en.ini b/res/lang/en.ini index 60368ac..6de93fb 100644 --- a/res/lang/en.ini +++ b/res/lang/en.ini @@ -11,7 +11,7 @@ err_brightness_change = failed to change brightness err_chdir = failed to open home folder err_clock_too_long = clock string too long err_config = unable to parse config file - +err_crawl = failed to crawl session directories err_dgn_oob = log message err_domain = invalid domain 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_tty_ctrl = tty control transfer failed 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_init = failed to initialize user err_user_uid = failed to set user UID diff --git a/res/lang/es.ini b/res/lang/es.ini index 62d0513..2fbba01 100644 --- a/res/lang/es.ini +++ b/res/lang/es.ini @@ -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_init = error al inicializar usuario err_user_uid = error al establecer el UID del usuario diff --git a/res/lang/fr.ini b/res/lang/fr.ini index cc6801e..046a74d 100644 --- a/res/lang/fr.ini +++ b/res/lang/fr.ini @@ -50,6 +50,7 @@ err_battery = échec de lecture de l'état de la batterie err_switch_tty = échec du changement de terminal err_tty_ctrl = échec du transfert de contrôle du terminal 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_init = échec d'initialisation de l'utilisateur err_user_uid = échec de modification du UID diff --git a/res/lang/it.ini b/res/lang/it.ini index bc69e7c..9eac717 100644 --- a/res/lang/it.ini +++ b/res/lang/it.ini @@ -50,6 +50,7 @@ err_pwnam = impossibile ottenere dati utente + err_user_gid = impossibile impostare GID utente err_user_init = impossibile inizializzare utente err_user_uid = impossible impostare UID utente diff --git a/res/lang/ja_JP.ini b/res/lang/ja_JP.ini index 23c3f84..6cb303e 100644 --- a/res/lang/ja_JP.ini +++ b/res/lang/ja_JP.ini @@ -50,6 +50,7 @@ err_sleep = スリープコマンドの実行に失敗しました err_tty_ctrl = TTY制御の転送に失敗しました + err_user_gid = ユーザーGIDの設定に失敗しました err_user_init = ユーザーの初期化に失敗しました err_user_uid = ユーザーUIDの設定に失敗しました diff --git a/res/lang/lv.ini b/res/lang/lv.ini index fcac1aa..cfaddb5 100644 --- a/res/lang/lv.ini +++ b/res/lang/lv.ini @@ -50,6 +50,7 @@ err_battery = neizdevās ielādēt akumulatora stāvokli err_switch_tty = neizdevās pārslēgt tty err_tty_ctrl = tty vadības nodošana neizdevās err_no_users = lietotāji nav atrasti + err_user_gid = neizdevās iestatīt lietotāja GID err_user_init = neizdevās inicializēt lietotāju err_user_uid = neizdevās iestatīt lietotāja UID diff --git a/res/lang/pl.ini b/res/lang/pl.ini index 42e2660..13bbc4f 100644 --- a/res/lang/pl.ini +++ b/res/lang/pl.ini @@ -50,6 +50,7 @@ err_battery = nie udało się sprawdzić statusu baterii err_switch_tty = nie można przełączyć tty err_tty_ctrl = nie udało się przekazać kontroli tty err_no_users = nie znaleziono żadnego 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_uid = nie udało się ustawić UID użytkownika diff --git a/res/lang/pt.ini b/res/lang/pt.ini index a0618c9..f33c363 100644 --- a/res/lang/pt.ini +++ b/res/lang/pt.ini @@ -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_init = erro ao iniciar o utilizador err_user_uid = erro ao definir o UID do utilizador diff --git a/res/lang/pt_BR.ini b/res/lang/pt_BR.ini index 62eae98..bf3c329 100644 --- a/res/lang/pt_BR.ini +++ b/res/lang/pt_BR.ini @@ -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_init = não foi possível iniciar o usuário err_user_uid = não foi possível definir o UID do usuário diff --git a/res/lang/ro.ini b/res/lang/ro.ini index aa59318..18c35b7 100644 --- a/res/lang/ro.ini +++ b/res/lang/ro.ini @@ -59,6 +59,7 @@ err_perm_user = nu s-a putut face downgrade permisiunilor de utilizator + login = utilizator logout = opreşte sesiunea diff --git a/res/lang/ru.ini b/res/lang/ru.ini index fd5d4ed..ac1c302 100644 --- a/res/lang/ru.ini +++ b/res/lang/ru.ini @@ -50,6 +50,7 @@ err_battery = не удалось получить статус батареи err_switch_tty = не удалось переключить tty err_tty_ctrl = передача управления tty не удалась err_no_users = пользователи не найдены + err_user_gid = не удалось установить GID пользователя err_user_init = не удалось инициализировать пользователя err_user_uid = не удалось установить UID пользователя diff --git a/res/lang/sr.ini b/res/lang/sr.ini index 96b0686..f49cbdf 100644 --- a/res/lang/sr.ini +++ b/res/lang/sr.ini @@ -50,6 +50,7 @@ err_pwnam = neuspijesno skupljanje informacija o korisniku + err_user_gid = neuspijesno postavljanje korisničkog GID-a err_user_init = neuspijensa inicijalizacija korisnika err_user_uid = neuspijesno postavljanje UID-a korisnika diff --git a/res/lang/sv.ini b/res/lang/sv.ini index 9439a07..ec9a372 100644 --- a/res/lang/sv.ini +++ b/res/lang/sv.ini @@ -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_init = misslyckades att initialisera användaren err_user_uid = misslyckades att ställa in användar-UID diff --git a/res/lang/tr.ini b/res/lang/tr.ini index d551399..c4e0b1b 100644 --- a/res/lang/tr.ini +++ b/res/lang/tr.ini @@ -50,6 +50,7 @@ err_pwnam = kullanici bilgileri alinamadi + err_user_gid = kullanici icin GID ayarlanamadi err_user_init = kullanici oturumu baslatilamadi err_user_uid = kullanici icin UID ayarlanamadi diff --git a/res/lang/uk.ini b/res/lang/uk.ini index 531f311..cddce01 100644 --- a/res/lang/uk.ini +++ b/res/lang/uk.ini @@ -50,6 +50,7 @@ err_pwnam = не вдалося отримати дані користувача + err_user_gid = не вдалося змінити GID користувача err_user_init = не вдалося ініціалізувати користувача err_user_uid = не вдалося змінити UID користувача diff --git a/res/lang/zh_CN.ini b/res/lang/zh_CN.ini index f73093b..c7d51b9 100644 --- a/res/lang/zh_CN.ini +++ b/res/lang/zh_CN.ini @@ -50,6 +50,7 @@ err_pwnam = 获取用户信息失败 + err_user_gid = 设置用户GID失败 err_user_init = 初始化用户失败 err_user_uid = 设置用户UID失败 diff --git a/src/config/Lang.zig b/src/config/Lang.zig index e116f39..55589f2 100644 --- a/src/config/Lang.zig +++ b/src/config/Lang.zig @@ -55,6 +55,7 @@ err_battery: []const u8 = "failed to load battery status", err_switch_tty: []const u8 = "failed to switch tty", err_tty_ctrl: []const u8 = "tty control transfer failed", 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_init: []const u8 = "failed to initialize user", err_user_uid: []const u8 = "failed to set user UID", diff --git a/src/main.zig b/src/main.zig index 5fc3545..4b882a9 100644 --- a/src/main.zig +++ b/src/main.zig @@ -26,6 +26,7 @@ const SavedUsers = @import("config/SavedUsers.zig"); const migrator = @import("config/migrator.zig"); const SharedError = @import("SharedError.zig"); const LogFile = @import("LogFile.zig"); +const UidRange = @import("UidRange.zig"); const StringList = std.ArrayListUnmanaged([]const u8); const Ini = ini.Ini; @@ -219,7 +220,8 @@ pub fn main() !void { 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 { for (usernames.items) |username| allocator.free(username); 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) }); } + 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| { // 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); @@ -1277,8 +1284,14 @@ fn findSessionByName(session: *Session, name: []const u8) ?usize { return null; } -fn getAllUsernames(allocator: std.mem.Allocator, login_defs_path: []const u8) !StringList { - const uid_range = try interop.getUserIdRange(allocator, login_defs_path); +fn getAllUsernames(allocator: std.mem.Allocator, login_defs_path: []const u8, uid_range_error: *?anyerror) !StringList { + 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 maybe_entry = interop.getNextUsernameEntry();