mirror of
https://github.com/fairyglade/ly.git
synced 2026-09-22 12:00:19 +00:00
auth: Simplify PAM appdata
Signed-off-by: AnErrupTion <anerruption@disroot.org>
This commit is contained in:
@@ -421,8 +421,11 @@ pub fn getNextUsernameEntry() ?UsernameEntry {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn getUsernameEntry(username: [:0]const u8) ?UsernameEntry {
|
pub fn getUsernameEntry(allocator: std.mem.Allocator, username: []const u8) ?UsernameEntry {
|
||||||
const entry = pwd.getpwnam(username);
|
const username_z = allocator.dupeZ(u8, username) catch return null;
|
||||||
|
defer allocator.free(username_z);
|
||||||
|
|
||||||
|
const entry = pwd.getpwnam(username_z);
|
||||||
if (entry == null) return null;
|
if (entry == null) return null;
|
||||||
|
|
||||||
return .{
|
return .{
|
||||||
|
|||||||
43
src/auth.zig
43
src/auth.zig
@@ -26,6 +26,11 @@ pub const AuthOptions = struct {
|
|||||||
use_kmscon_vt: bool,
|
use_kmscon_vt: bool,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const PamAppdata = struct {
|
||||||
|
username: []const u8,
|
||||||
|
password: []const u8,
|
||||||
|
};
|
||||||
|
|
||||||
var xorg_pid: std.posix.pid_t = 0;
|
var xorg_pid: std.posix.pid_t = 0;
|
||||||
pub fn xorgSignalHandler(sig: std.posix.SIG) callconv(.c) void {
|
pub fn xorgSignalHandler(sig: std.posix.SIG) callconv(.c) void {
|
||||||
if (xorg_pid > 0) _ = std.c.kill(xorg_pid, sig);
|
if (xorg_pid > 0) _ = std.c.kill(xorg_pid, sig);
|
||||||
@@ -49,13 +54,11 @@ pub fn authenticate(allocator: std.mem.Allocator, io: std.Io, log_file: *LogFile
|
|||||||
|
|
||||||
// Open the PAM session
|
// Open the PAM session
|
||||||
try log_file.info(io, "auth/pam", "encoding credentials", .{});
|
try log_file.info(io, "auth/pam", "encoding credentials", .{});
|
||||||
const login_z = try allocator.dupeZ(u8, login);
|
|
||||||
defer allocator.free(login_z);
|
|
||||||
|
|
||||||
const password_z = try allocator.dupeZ(u8, password);
|
var credentials: PamAppdata = .{
|
||||||
defer allocator.free(password_z);
|
.username = login,
|
||||||
|
.password = password,
|
||||||
var credentials = [_:null]?[*:0]const u8{ login_z, password_z };
|
};
|
||||||
|
|
||||||
const conv = interop.pam.pam_conv{
|
const conv = interop.pam.pam_conv{
|
||||||
.conv = loginConv,
|
.conv = loginConv,
|
||||||
@@ -98,7 +101,7 @@ pub fn authenticate(allocator: std.mem.Allocator, io: std.Io, log_file: *LogFile
|
|||||||
defer interop.closePasswordDatabase();
|
defer interop.closePasswordDatabase();
|
||||||
|
|
||||||
// Get password structure from username
|
// Get password structure from username
|
||||||
user_entry = interop.getUsernameEntry(login_z) orelse return error.GetPasswordNameFailed;
|
user_entry = interop.getUsernameEntry(allocator, login) orelse return error.GetPasswordNameFailed;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set user shell if it hasn't already been set
|
// Set user shell if it hasn't already been set
|
||||||
@@ -276,6 +279,7 @@ fn loginConv(
|
|||||||
resp: ?*?[*]interop.pam.pam_response,
|
resp: ?*?[*]interop.pam.pam_response,
|
||||||
appdata_ptr: ?*anyopaque,
|
appdata_ptr: ?*anyopaque,
|
||||||
) callconv(.c) c_int {
|
) callconv(.c) c_int {
|
||||||
|
const data: *PamAppdata = @ptrCast(@alignCast(appdata_ptr));
|
||||||
const message_count: u32 = @intCast(num_msg);
|
const message_count: u32 = @intCast(num_msg);
|
||||||
const messages = msg.?;
|
const messages = msg.?;
|
||||||
|
|
||||||
@@ -289,20 +293,28 @@ fn loginConv(
|
|||||||
var username: ?[:0]u8 = null;
|
var username: ?[:0]u8 = null;
|
||||||
var password: ?[:0]u8 = null;
|
var password: ?[:0]u8 = null;
|
||||||
var status: c_int = interop.pam.PAM_SUCCESS;
|
var status: c_int = interop.pam.PAM_SUCCESS;
|
||||||
|
defer {
|
||||||
|
if (status != interop.pam.PAM_SUCCESS) {
|
||||||
|
// Memory is freed by pam otherwise
|
||||||
|
allocator.free(response);
|
||||||
|
if (username) |str| allocator.free(str);
|
||||||
|
if (password) |str| allocator.free(str);
|
||||||
|
} else {
|
||||||
|
resp.?.* = response.ptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (0..message_count) |i| set_credentials: {
|
for (0..message_count) |i| set_credentials: {
|
||||||
switch (messages[i].?.msg_style) {
|
switch (messages[i].?.msg_style) {
|
||||||
interop.pam.PAM_PROMPT_ECHO_ON => {
|
interop.pam.PAM_PROMPT_ECHO_ON => {
|
||||||
const data: [*][*:0]u8 = @ptrCast(@alignCast(appdata_ptr));
|
username = allocator.dupeZ(u8, data.username) catch {
|
||||||
username = allocator.dupeZ(u8, std.mem.span(data[0])) catch {
|
|
||||||
status = interop.pam.PAM_BUF_ERR;
|
status = interop.pam.PAM_BUF_ERR;
|
||||||
break :set_credentials;
|
break :set_credentials;
|
||||||
};
|
};
|
||||||
response[i].resp = username.?;
|
response[i].resp = username.?;
|
||||||
},
|
},
|
||||||
interop.pam.PAM_PROMPT_ECHO_OFF => {
|
interop.pam.PAM_PROMPT_ECHO_OFF => {
|
||||||
const data: [*][*:0]u8 = @ptrCast(@alignCast(appdata_ptr));
|
password = allocator.dupeZ(u8, data.password) catch {
|
||||||
password = allocator.dupeZ(u8, std.mem.span(data[1])) catch {
|
|
||||||
status = interop.pam.PAM_BUF_ERR;
|
status = interop.pam.PAM_BUF_ERR;
|
||||||
break :set_credentials;
|
break :set_credentials;
|
||||||
};
|
};
|
||||||
@@ -316,15 +328,6 @@ fn loginConv(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status != interop.pam.PAM_SUCCESS) {
|
|
||||||
// Memory is freed by pam otherwise
|
|
||||||
allocator.free(response);
|
|
||||||
if (username) |str| allocator.free(str);
|
|
||||||
if (password) |str| allocator.free(str);
|
|
||||||
} else {
|
|
||||||
resp.?.* = response.ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user