[systemd-devel] [PATCH] support statically configured acls

Lennart Poettering lennart at poettering.net
Fri Mar 22 16:16:41 PDT 2013


On Tue, 19.03.13 17:36, Ludwig Nussel (ludwig.nussel at suse.de) wrote:

> useful to get ACLs on files, sockets etc not known to udev

Can't say I like this one. Sounds like an awful lot of code to me to
support evil closed source drivers.

Kay, what do you say?

If we could find a simpler way (for example, a list setting in
logind.conf) and emphasize that this is for any file, for example
sockets/fifos, this might be more palatable to me, but I still don't
like it.

> ---
>  src/login/logind-acl.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 59 insertions(+)
> 
> diff --git a/src/login/logind-acl.c b/src/login/logind-acl.c
> index cb045a9..a44ecdc 100644
> --- a/src/login/logind-acl.c
> +++ b/src/login/logind-acl.c
> @@ -28,6 +28,18 @@
>  #include "logind-acl.h"
>  #include "util.h"
>  #include "acl-util.h"
> +#include "strv.h"
> +#include "conf-files.h"
> +
> +static const char conf_file_dirs[] =
> +        "/etc/systemd/acls.d\0"
> +        "/run/systemd/acls.d\0"
> +        "/usr/local/lib/systemd/acls.d\0"
> +        "/usr/lib/systemd/acls.d\0"
> +#ifdef HAVE_SPLIT_USR
> +        "/lib/systemd/acls.d\0"
> +#endif
> +	;
>  
>  static int flush_acl(acl_t acl) {
>          acl_entry_t i;
> @@ -171,6 +183,51 @@ finish:
>          return r;
>  }
>  
> +static int apply_static_file_acls(
> +		const char *seat,
> +		bool flush,
> +                bool del, uid_t old_uid,
> +                bool add, uid_t new_uid) {
> +	_cleanup_strv_free_ char **files = NULL;
> +	int r;
> +	char **fn;
> +
> +	r = conf_files_list_nulstr(&files, ".conf", NULL, conf_file_dirs);
> +	if (r < 0) {
> +		log_error("Failed to enumerate acl.d files: %s", strerror(-r));
> +		goto finish;
> +	}
> +
> +	STRV_FOREACH(fn, files) {
> +		_cleanup_fclose_ FILE* fp = NULL;
> +		char line[LINE_MAX];
> +
> +		r = search_and_fopen_nulstr(*fn, "re", conf_file_dirs, &fp);
> +		if (r < 0)
> +			continue;
> +
> +		FOREACH_LINE(line, fp, return -errno) {
> +			int k;
> +			char* l = strstrip(line);
> +			const char* sn = seat; // TODO: allow to specify seat in second column?
> +
> +			if (*l == '#' || *l == 0)
> +				continue;
> +
> +			log_debug("Fixing up static entry %s for seat %s...", l, sn);
> +
> +			k = devnode_acl(l, flush, del, old_uid, add, new_uid);
> +			if (k < 0) {
> +				log_error("Failed to set acl on %s: %s", l, strerror(-k));
> +			}
> +		}
> +
> +	}
> +
> +finish:
> +	return r;
> +}
> +
>  int devnode_acl_all(struct udev *udev,
>                      const char *seat,
>                      bool flush,
> @@ -240,6 +297,8 @@ int devnode_acl_all(struct udev *udev,
>                          goto finish;
>          }
>  
> +	apply_static_file_acls(seat, flush, del, old_uid, add, new_uid);
> +
>  finish:
>          if (e)
>                  udev_enumerate_unref(e);


Lennart

-- 
Lennart Poettering - Red Hat, Inc.


More information about the systemd-devel mailing list