Merge pull request #31841 from AdrianVovk/homed-trivial
Small homed changes + revert
This commit is contained in:
@@ -415,7 +415,7 @@ int bus_home_method_authenticate(
|
||||
return 1;
|
||||
}
|
||||
|
||||
int bus_home_method_update_record(
|
||||
int bus_home_update_record(
|
||||
Home *h,
|
||||
sd_bus_message *message,
|
||||
UserRecord *hr,
|
||||
@@ -487,7 +487,7 @@ int bus_home_method_update(
|
||||
return r;
|
||||
}
|
||||
|
||||
return bus_home_method_update_record(h, message, hr, blobs, flags, error);
|
||||
return bus_home_update_record(h, message, hr, blobs, flags, error);
|
||||
}
|
||||
|
||||
int bus_home_method_resize(
|
||||
@@ -657,7 +657,7 @@ int bus_home_method_acquire(
|
||||
return r;
|
||||
|
||||
/* This operation might not be something we can executed immediately, hence queue it */
|
||||
fd = home_create_fifo(h, please_suspend ? HOME_FIFO_PLEASE_SUSPEND : HOME_FIFO_DONT_SUSPEND);
|
||||
fd = home_create_fifo(h, please_suspend);
|
||||
if (fd < 0)
|
||||
return sd_bus_reply_method_errnof(message, fd, "Failed to allocate FIFO for %s: %m", h->user_name);
|
||||
|
||||
@@ -716,7 +716,7 @@ int bus_home_method_ref(
|
||||
}
|
||||
}
|
||||
|
||||
fd = home_create_fifo(h, please_suspend ? HOME_FIFO_PLEASE_SUSPEND : HOME_FIFO_DONT_SUSPEND);
|
||||
fd = home_create_fifo(h, please_suspend);
|
||||
if (fd < 0)
|
||||
return sd_bus_reply_method_errnof(message, fd, "Failed to allocate FIFO for %s: %m", h->user_name);
|
||||
|
||||
@@ -745,51 +745,6 @@ int bus_home_method_release(
|
||||
return 1;
|
||||
}
|
||||
|
||||
int bus_home_method_inhibit_suspend(
|
||||
sd_bus_message *message,
|
||||
void *userdata,
|
||||
sd_bus_error *error) {
|
||||
|
||||
_cleanup_close_ int fd = -EBADF;
|
||||
Home *h = ASSERT_PTR(userdata);
|
||||
HomeState state;
|
||||
int r;
|
||||
|
||||
r = home_verify_polkit_async(
|
||||
h,
|
||||
message,
|
||||
"org.freedesktop.home1.inhibit-suspend",
|
||||
h->uid,
|
||||
error);
|
||||
if (r < 0)
|
||||
return r;
|
||||
if (r == 0)
|
||||
return 1; /* Will call us back */
|
||||
|
||||
state = home_get_state(h);
|
||||
switch (state) {
|
||||
case HOME_ABSENT:
|
||||
return sd_bus_error_setf(error, BUS_ERROR_HOME_ABSENT, "Home %s is currently missing or not plugged in.", h->user_name);
|
||||
case HOME_UNFIXATED:
|
||||
case HOME_INACTIVE:
|
||||
case HOME_DIRTY:
|
||||
return sd_bus_error_setf(error, BUS_ERROR_HOME_NOT_ACTIVE, "Home %s not active.", h->user_name);
|
||||
case HOME_LOCKED:
|
||||
return sd_bus_error_setf(error, BUS_ERROR_HOME_LOCKED, "Home %s is currently locked.", h->user_name);
|
||||
default:
|
||||
if (HOME_STATE_IS_ACTIVE(state))
|
||||
break;
|
||||
|
||||
return sd_bus_error_setf(error, BUS_ERROR_HOME_BUSY, "An operation on home %s is currently being executed.", h->user_name);
|
||||
}
|
||||
|
||||
fd = home_create_fifo(h, HOME_FIFO_INHIBIT_SUSPEND);
|
||||
if (fd < 0)
|
||||
return sd_bus_reply_method_errnof(message, fd, "Failed to allocate FIFO for %s: %m", h->user_name);
|
||||
|
||||
return sd_bus_reply_method_return(message, "h", fd);
|
||||
}
|
||||
|
||||
/* We map a uid_t as uint32_t bus property, let's ensure this is safe. */
|
||||
assert_cc(sizeof(uid_t) == sizeof(uint32_t));
|
||||
|
||||
@@ -949,11 +904,6 @@ const sd_bus_vtable home_vtable[] = {
|
||||
bus_home_method_ref,
|
||||
0),
|
||||
SD_BUS_METHOD("Release", NULL, NULL, bus_home_method_release, 0),
|
||||
SD_BUS_METHOD_WITH_ARGS("InhibitSuspend",
|
||||
SD_BUS_NO_ARGS,
|
||||
SD_BUS_RESULT("h", send_fd),
|
||||
bus_home_method_inhibit_suspend,
|
||||
SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
SD_BUS_VTABLE_END
|
||||
};
|
||||
|
||||
|
||||
@@ -17,7 +17,6 @@ int bus_home_method_remove(sd_bus_message *message, void *userdata, sd_bus_error
|
||||
int bus_home_method_fixate(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
int bus_home_method_authenticate(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
int bus_home_method_update(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
int bus_home_method_update_record(Home *home, sd_bus_message *message, UserRecord *hr, Hashmap *blobs, uint64_t flags, sd_bus_error *error);
|
||||
int bus_home_method_resize(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
int bus_home_method_change_password(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
int bus_home_method_lock(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
@@ -25,7 +24,8 @@ int bus_home_method_unlock(sd_bus_message *message, void *userdata, sd_bus_error
|
||||
int bus_home_method_acquire(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
int bus_home_method_ref(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
int bus_home_method_release(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
int bus_home_method_inhibit_suspend(sd_bus_message *message, void *userdata, sd_bus_error *error);
|
||||
|
||||
int bus_home_update_record(Home *home, sd_bus_message *message, UserRecord *hr, Hashmap *blobs, uint64_t flags, sd_bus_error *error);
|
||||
|
||||
extern const BusObjectImplementation home_object;
|
||||
|
||||
|
||||
+19
-41
@@ -226,7 +226,6 @@ Home *home_free(Home *h) {
|
||||
|
||||
h->ref_event_source_please_suspend = sd_event_source_disable_unref(h->ref_event_source_please_suspend);
|
||||
h->ref_event_source_dont_suspend = sd_event_source_disable_unref(h->ref_event_source_dont_suspend);
|
||||
h->inhibit_suspend_event_source = sd_event_source_disable_unref(h->inhibit_suspend_event_source);
|
||||
|
||||
h->pending_operations = ordered_set_free(h->pending_operations);
|
||||
h->pending_event_source = sd_event_source_disable_unref(h->pending_event_source);
|
||||
@@ -2707,9 +2706,6 @@ static int on_home_ref_eof(sd_event_source *s, int fd, uint32_t revents, void *u
|
||||
if (h->ref_event_source_dont_suspend == s)
|
||||
h->ref_event_source_dont_suspend = sd_event_source_disable_unref(h->ref_event_source_dont_suspend);
|
||||
|
||||
if (h->inhibit_suspend_event_source == s)
|
||||
h->inhibit_suspend_event_source = sd_event_source_disable_unref(h->inhibit_suspend_event_source);
|
||||
|
||||
if (home_is_referenced(h))
|
||||
return 0;
|
||||
|
||||
@@ -2725,42 +2721,25 @@ static int on_home_ref_eof(sd_event_source *s, int fd, uint32_t revents, void *u
|
||||
return 0;
|
||||
}
|
||||
|
||||
int home_create_fifo(Home *h, HomeFifoType type) {
|
||||
static const struct {
|
||||
const char *suffix;
|
||||
const char *description;
|
||||
size_t event_source;
|
||||
} table[_HOME_FIFO_TYPE_MAX] = {
|
||||
[HOME_FIFO_PLEASE_SUSPEND] = {
|
||||
.suffix = ".please-suspend",
|
||||
.description = "acquire-ref",
|
||||
.event_source = offsetof(Home, ref_event_source_please_suspend),
|
||||
},
|
||||
[HOME_FIFO_DONT_SUSPEND] = {
|
||||
.suffix = ".dont-suspend",
|
||||
.description = "acquire-ref-dont-suspend",
|
||||
.event_source = offsetof(Home, ref_event_source_dont_suspend),
|
||||
},
|
||||
[HOME_FIFO_INHIBIT_SUSPEND] = {
|
||||
.suffix = ".inhibit-suspend",
|
||||
.description = "inhibit-suspend",
|
||||
.event_source = offsetof(Home, inhibit_suspend_event_source),
|
||||
},
|
||||
};
|
||||
|
||||
int home_create_fifo(Home *h, bool please_suspend) {
|
||||
_cleanup_close_ int ret_fd = -EBADF;
|
||||
sd_event_source **evt;
|
||||
const char *fn;
|
||||
sd_event_source **ss;
|
||||
const char *fn, *suffix;
|
||||
int r;
|
||||
|
||||
assert(h);
|
||||
assert(type >= 0 && type < _HOME_FIFO_TYPE_MAX);
|
||||
|
||||
evt = (sd_event_source**) ((uint8_t*) h + table[type].event_source);
|
||||
if (please_suspend) {
|
||||
suffix = ".please-suspend";
|
||||
ss = &h->ref_event_source_please_suspend;
|
||||
} else {
|
||||
suffix = ".dont-suspend";
|
||||
ss = &h->ref_event_source_dont_suspend;
|
||||
}
|
||||
|
||||
fn = strjoina("/run/systemd/home/", h->user_name, table[type].suffix);
|
||||
fn = strjoina("/run/systemd/home/", h->user_name, suffix);
|
||||
|
||||
if (!*evt) {
|
||||
if (!*ss) {
|
||||
_cleanup_close_ int ref_fd = -EBADF;
|
||||
|
||||
(void) mkdir("/run/systemd/home/", 0755);
|
||||
@@ -2771,19 +2750,20 @@ int home_create_fifo(Home *h, HomeFifoType type) {
|
||||
if (ref_fd < 0)
|
||||
return log_error_errno(errno, "Failed to open FIFO %s for reading: %m", fn);
|
||||
|
||||
r = sd_event_add_io(h->manager->event, evt, ref_fd, 0, on_home_ref_eof, h);
|
||||
r = sd_event_add_io(h->manager->event, ss, ref_fd, 0, on_home_ref_eof, h);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to allocate reference FIFO event source: %m");
|
||||
|
||||
(void) sd_event_source_set_description(*evt, table[type].description);
|
||||
(void) sd_event_source_set_description(*ss, "acquire-ref");
|
||||
|
||||
r = sd_event_source_set_priority(*evt, SD_EVENT_PRIORITY_IDLE-1);
|
||||
r = sd_event_source_set_priority(*ss, SD_EVENT_PRIORITY_IDLE-1);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
r = sd_event_source_set_io_fd_own(*evt, true);
|
||||
r = sd_event_source_set_io_fd_own(*ss, true);
|
||||
if (r < 0)
|
||||
return log_error_errno(r, "Failed to pass ownership of FIFO event fd to event source: %m");
|
||||
|
||||
TAKE_FD(ref_fd);
|
||||
}
|
||||
|
||||
@@ -2863,10 +2843,8 @@ bool home_is_referenced(Home *h) {
|
||||
bool home_shall_suspend(Home *h) {
|
||||
assert(h);
|
||||
|
||||
/* We lock the home area on suspend if... */
|
||||
return h->ref_event_source_please_suspend && /* at least one client supports suspend, and... */
|
||||
!h->ref_event_source_dont_suspend && /* no clients lack support for suspend, and... */
|
||||
!h->inhibit_suspend_event_source; /* no client is temporarily inhibiting suspend */
|
||||
/* Suspend if there's at least one client referencing this home directory that wants a suspend and none who does not. */
|
||||
return h->ref_event_source_please_suspend && !h->ref_event_source_dont_suspend;
|
||||
}
|
||||
|
||||
static int home_dispatch_release(Home *h, Operation *o) {
|
||||
|
||||
+5
-18
@@ -139,17 +139,12 @@ struct Home {
|
||||
bool unregister_on_failure;
|
||||
|
||||
/* The reading side of a FIFO stored in /run/systemd/home/, the writing side being used for reference
|
||||
* counting. The references dropped to zero as soon as we see EOF. This concept exists thrice: once
|
||||
* for clients that are fine if we lock the home directory on system suspend, once for clients
|
||||
* that are not ok with that, and once for clients that are usually ok with it but temporarily
|
||||
* want to opt-out so that they can implement more advanced behavior on their own. This allows
|
||||
* us to determine for each home whether there are any clients that don't support suspend at this
|
||||
* moment. */
|
||||
* counting. The references dropped to zero as soon as we see EOF. This concept exists twice: once
|
||||
* for clients that are fine if we suspend the home directory on system suspend, and once for clients
|
||||
* that are not ok with that. This allows us to determine for each home whether there are any clients
|
||||
* that support unsuspend. */
|
||||
sd_event_source *ref_event_source_please_suspend;
|
||||
sd_event_source *ref_event_source_dont_suspend;
|
||||
/* This is distinct from ref_event_source_dont_suspend because it can be obtained from unprivileged
|
||||
* code, and thus we don't count it as a reference on the home area. */
|
||||
sd_event_source *inhibit_suspend_event_source;
|
||||
|
||||
/* Any pending operations we still need to execute. These are for operations we want to queue if we
|
||||
* can't execute them right-away. */
|
||||
@@ -215,15 +210,7 @@ int home_killall(Home *h);
|
||||
|
||||
int home_augment_status(Home *h, UserRecordLoadFlags flags, UserRecord **ret);
|
||||
|
||||
typedef enum {
|
||||
HOME_FIFO_PLEASE_SUSPEND,
|
||||
HOME_FIFO_DONT_SUSPEND,
|
||||
HOME_FIFO_INHIBIT_SUSPEND,
|
||||
_HOME_FIFO_TYPE_MAX,
|
||||
_HOME_FIFO_TYPE_INVALID = -EINVAL,
|
||||
} HomeFifoType;
|
||||
int home_create_fifo(Home *h, HomeFifoType mode);
|
||||
|
||||
int home_create_fifo(Home *h, bool please_suspend);
|
||||
int home_schedule_operation(Home *h, Operation *o, sd_bus_error *error);
|
||||
|
||||
int home_auto_login(Home *h, char ***ret_seats);
|
||||
|
||||
@@ -592,7 +592,7 @@ static int method_update_home(sd_bus_message *message, void *userdata, sd_bus_er
|
||||
if (!h)
|
||||
return sd_bus_error_setf(error, BUS_ERROR_NO_SUCH_HOME, "No home for user %s known", hr->user_name);
|
||||
|
||||
return bus_home_method_update_record(h, message, hr, blobs, flags, error);
|
||||
return bus_home_update_record(h, message, hr, blobs, flags, error);
|
||||
}
|
||||
|
||||
static int method_resize_home(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||
@@ -623,10 +623,6 @@ static int method_release_home(sd_bus_message *message, void *userdata, sd_bus_e
|
||||
return generic_home_method(userdata, message, bus_home_method_release, error);
|
||||
}
|
||||
|
||||
static int method_inhibit_suspend_home(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||
return generic_home_method(userdata, message, bus_home_method_inhibit_suspend, error);
|
||||
}
|
||||
|
||||
static int method_lock_all_homes(sd_bus_message *message, void *userdata, sd_bus_error *error) {
|
||||
_cleanup_(operation_unrefp) Operation *o = NULL;
|
||||
bool waiting = false;
|
||||
@@ -901,12 +897,6 @@ static const sd_bus_vtable manager_vtable[] = {
|
||||
method_release_home,
|
||||
0),
|
||||
|
||||
SD_BUS_METHOD_WITH_ARGS("InhibitSuspendHome",
|
||||
SD_BUS_ARGS("s", user_name),
|
||||
SD_BUS_RESULT("h", send_fd),
|
||||
method_inhibit_suspend_home,
|
||||
SD_BUS_VTABLE_UNPRIVILEGED),
|
||||
|
||||
/* An operation that acts on all homes that allow it */
|
||||
SD_BUS_METHOD("LockAllHomes", NULL, NULL, method_lock_all_homes, 0),
|
||||
SD_BUS_METHOD("DeactivateAllHomes", NULL, NULL, method_deactivate_all_homes, 0),
|
||||
|
||||
@@ -137,10 +137,6 @@
|
||||
send_interface="org.freedesktop.home1.Manager"
|
||||
send_member="ReleaseHome"/>
|
||||
|
||||
<allow send_destination="org.freedesktop.home1"
|
||||
send_interface="org.freedesktop.home1.Manager"
|
||||
send_member="InhibitSuspendHome"/>
|
||||
|
||||
<allow send_destination="org.freedesktop.home1"
|
||||
send_interface="org.freedesktop.home1.Manager"
|
||||
send_member="LockAllHomes"/>
|
||||
@@ -227,10 +223,6 @@
|
||||
send_interface="org.freedesktop.home1.Home"
|
||||
send_member="Release"/>
|
||||
|
||||
<allow send_destination="org.freedesktop.home1"
|
||||
send_interface="org.freedesktop.home1.Home"
|
||||
send_member="InhibitSuspend"/>
|
||||
|
||||
<allow receive_sender="org.freedesktop.home1"/>
|
||||
</policy>
|
||||
|
||||
|
||||
@@ -69,16 +69,6 @@
|
||||
</defaults>
|
||||
</action>
|
||||
|
||||
<action id="org.freedesktop.home1.inhibit-suspend">
|
||||
<description gettext-domain="systemd">Inhibit automatic lock of a home area</description>
|
||||
<message gettext-domain="systemd">Authentication is required to inhibit automatic lock of a user's home area.</message>
|
||||
<defaults>
|
||||
<allow_any>auth_admin_keep</allow_any>
|
||||
<allow_inactive>auth_admin_keep</allow_inactive>
|
||||
<allow_active>auth_admin_keep</allow_active>
|
||||
</defaults>
|
||||
</action>
|
||||
|
||||
<action id="org.freedesktop.home1.activate-home">
|
||||
<description gettext-domain="systemd">Activate a home area</description>
|
||||
<message gettext-domain="systemd">Authentication is required to activate a user's home area.</message>
|
||||
|
||||
Reference in New Issue
Block a user