1
0
mirror of https://github.com/systemd/systemd.git synced 2025-03-19 22:50:17 +03:00

Merge 124b8bde301f348945c71ef6043f4ef42a1a1e87 into 104587314ff25a5c35390eeb42308f083e1e0488

This commit is contained in:
Adrian Vovk 2025-03-13 22:09:26 +01:00 committed by GitHub
commit 843f1f88c1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -6,6 +6,7 @@
#include <unistd.h>
#include "sd-id128.h"
#include "sd-json.h"
#include "alloc-util.h"
#include "ask-password-api.h"
@ -18,6 +19,7 @@
#include "chase.h"
#include "copy.h"
#include "creds-util.h"
#include "dirent-util.h"
#include "dissect-image.h"
#include "env-file.h"
#include "errno-util.h"
@ -1153,6 +1155,76 @@ static int process_root_account(int rfd) {
return 0;
}
static int process_regular_accounts(int rfd) {
_cleanup_close_ int creds_dfd = -EBADF, dest_dfd = -EBADF;
_cleanup_closedir_ DIR *creds_dir = NULL;
int r;
creds_dfd = open_credentials_dir();
if (creds_dfd < 0)
return log_error_errno(creds_dfd, "Failed to open credentials dir: %m");
creds_dir = take_fdopendir(&creds_dfd);
if (!creds_dir)
return log_error_errno(errno, "Failed to reopen credentials dir: %m");
FOREACH_DIRENT(de, creds_dir, return log_error_errno(errno, "Failed to read credentials dir: %m")) {
_cleanup_(sd_json_variant_unrefp) sd_json_variant *identity = NULL;
_cleanup_close_ int dest_fd = -EBADF;
_cleanup_fclose_ FILE *dest = NULL;
_cleanup_free_ char *fn = NULL;
char *username;
username = startswith(de->d_name, "user.create.");
if (!username)
continue;
if (!valid_user_group_name(username, 0)) {
log_notice("Skipping over credential with name that is not a suitable user name: %s", de->d_name);
continue;
}
r = sd_json_parse_file_at(
/* f= */ NULL,
dirfd(creds_dir),
de->d_name,
/* flags= */ 0,
&identity,
/* ret_line= */ NULL,
/* ret_column= */ NULL);
if (r < 0) {
log_warning_errno(r, "Failed to parse user record in credential '%s', ignoring: %m", de->d_name);
continue;
}
fn = strjoin(username, ".user");
if (!fn)
return log_oom();
if (dest_dfd < 0) {
dest_dfd = open_mkdir_at(rfd, "/etc/userdb/", O_CLOEXEC, 0755);
if (dest_dfd < 0)
return log_error_errno(dest_dfd, "Failed to create userdb drop-in dir: %m");
}
dest_fd = openat(dest_dfd, fn, O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC|O_NOCTTY|O_NOFOLLOW, 0600);
if (dest_fd < 0)
return log_error_errno(errno, "Failed to create .identity file in home directory: %m");
dest = take_fdopen(&dest_fd, "w");
if (!dest)
return log_oom();
r = sd_json_variant_dump(identity, SD_JSON_FORMAT_PRETTY|SD_JSON_FORMAT_FLUSH, dest, NULL);
if (r < 0)
return log_error_errno(r, "Failed to write /etc/userdb/%s: %m", fn);
log_info("Created %s from %s credential", fn, de->d_name);
}
return 0;
}
static int process_kernel_cmdline(int rfd) {
_cleanup_close_ int pfd = -EBADF;
_cleanup_free_ char *f = NULL;
@ -1747,6 +1819,10 @@ static int run(int argc, char *argv[]) {
if (r < 0)
return r;
r = process_regular_accounts(rfd);
if (r < 0)
return r;
r = process_kernel_cmdline(rfd);
if (r < 0)
return r;