1ORG.FREEDESKTOP.HOME1(5) org.freedesktop.home1 ORG.FREEDESKTOP.HOME1(5)
2
3
4
6 org.freedesktop.home1 - The D-Bus interface of systemd-homed
7
9 systemd-homed.service(8) is a system service which may be used to
10 create, remove, change or inspect home areas. This page describes the
11 D-Bus interface.
12
14 The service exposes the following interfaces on the Manager object on
15 the bus:
16
17 node /org/freedesktop/home1 {
18 interface org.freedesktop.home1.Manager {
19 methods:
20 GetHomeByName(in s user_name,
21 out u uid,
22 out s home_state,
23 out u gid,
24 out s real_name,
25 out s home_directory,
26 out s shell,
27 out o bus_path);
28 GetHomeByUID(in u uid,
29 out s user_name,
30 out s home_state,
31 out u gid,
32 out s real_name,
33 out s home_directory,
34 out s shell,
35 out o bus_path);
36 GetUserRecordByName(in s user_name,
37 out s user_record,
38 out b incomplete,
39 out o bus_path);
40 GetUserRecordByUID(in u uid,
41 out s user_record,
42 out b incomplete,
43 out o bus_path);
44 ListHomes(out a(susussso) home_areas);
45 @org.freedesktop.systemd1.Privileged("true")
46 ActivateHome(in s user_name,
47 in s secret);
48 @org.freedesktop.systemd1.Privileged("true")
49 DeactivateHome(in s user_name);
50 RegisterHome(in s user_record);
51 UnregisterHome(in s user_name);
52 CreateHome(in s user_record);
53 RealizeHome(in s user_name,
54 in s secret);
55 RemoveHome(in s user_name);
56 @org.freedesktop.systemd1.Privileged("true")
57 FixateHome(in s user_name,
58 in s secret);
59 AuthenticateHome(in s user_name,
60 in s secret);
61 UpdateHome(in s user_record);
62 ResizeHome(in s user_name,
63 in t size,
64 in s secret);
65 ChangePasswordHome(in s user_name,
66 in s new_secret,
67 in s old_secret);
68 @org.freedesktop.systemd1.Privileged("true")
69 LockHome(in s user_name);
70 @org.freedesktop.systemd1.Privileged("true")
71 UnlockHome(in s user_name,
72 in s secret);
73 AcquireHome(in s user_name,
74 in s secret,
75 in b please_suspend,
76 out h send_fd);
77 @org.freedesktop.systemd1.Privileged("true")
78 RefHome(in s user_name,
79 in b please_suspend,
80 out h send_fd);
81 @org.freedesktop.systemd1.Privileged("true")
82 ReleaseHome(in s user_name);
83 @org.freedesktop.systemd1.Privileged("true")
84 LockAllHomes();
85 @org.freedesktop.systemd1.Privileged("true")
86 DeactivateAllHomes();
87 @org.freedesktop.systemd1.Privileged("true")
88 Rebalance();
89 properties:
90 readonly a(sso) AutoLogin = [...];
91 };
92 interface org.freedesktop.DBus.Peer { ... };
93 interface org.freedesktop.DBus.Introspectable { ... };
94 interface org.freedesktop.DBus.Properties { ... };
95 };
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125 Methods
126 GetHomeByName() returns basic user information (a minimal subset of the
127 full user record), provided a user name. The information supplied more
128 or less matches what getpwnam(3) returns: the numeric UID and GID, the
129 real name, home directory and shell. In addition it returns a state
130 identifier describing the state the user's home directory is in, as
131 well as a bus path referring to the bus object encapsulating the user
132 record and home directory. This object implements the
133 org.freedesktop.home1.Home interface documented below.
134
135 GetHomeByUID() is similar to GetHomeByName() but acquires the
136 information based on the numeric UID of the user.
137
138 GetUserRecordByName() is also similar to GetHomeByName() but returns
139 the full JSON user record data instead of the broken down records. An
140 additional returned boolean indicates whether the record is complete or
141 not. A record is considered complete when its "privileged" section is
142 included, and incomplete if it was removed (see JSON User Records[1]
143 for details about the various sections of a user record). Generally,
144 only privileged clients and clients running under the identity of the
145 user itself get access to the "privileged" section and will thus see
146 complete records.
147
148 GetUserRecordByUID() is similar to GetUserRecordByName() but returns
149 the user record matching the specified numeric UID.
150
151 ListHomes() returns an array of all locally managed users. The array
152 contains the same fields GetHomeByName() returns: user name, numeric
153 UID, state, numeric GID, real name, home directory, shell and bus path
154 of the matching bus object.
155
156 ActivateHome() activates (i.e. mounts) the home directory of the
157 specified user. The second argument shall contain a user record
158 consisting only of a "secret" section (all other sections should be
159 stripped, see JSON User Records[1] for details), and should contain
160 only the secret credentials necessary for unlocking the home directory.
161 Typically a client would invoke this function first with an entirely
162 empty record (which is possibly sufficient if single-factor
163 authentication with a plugged-in security token is configured), and
164 would then retry with a record populated with more information,
165 depending on the returned error code, in case more credentials are
166 necessary. This function is synchronous and returns only after the home
167 directory was fully activated (or the operation failed), which might
168 take some time. Clients must be prepared for that, and typically should
169 extend the D-Bus method call timeout accordingly. This method is
170 equivalent to the Activate() method on the org.freedesktop.home1.Home
171 interface documented below, but may be called on the manager object and
172 takes a user name as additional argument, instead.
173
174 DeactivateHome() deactivates (i.e. unmounts) the home directory of the
175 specified user. It is equivalent to the Deactivate() method on the
176 org.freedesktop.home1.Home interface documented below.
177
178 RegisterHome() registers a new home directory locally. It receives the
179 JSON user record as only argument (which typically excludes the
180 "secret" section). Registering a home directory just makes the user
181 record known to the system, it does not create a home directory or such
182 (which is expected to exist already, or created later). This operation
183 is useful to register home directories locally that are not located
184 where systemd-homed.service would find them automatically.
185
186 UnregisterHome() unregisters an existing home directory. It takes a
187 user name as argument and undoes what RegisterHome() does. It does not
188 attempt to remove the home directory itself, it just unregisters it
189 with the local system. Note that if the home directory is placed where
190 systemd-homed.service looks for home directories anyway this call will
191 only undo fixation (see below), but the record will remain known to
192 systemd-homed.service and be listed among known records. Since the user
193 record is embedded into the home directory this operation generally
194 does not discard data belonging to the user or their record. This
195 method is equivalent to Unregister() on the org.freedesktop.home1.Home
196 interface.
197
198 CreateHome() registers and creates a new home directory. This takes a
199 fully specified JSON user record as argument (including the "secret"
200 section). This registers the user record locally and creates a home
201 directory matching it, depending on the settings specified in the
202 record in combination with local configuration.
203
204 RealizeHome() creates a home directory whose user record is already
205 registered locally. This takes a user name plus a user record
206 consisting only of the "secret" section. Invoking RegisterHome()
207 followed by RealizeHome() is mostly equivalent to calling CreateHome(),
208 except that the latter combines the two in atomic fashion. This method
209 is equivalent to Realize() on the org.freedesktop.home1.Home interface.
210
211 RemoveHome() unregisters a user record locally, and removes the home
212 directory belonging to it, if it is accessible. It takes a user name as
213 argument. This method is equivalent to Remove() on the
214 org.freedesktop.home1.Home interface.
215
216 FixateHome() "fixates" an automatically discovered home directory.
217 systemd-homed.service automatically discovers home directories dropped
218 in our plugged in and adds them to the runtime list of user records it
219 manages. A user record discovered that way may be "fixated", in which
220 case it is copied out of the home directory, onto persistent storage,
221 to fixate the UID/GID assignment of the record, and extract additional
222 (typically previously encrypted) user record data from the home
223 directory. A home directory mus be fixated before it can be logged
224 into. This method call takes a user name and a JSON user record
225 consisting only of the "secret" section as argument. This method is
226 equivalent to Fixate() on the org.freedesktop.home1.Home interface.
227
228 AuthenticateHome() checks passwords or other authentication credentials
229 associated with the home directory. It takes a user name and a JSON
230 user record consisting only of the "secret" section as argument. Note
231 that many of the other method calls authenticate the user first, in
232 order to execute some other operation. This method call only
233 authenticates and executes no further operation. Like ActivateHome() it
234 is usually first invoked with an empty JSON user record, which is then
235 populated for subsequent tries with additional authentication data
236 supplied. This method is equivalent to Authenticate() on the
237 org.freedesktop.home1.Home interface.
238
239 UpdateHome() updates a locally registered user record. Takes a fully
240 specified JSON user record as argument (including the "secret"
241 section). A user with a matching name and realm must be registered
242 locally already, and the last change timestamp of the newly supplied
243 record must be newer than the previously existing user record. Note
244 this operation updates the user record only, it does not propagate
245 passwords/authentication tokens from the user record to the storage
246 back-end, or resizes the storage back-end. Typically a home directory
247 is first updated, and then the password of the underlying storage
248 updated using ChangePasswordHome() as well as the storage resized using
249 ResizeHome(). This method is equivalent to Update() on the
250 org.freedesktop.home1.Home interface.
251
252 ResizeHome() resizes the storage associated with a user record. Takes a
253 user name, a disk size in bytes and a user record consisting only of
254 the "secret" section as argument. If the size is specified as
255 UINT64_MAX the storage is resized to the size already specified in the
256 user record. Typically, if the user record is updated using
257 UpdateHome() above this is used to propagate the size configured
258 there-in down to the underlying storage back-end. This method is
259 equivalent to Resize() on the org.freedesktop.home1.Home interface.
260
261 ChangePasswordHome() changes the passwords/authentication tokens of a
262 home directory. Takes a user name, and two JSON user record objects,
263 each consisting only of the "secret" section, for the old and for the
264 new passwords/authentication tokens. If the user record with the new
265 passwords/authentication token data is specified as empty the existing
266 user record's settings are propagated down to the home directory
267 storage. This is typically used after a user record is updated using
268 UpdateHome() in order to propagate the secrets/authentication tokens
269 down to the storage. Background: depending on the backend the user's
270 authentication credentials are stored at multiple places: the user
271 record kept on the host, the user record kept in the home directory and
272 the encrypted LUKS volume slot. If the home directory is used on a
273 different machined temporarily, and the password is changed there, and
274 then is moved back to the original host, the passwords of the three
275 might get out of sync. By issuing ChangePasswordHome() the three
276 locations are updated to match the newest information. This method is
277 equivalent to ChangePassword() on the org.freedesktop.home1.Home
278 interface.
279
280 LockHome() temporarily suspends access to a home directory, flushing
281 out any cryptographic keys from memory. This is only supported on some
282 back-ends, and usually done during system suspend, in order to
283 effectively secure home directories while the system is sleeping. Takes
284 a user name as single argument. If an application attempts to access a
285 home directory while it is locked it will typically freeze until the
286 home directory is unlocked again. This method is equivalent to Lock()
287 on the org.freedesktop.home1.Home interface.
288
289 UnlockHome() undoes the effect of LockHome(). Takes a user name and a
290 user record consisting only of the "secret" section as arguments. This
291 method is equivalent to Unlock() on the org.freedesktop.home1.Home
292 interface.
293
294 AcquireHome() activates or unlocks a home directory in a reference
295 counted mode of operation. Takes a user name and user record consisting
296 only of "secret" section as argument. If the home directory is not
297 active yet, it is activated. If it is currently locked it is unlocked.
298 After completion a reference to the activation/unlocking of the home
299 directory is returned via a file descriptor. When the last client which
300 acquired such a file descriptor closes it the home directory is
301 automatically deactivated again. This method is typically invoked when
302 a user logs in, and the file descriptor is held until the user logs out
303 again, thus ensuring the user's home directory can be unmounted
304 automatically again in a robust fashion, when the user logs out. The
305 third argument is a boolean which indicates whether the client invoking
306 the call is able to automatically re-authenticate when the system comes
307 back from suspending. It should be set by all clients that implement a
308 secure lock screen running outside of the user's context, that is
309 brought up when the system comes back from suspend and can be used to
310 re-acquire the credentials to unlock the user's home directory. If a
311 home directory has at least one client with an open reference to the
312 home directory that does not support this it is not suspended
313 automatically at system suspend, otherwise it is. This method is
314 equivalent to Acquire() on the org.freedesktop.home1.Home interface.
315
316 RefHome() is similar to AcquireHome() but takes no user record with
317 "secret" section, i.e. will take an additional reference to an already
318 activated/unlocked home directory without attempting to activate/unlock
319 it itself. It will fail if the home directory is not already activated.
320 This method is equivalent to Ref() on the org.freedesktop.home1.Home
321 interface.
322
323 ReleaseHome() releases a home directory again, if all file descriptors
324 referencing it are already closed, that where acquired through
325 AcquireHome() or RefHome(). Note that this call does not actually cause
326 the deactivation of the home directory (which happens automatically
327 when the last referencing file descriptor is closed), but is simply a
328 synchronization mechanism that allows delaying of the user session's
329 termination until any triggered deactivation is completed. This method
330 is equivalent to Release() on the org.freedesktop.home1.Home interface.
331
332 LockAllHomes() locks all active home directories that only have
333 references that opted into automatic suspending during system suspend.
334 This is usually invoked automatically shortly before system suspend.
335
336 DeactivateAllHomes() deactivates all home areas that are currently
337 active. This is usually invoked automatically shortly before system
338 shutdown.
339
340 Rebalance() synchronously rebalances free disk space between home
341 areas. This only executes an operation if at least one home area using
342 the LUKS2 backend is active and has rebalancing enabled, and is
343 otherwise a NOP.
344
345 Properties
346 AutoLogin exposes an array of structures consisting of user name, seat
347 name and object path of an home directory object. All locally managed
348 users that have the "autoLogin" field set are listed here, with the
349 seat name they are associated with. A display manager may watch this
350 property and pre-fill the login screen with the users exposed this way.
351
353 node /org/freedesktop/home1/home {
354 interface org.freedesktop.home1.Home {
355 methods:
356 @org.freedesktop.systemd1.Privileged("true")
357 Activate(in s secret);
358 @org.freedesktop.systemd1.Privileged("true")
359 Deactivate();
360 Unregister();
361 Realize(in s secret);
362 Remove();
363 @org.freedesktop.systemd1.Privileged("true")
364 Fixate(in s secret);
365 Authenticate(in s secret);
366 Update(in s user_record);
367 Resize(in t size,
368 in s secret);
369 ChangePassword(in s new_secret,
370 in s old_secret);
371 @org.freedesktop.systemd1.Privileged("true")
372 Lock();
373 @org.freedesktop.systemd1.Privileged("true")
374 Unlock(in s secret);
375 @org.freedesktop.systemd1.Privileged("true")
376 Acquire(in s secret,
377 in b please_suspend,
378 out h send_fd);
379 @org.freedesktop.systemd1.Privileged("true")
380 Ref(in b please_suspend,
381 out h send_fd);
382 @org.freedesktop.systemd1.Privileged("true")
383 Release();
384 properties:
385 @org.freedesktop.DBus.Property.EmitsChangedSignal("const")
386 readonly s UserName = '...';
387 readonly u UID = ...;
388 readonly (suusss) UnixRecord = ...;
389 @org.freedesktop.DBus.Property.EmitsChangedSignal("false")
390 readonly s State = '...';
391 @org.freedesktop.DBus.Property.EmitsChangedSignal("invalidates")
392 readonly (sb) UserRecord = ...;
393 };
394 interface org.freedesktop.DBus.Peer { ... };
395 interface org.freedesktop.DBus.Introspectable { ... };
396 interface org.freedesktop.DBus.Properties { ... };
397 interface org.freedesktop.DBus.ObjectManager { ... };
398 };
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424 Methods
425 Activate(), Deactivate(), Unregister(), Realize(), Remove(), Fixate(),
426 Authenticate(), Update(), Resize(), ChangePassword(), Lock(), Unlock(),
427 Acquire(), Ref(), Release() operate like their matching counterparts on
428 the org.freedesktop.home1.Manager interface (see above). The main
429 difference is that they are methods of the home directory objects, and
430 hence carry no additional user name parameter. Which of the two flavors
431 of methods to call depends on the handles to the user known on the
432 client side: if only the user name is known, it's preferable to use the
433 methods on the manager object since they operate with user names only.
434 If however the home object path was already acquired some way it is
435 preferable to operate on the org.freedesktop.home1.Home objects
436 instead.
437
438 Properties
439 UserName contains the user name of the user account/home directory.
440
441 UID contains the numeric UNIX UID of the user account.
442
443 UnixRecord contains a structure encapsulating the six fields a struct
444 passwd typically contains (the password field is suppressed).
445
446 State exposes the current state home the home directory.
447
448 UserRecord contains the full JSON user record string of the user
449 account.
450
452 These D-Bus interfaces follow the usual interface versioning
453 guidelines[2].
454
456 systemd(1), systemd-homed.service(8), homectl(1)
457
459 1. JSON User Records
460 https://systemd.io/USER_RECORD
461
462 2. the usual interface versioning guidelines
463 https://0pointer.de/blog/projects/versioning-dbus.html
464
465
466
467systemd 254 ORG.FREEDESKTOP.HOME1(5)