diff --git a/res/config.ini b/res/config.ini index a74cd5c..526c6f9 100644 --- a/res/config.ini +++ b/res/config.ini @@ -100,9 +100,6 @@ colormix_col2 = 0x000000FF # Color mixing animation third color id colormix_col3 = 0x20000000 -# Console path -console_dev = /dev/console - # Input box active by default on startup # Available inputs: info_line, session, login, password default_input = login diff --git a/res/lang/ar.ini b/res/lang/ar.ini index 835fd66..95644b7 100644 --- a/res/lang/ar.ini +++ b/res/lang/ar.ini @@ -13,6 +13,7 @@ err_domain = اسم نطاق غير صالح err_empty_password = لا يُسمح بكلمة مرور فارغة err_envlist = فشل في جلب قائمة المتغيرات البيئية err_hostname = فشل في جلب اسم المضيف (Hostname) + err_mlock = فشل في تأمين ذاكرة كلمة المرور (mlock) err_null = مؤشر فارغ (Null pointer) err_numlock = فشل في ضبط Num Lock @@ -38,6 +39,7 @@ err_perm_group = فشل في تخفيض صلاحيات المجموعة (Group p err_perm_user = فشل في تخفيض صلاحيات المستخدم (User permissions) err_pwnam = فشل في جلب معلومات المستخدم err_sleep = فشل في تنفيذ أمر sleep + err_tty_ctrl = فشل في نقل تحكم الطرفية (TTY) err_user_gid = فشل في تعيين معرّف المجموعة (GID) للمستخدم err_user_init = فشل في تهيئة بيانات المستخدم diff --git a/res/lang/cat.ini b/res/lang/cat.ini index 01d9232..f1adf55 100644 --- a/res/lang/cat.ini +++ b/res/lang/cat.ini @@ -13,6 +13,7 @@ err_domain = domini invàlid err_envlist = error en obtenir l'envlist err_hostname = error en obtenir el nom de l'amfitrió + err_mlock = error en bloquejar la memòria de clau err_null = punter nul err_numlock = error en establir el Bloq num @@ -39,6 +40,7 @@ err_perm_user = error en degradar els permisos de l'usuari 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 2adc297..05c2e4d 100644 --- a/res/lang/cs.ini +++ b/res/lang/cs.ini @@ -13,6 +13,7 @@ err_domain = neplatná doména err_hostname = nelze získat název hostitele + err_mlock = uzamčení paměti hesel selhalo err_null = nulový ukazatel @@ -39,6 +40,7 @@ err_perm_user = nepodařilo se snížit uživatelská oprávnění 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 47c44aa..7277510 100644 --- a/res/lang/de.ini +++ b/res/lang/de.ini @@ -13,6 +13,7 @@ err_domain = Ungueltige Domain err_empty_password = Leeres Passwort nicht zugelassen err_envlist = Fehler beim Abrufen der Umgebungs-Variablen err_hostname = Abrufen des Hostnames fehlgeschlagen + err_mlock = Sperren des Passwortspeichers fehlgeschlagen err_null = Null Pointer err_numlock = Numlock konnte nicht aktiviert werden @@ -38,6 +39,7 @@ err_perm_group = Fehler beim Heruntersetzen der Gruppenberechtigungen err_perm_user = Fehler beim Heruntersetzen der Nutzerberechtigungen err_pwnam = Abrufen der Benutzerinformationen fehlgeschlagen 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 diff --git a/res/lang/en.ini b/res/lang/en.ini index a0eae31..3e1b7d7 100644 --- a/res/lang/en.ini +++ b/res/lang/en.ini @@ -13,6 +13,7 @@ err_domain = invalid domain err_empty_password = empty password not allowed err_envlist = failed to get envlist err_hostname = failed to get hostname +err_lock_state = failed to get lock state err_mlock = failed to lock password memory err_null = null pointer err_numlock = failed to set numlock @@ -38,6 +39,7 @@ err_perm_group = failed to downgrade group permissions err_perm_user = failed to downgrade user permissions err_pwnam = failed to get user info err_sleep = failed to execute sleep command +err_switch_tty = failed to switch tty err_tty_ctrl = tty control transfer failed err_user_gid = failed to set user GID err_user_init = failed to initialize user diff --git a/res/lang/es.ini b/res/lang/es.ini index 5004d12..f9780ec 100644 --- a/res/lang/es.ini +++ b/res/lang/es.ini @@ -13,6 +13,7 @@ err_domain = dominio inválido err_hostname = error al obtener el nombre de host + err_mlock = error al bloquear la contraseña de memoria err_null = puntero nulo @@ -39,6 +40,7 @@ err_perm_user = error al degradar los permisos del usuario 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 75c7c6f..3d73ef1 100644 --- a/res/lang/fr.ini +++ b/res/lang/fr.ini @@ -13,6 +13,7 @@ err_domain = domaine invalide err_empty_password = mot de passe vide non autorisé err_envlist = échec de lecture de la liste d'environnement err_hostname = échec de lecture du nom d'hôte +err_lock_state = échec de lecture de l'état de verrouillage err_mlock = échec du verrouillage mémoire err_null = pointeur null err_numlock = échec de modification du verr.num @@ -38,6 +39,7 @@ err_perm_group = échec du déclassement des permissions de groupe err_perm_user = échec du déclassement des permissions utilisateur err_pwnam = échec de lecture des infos utilisateur err_sleep = échec de l'exécution de la commande de veille +err_switch_tty = échec du changement de terminal err_tty_ctrl = échec du transfert de contrôle du terminal err_user_gid = échec de modification du GID err_user_init = échec d'initialisation de l'utilisateur diff --git a/res/lang/it.ini b/res/lang/it.ini index 8d749c6..1781c1e 100644 --- a/res/lang/it.ini +++ b/res/lang/it.ini @@ -13,6 +13,7 @@ err_domain = dominio non valido err_hostname = impossibile ottenere hostname + err_mlock = impossibile ottenere lock per la password in memoria err_null = puntatore nullo @@ -39,6 +40,7 @@ err_perm_user = impossibile ridurre permessi utente 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/pl.ini b/res/lang/pl.ini index cdd3f29..4995ef0 100644 --- a/res/lang/pl.ini +++ b/res/lang/pl.ini @@ -13,6 +13,7 @@ err_domain = niepoprawna domena err_empty_password = puste hasło jest niedozwolone err_envlist = nie udało się pobrać listy zmiennych środowiskowych err_hostname = nie udało się uzyskać nazwy hosta + err_mlock = nie udało się zablokować pamięci haseł err_null = pusty wskaźnik err_numlock = nie udało się ustawić numlock @@ -38,6 +39,7 @@ err_perm_group = nie udało się obniżyć uprawnień grupy err_perm_user = nie udało się obniżyć uprawnień użytkownika err_pwnam = nie udało się uzyskać informacji o użytkowniku err_sleep = nie udało się wykonać polecenia sleep + err_tty_ctrl = nie udało się przekazać kontroli tty err_user_gid = nie udało się ustawić GID użytkownika err_user_init = nie udało się zainicjalizować użytkownika diff --git a/res/lang/pt.ini b/res/lang/pt.ini index 25361b6..a4f0fa8 100644 --- a/res/lang/pt.ini +++ b/res/lang/pt.ini @@ -13,6 +13,7 @@ err_domain = domínio inválido err_hostname = erro ao obter o nome do host + err_mlock = erro de bloqueio de memória err_null = ponteiro nulo @@ -39,6 +40,7 @@ err_perm_user = erro ao reduzir as permissões do utilizador 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 8148e27..2d2bb89 100644 --- a/res/lang/pt_BR.ini +++ b/res/lang/pt_BR.ini @@ -13,6 +13,7 @@ err_domain = domínio inválido err_hostname = não foi possível obter o nome do host + err_mlock = bloqueio da memória de senha malsucedido err_null = ponteiro nulo @@ -39,6 +40,7 @@ err_perm_user = não foi possível reduzir as permissões de usuário 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 f4928cf..9f50c8f 100644 --- a/res/lang/ro.ini +++ b/res/lang/ro.ini @@ -17,6 +17,7 @@ err_console_dev = nu s-a putut accesa consola + err_pam_abort = tranzacţie pam anulată err_pam_acct_expired = cont expirat err_pam_auth = eroare de autentificare @@ -47,6 +48,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 8e9b1a0..fe7315e 100644 --- a/res/lang/ru.ini +++ b/res/lang/ru.ini @@ -13,6 +13,7 @@ err_domain = неверный домен err_hostname = не удалось получить имя хоста + err_mlock = сбой блокировки памяти err_null = нулевой указатель @@ -39,6 +40,7 @@ err_perm_user = не удалось понизить права доступа err_pwnam = не удалось получить информацию о пользователе + err_user_gid = не удалось установить GID пользователя err_user_init = не удалось инициализировать пользователя err_user_uid = не удалось установить UID пользователя diff --git a/res/lang/sr.ini b/res/lang/sr.ini index bedc690..9251011 100644 --- a/res/lang/sr.ini +++ b/res/lang/sr.ini @@ -13,6 +13,7 @@ err_domain = nevazeci domen err_hostname = neuspijesno trazenje hostname-a + err_mlock = neuspijesno zakljucavanje memorije lozinke err_null = null pokazivac @@ -39,6 +40,7 @@ err_perm_user = neuspijesno snizavanje dozvola korisnika 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 40b8cbd..aad2244 100644 --- a/res/lang/sv.ini +++ b/res/lang/sv.ini @@ -13,6 +13,7 @@ err_domain = okänd domän err_hostname = misslyckades att hämta värdnamn + err_mlock = misslyckades att låsa lösenordsminne err_null = nullpekare @@ -39,6 +40,7 @@ err_perm_user = misslyckades att nergradera användarbehörigheter 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 77a22ae..6ad0e94 100644 --- a/res/lang/tr.ini +++ b/res/lang/tr.ini @@ -13,6 +13,7 @@ err_domain = gecersiz etki alani err_hostname = ana bilgisayar adi alinamadi + err_mlock = parola bellegi kilitlenemedi err_null = bos isaretci hatasi @@ -39,6 +40,7 @@ err_perm_user = kullanici izinleri dusurulemedi 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 a24731e..df925df 100644 --- a/res/lang/uk.ini +++ b/res/lang/uk.ini @@ -13,6 +13,7 @@ err_domain = недійсний домен err_hostname = не вдалося отримати ім'я хосту + err_mlock = збій блокування пам'яті err_null = нульовий вказівник @@ -39,6 +40,7 @@ err_perm_user = не вдалося понизити права доступу 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 9960d07..d1ccc57 100644 --- a/res/lang/zh_CN.ini +++ b/res/lang/zh_CN.ini @@ -13,6 +13,7 @@ err_domain = 无效的域 err_hostname = 获取主机名失败 + err_mlock = 锁定密码存储器失败 err_null = 空指针 @@ -39,6 +40,7 @@ err_perm_user = 用户权限降级失败 err_pwnam = 获取用户信息失败 + err_user_gid = 设置用户GID失败 err_user_init = 初始化用户失败 err_user_uid = 设置用户UID失败 diff --git a/src/config/Config.zig b/src/config/Config.zig index 558668b..874a75e 100644 --- a/src/config/Config.zig +++ b/src/config/Config.zig @@ -28,7 +28,6 @@ cmatrix_max_codepoint: u16 = 0x7B, colormix_col1: u32 = 0x00FF0000, colormix_col2: u32 = 0x000000FF, colormix_col3: u32 = 0x20000000, -console_dev: []const u8 = "/dev/console", default_input: Input = .login, doom_top_color: u32 = 0x00FF0000, doom_middle_color: u32 = 0x00FFFF00, diff --git a/src/config/Lang.zig b/src/config/Lang.zig index 3360b71..8334d6c 100644 --- a/src/config/Lang.zig +++ b/src/config/Lang.zig @@ -18,6 +18,7 @@ err_domain: []const u8 = "invalid domain", err_empty_password: []const u8 = "empty password not allowed", err_envlist: []const u8 = "failed to get envlist", err_hostname: []const u8 = "failed to get hostname", +err_lock_state: []const u8 = "failed to get lock state", err_mlock: []const u8 = "failed to lock password memory", err_null: []const u8 = "null pointer", err_numlock: []const u8 = "failed to set numlock", @@ -43,6 +44,7 @@ err_perm_group: []const u8 = "failed to downgrade group permissions", err_perm_user: []const u8 = "failed to downgrade user permissions", err_pwnam: []const u8 = "failed to get user info", err_sleep: []const u8 = "failed to execute sleep command", +err_switch_tty: []const u8 = "failed to switch tty", err_tty_ctrl: []const u8 = "tty control transfer failed", err_user_gid: []const u8 = "failed to set user GID", err_user_init: []const u8 = "failed to initialize user", diff --git a/src/interop.zig b/src/interop.zig index 9fc5017..8540c21 100644 --- a/src/interop.zig +++ b/src/interop.zig @@ -36,7 +36,7 @@ pub const stdlib = @cImport({ pub const pwd = @cImport({ @cInclude("pwd.h"); // We include a FreeBSD-specific header here since login_cap.h references - // the passwd struct directly, so we can't import it separately' + // the passwd struct directly, so we can't import it separately if (builtin.os.tag == .freebsd) @cInclude("login_cap.h"); }); @@ -75,23 +75,21 @@ pub fn timeAsString(buf: [:0]u8, format: [:0]const u8) ![]u8 { return buf[0..len]; } -pub fn switchTty(console_dev: []const u8, tty: u8) !void { - const fd = try std.posix.open(console_dev, .{ .ACCMODE = .WRONLY }, 0); - defer std.posix.close(fd); +pub fn switchTty(tty: u8) !void { + var status = std.c.ioctl(std.c.STDIN_FILENO, vt.VT_ACTIVATE, tty); + if (status != 0) return error.FailedToActivateTty; - _ = std.c.ioctl(fd, vt.VT_ACTIVATE, tty); - _ = std.c.ioctl(fd, vt.VT_WAITACTIVE, tty); + status = std.c.ioctl(std.c.STDIN_FILENO, vt.VT_WAITACTIVE, tty); + if (status != 0) return error.FailedToWaitForActiveTty; } -pub fn getLockState(console_dev: []const u8) !struct { +pub fn getLockState() !struct { numlock: bool, capslock: bool, } { - const fd = try std.posix.open(console_dev, .{ .ACCMODE = .RDONLY }, 0); - defer std.posix.close(fd); - var led: LedState = undefined; - _ = std.c.ioctl(fd, get_led_state, &led); + const status = std.c.ioctl(std.c.STDIN_FILENO, get_led_state, &led); + if (status != 0) return error.FailedToGetLockState; return .{ .numlock = (led & numlock_led) != 0, @@ -101,11 +99,12 @@ pub fn getLockState(console_dev: []const u8) !struct { pub fn setNumlock(val: bool) !void { var led: LedState = undefined; - _ = std.c.ioctl(0, get_led_state, &led); + var status = std.c.ioctl(std.c.STDIN_FILENO, get_led_state, &led); + if (status != 0) return error.FailedToGetNumlock; const numlock = (led & numlock_led) != 0; if (numlock != val) { - const status = std.c.ioctl(std.posix.STDIN_FILENO, set_led_state, led ^ numlock_led); + status = std.c.ioctl(std.posix.STDIN_FILENO, set_led_state, led ^ numlock_led); if (status != 0) return error.FailedToSetNumlock; } } diff --git a/src/main.zig b/src/main.zig index 17309df..9e51691 100644 --- a/src/main.zig +++ b/src/main.zig @@ -389,12 +389,10 @@ pub fn main() !void { var update = true; var resolution_changed = false; var auth_fails: u64 = 0; - var can_access_console_dev = true; - // Switch to selected TTY if possible - interop.switchTty(config.console_dev, config.tty) catch { - try info_line.addMessage(lang.err_console_dev, config.error_bg, config.error_fg); - can_access_console_dev = false; + // Switch to selected TTY + interop.switchTty(config.tty) catch { + try info_line.addMessage(lang.err_switch_tty, config.error_bg, config.error_fg); }; while (run) { @@ -546,9 +544,9 @@ pub fn main() !void { buffer.drawLabel(label_txt, buffer.box_x, buffer.box_y + buffer.box_height); } - if (can_access_console_dev) draw_lock_state: { - const lock_state = interop.getLockState(config.console_dev) catch { - try info_line.addMessage(lang.err_console_dev, config.error_bg, config.error_fg); + draw_lock_state: { + const lock_state = interop.getLockState() catch { + try info_line.addMessage(lang.err_lock_state, config.error_bg, config.error_fg); break :draw_lock_state; };