]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/home/homework-password-cache.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 #include "homework-password-cache.h"
4 #include "keyring-util.h"
5 #include "missing_syscall.h"
6 #include "user-record.h"
8 void password_cache_free(PasswordCache
*cache
) {
12 cache
->volume_key
= erase_and_free(cache
->volume_key
);
13 cache
->pkcs11_passwords
= strv_free_erase(cache
->pkcs11_passwords
);
14 cache
->fido2_passwords
= strv_free_erase(cache
->fido2_passwords
);
17 void password_cache_load_keyring(UserRecord
*h
, PasswordCache
*cache
) {
18 _cleanup_free_
char *name
= NULL
;
19 _cleanup_(erase_and_freep
) void *vk
= NULL
;
27 name
= strjoin("homework-user-", h
->user_name
);
29 return (void) log_oom();
31 serial
= request_key("user", name
, NULL
, 0);
33 if (errno
== ENOKEY
) {
34 log_info("Home volume key is not available in kernel keyring.");
37 return (void) log_warning_errno(errno
, "Failed to request key '%s', ignoring: %m", name
);
40 r
= keyring_read(serial
, &vk
, &vks
);
42 return (void) log_warning_errno(r
, "Failed to read keyring key '%s', ignoring: %m", name
);
44 log_info("Successfully acquired home volume key from kernel keyring.");
46 erase_and_free(cache
->volume_key
);
47 cache
->volume_key
= TAKE_PTR(vk
);
48 cache
->volume_key_size
= vks
;