From 203263be11a696cf68fe6036b8ab66eed7e2eee1 Mon Sep 17 00:00:00 2001 From: Panu Matilainen Date: Mon, 8 Apr 2024 09:04:17 +0300 Subject: [PATCH 1/2] Add rpmdsIsSysuser() function for testing and decoding sysusers provides Allows de-duplicating the code in tagexts, psm and any external callers. Should've done this from the start of course... The Python binding doesn't return the decoded line because it'd have to return a tuple which would be inconsistent with the other IsFoo() method returns. We'd need a separate method for decoding but that doesn't seem worth the trouble as decoding base64 in Python is so trivial. --- include/rpm/rpmds.h | 8 ++++++++ lib/rpmds.c | 27 +++++++++++++++++++++++++++ python/rpmds-py.c | 8 ++++++++ tests/rpmpython.at | 18 ++++++++++-------- 4 files changed, 53 insertions(+), 8 deletions(-) diff --git a/include/rpm/rpmds.h b/include/rpm/rpmds.h index 6f6b6c678e..6d4dea7cdc 100644 --- a/include/rpm/rpmds.h +++ b/include/rpm/rpmds.h @@ -299,6 +299,14 @@ int rpmdsIsWeak(rpmds ds); */ int rpmdsIsReverse(rpmds ds); +/** \ingroup rpmds + * Return whether dependency represents a sysusers.d entry + * @param ds dependency set + * @param[out] sysuser sysusers.d line if true (malloced), may be NULL + * @return 1 if reversed, 0 if not + */ +int rpmdsIsSysuser(rpmds ds, char **sysuser); + /** \ingroup rpmds * Return current dependency color. * @param ds dependency set diff --git a/lib/rpmds.c b/lib/rpmds.c index 14727ed96a..65a6e014f6 100644 --- a/lib/rpmds.c +++ b/lib/rpmds.c @@ -8,6 +8,7 @@ #include #include #include +#include #include "rpmds_internal.h" @@ -1179,6 +1180,32 @@ int rpmdsIsReverse(rpmds ds) return reverse; } +int rpmdsIsSysuser(rpmds ds, char **sysuser) +{ + if (rpmdsTagN(ds) != RPMTAG_PROVIDENAME) + return 0; + if (!(rpmdsFlags(ds) & RPMSENSE_EQUAL)) + return 0; + + const char *name = rpmdsN(ds); + if (!(rstreqn(name, "user(", 5) || rstreqn(name, "group(", 6) || + rstreqn(name, "groupmember(", 12))) { + return 0; + } + + char *line = NULL; + size_t llen = 0; + + if (rpmBase64Decode(rpmdsEVR(ds), (void **)&line, &llen)) + return 0; + + if (sysuser) + *sysuser = rstrndup(line, llen); + free(line); + + return 1; +} + rpmsenseFlags rpmSanitizeDSFlags(rpmTagVal tagN, rpmsenseFlags Flags) { rpmsenseFlags extra = RPMSENSE_ANY; diff --git a/python/rpmds-py.c b/python/rpmds-py.c index a79038e102..c9df0fb6d2 100644 --- a/python/rpmds-py.c +++ b/python/rpmds-py.c @@ -82,6 +82,12 @@ rpmds_IsReverse(rpmdsObject * s) return PyBool_FromLong(rpmdsIsReverse(s->ds)); } +static PyObject * +rpmds_IsSysuser(rpmdsObject * s) +{ + return PyBool_FromLong(rpmdsIsSysuser(s->ds, NULL)); +} + static PyObject * rpmds_iternext(rpmdsObject * s) { @@ -216,6 +222,8 @@ The current index in ds is positioned at overlapping member." }, "ds.IsRich() -- Return whether the dependency is rich."}, {"IsReverse", (PyCFunction)rpmds_IsReverse, METH_NOARGS, "ds.IsReverse() -- Return whether the dependency is reversed."}, + {"IsSysuser", (PyCFunction)rpmds_IsSysuser, METH_NOARGS, + "ds.IsSysuser() -- Return whether the dependency represents a sysusers.d entry."}, {NULL, NULL} /* sentinel */ }; diff --git a/tests/rpmpython.at b/tests/rpmpython.at index 6cc7976950..134c9a320b 100644 --- a/tests/rpmpython.at +++ b/tests/rpmpython.at @@ -580,15 +580,17 @@ deps.append(rpm.ds(('bar', rpm.RPMSENSE_EQUAL|rpm.RPMSENSE_MISSINGOK, '2.0'), rp deps.append(rpm.ds(('(foo if bar)',), rpm.RPMTAG_REQUIRENAME)) deps.append(rpm.ds(('(foo if bar)',), rpm.RPMTAG_SUGGESTNAME)) deps.append(rpm.ds(('(foo if bar)',), rpm.RPMTAG_SUPPLEMENTNAME)) +deps.append(rpm.ds(('user(rtkit)', rpm.RPMSENSE_EQUAL, 'dSBydGtpdCAxNzIgIlJlYWx0aW1lS2l0IiAvIC9zYmluL25vbG9naW4A'), rpm.RPMTAG_PROVIDENAME)) for d in deps: - myprint("%s %s %s %s" % (d.DNEVR(), d.IsWeak(), d.IsRich(), d.IsReverse())) -], -[R foo = 2.0 False False False -r bar = 2.0 True False False -R bar = 2.0 True False False -R (foo if bar) False True False -s (foo if bar) True True False -S (foo if bar) True True True + myprint("%s %s %s %s %s" % (d.DNEVR(), d.IsWeak(), d.IsRich(), d.IsReverse(), d.IsSysuser())) +], +[R foo = 2.0 False False False False +r bar = 2.0 True False False False +R bar = 2.0 True False False False +R (foo if bar) False True False False +s (foo if bar) True True False False +S (foo if bar) True True True False +P user(rtkit) = dSBydGtpdCAxNzIgIlJlYWx0aW1lS2l0IiAvIC9zYmluL25vbG9naW4A False False False True ], []) From a5dcb847073bb09141d81c509a5320f22dbc60c1 Mon Sep 17 00:00:00 2001 From: Panu Matilainen Date: Mon, 8 Apr 2024 09:09:26 +0300 Subject: [PATCH 2/2] Take advantage of rpmdsIsSysuser() for the tag extension + psm code --- lib/psm.c | 16 ++++------------ lib/tagexts.c | 17 ++++------------- 2 files changed, 8 insertions(+), 25 deletions(-) diff --git a/lib/psm.c b/lib/psm.c index 4d7d96aade..cc49266a78 100644 --- a/lib/psm.c +++ b/lib/psm.c @@ -373,19 +373,11 @@ static rpmRC runSysusers(rpmpsm psm) * followed by decoded sysusers lines. */ while ((dx = rpmdsNext(provides)) >= 0) { - const char *name = rpmdsN(provides); - char *fn = NULL; char *line = NULL; - size_t llen = 0; - int px = -1; - - if (!(rstreqn(name, "user(", 5) || rstreqn(name, "group(", 6) - || rstreqn(name, "groupmember(", 12))) - continue; - if (!(rpmdsFlags(provides) & RPMSENSE_EQUAL)) - continue; - if (rpmBase64Decode(rpmdsEVR(provides), (void **)&line, &llen)) + if (!rpmdsIsSysuser(provides, &line)) continue; + char *fn = NULL; + int px = -1; if (sysusers == NULL) sysusers = xcalloc(rpmdsCount(provides), sizeof(*sysusers)); @@ -408,7 +400,7 @@ static rpmRC runSysusers(rpmpsm psm) nsysusers++; } - argvAddN(&sysusers[px], line, llen); + argvAdd(&sysusers[px], line); free(fn); free(line); diff --git a/lib/tagexts.c b/lib/tagexts.c index 11c760c64b..240ff1bb29 100644 --- a/lib/tagexts.c +++ b/lib/tagexts.c @@ -985,20 +985,11 @@ static int sysusersTag(Header h, rpmtd td, headerGetFlags hgflags) rpmds provides = rpmdsNew(h, RPMTAG_PROVIDENAME, 0); while (rpmdsNext(provides) >= 0) { - size_t llen = 0; char *line = NULL; - const char *name = rpmdsN(provides); - - if (!(rstreqn(name, "user(", 5) || rstreqn(name, "group(", 6) - || rstreqn(name, "groupmember(", 12))) - continue; - if (!(rpmdsFlags(provides) & RPMSENSE_EQUAL)) - continue; - if (rpmBase64Decode(rpmdsEVR(provides), (void **)&line, &llen)) - continue; - - argvAddN(&sysusers, line, llen); - free(line); + if (rpmdsIsSysuser(provides, &line)) { + argvAdd(&sysusers, line); + free(line); + } } rpmdsFree(provides);