privilegeset_diff: return things in a struct
This commit is contained in:
parent
8b8320596c
commit
9962f62577
4 changed files with 49 additions and 55 deletions
|
@ -61,6 +61,12 @@ struct PrivilegeSet {
|
||||||
int refs;
|
int refs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct privset_diff {
|
||||||
|
const struct PrivilegeSet *unchanged;
|
||||||
|
const struct PrivilegeSet *added;
|
||||||
|
const struct PrivilegeSet *removed;
|
||||||
|
};
|
||||||
|
|
||||||
bool privilegeset_in_set(const struct PrivilegeSet *set, const char *priv);
|
bool privilegeset_in_set(const struct PrivilegeSet *set, const char *priv);
|
||||||
const char **privilegeset_privs(const struct PrivilegeSet *set);
|
const char **privilegeset_privs(const struct PrivilegeSet *set);
|
||||||
struct PrivilegeSet *privilegeset_set_new(const char *name, const char *privs, PrivilegeFlags flags);
|
struct PrivilegeSet *privilegeset_set_new(const char *name, const char *privs, PrivilegeFlags flags);
|
||||||
|
@ -72,6 +78,6 @@ void privilegeset_prepare_rehash(void);
|
||||||
void privilegeset_cleanup_rehash(void);
|
void privilegeset_cleanup_rehash(void);
|
||||||
void privilegeset_report(struct Client *source_p);
|
void privilegeset_report(struct Client *source_p);
|
||||||
|
|
||||||
const struct PrivilegeSet **privilegeset_diff(const struct PrivilegeSet *, const struct PrivilegeSet *);
|
struct privset_diff privilegeset_diff(const struct PrivilegeSet *, const struct PrivilegeSet *);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -319,7 +319,7 @@ privilegeset_unref(struct PrivilegeSet *set)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct PrivilegeSet **
|
struct privset_diff
|
||||||
privilegeset_diff(const struct PrivilegeSet *old, const struct PrivilegeSet *new)
|
privilegeset_diff(const struct PrivilegeSet *old, const struct PrivilegeSet *new)
|
||||||
{
|
{
|
||||||
static const char *no_privs[] = { NULL };
|
static const char *no_privs[] = { NULL };
|
||||||
|
@ -327,16 +327,15 @@ privilegeset_diff(const struct PrivilegeSet *old, const struct PrivilegeSet *new
|
||||||
static struct PrivilegeSet *set_unchanged = NULL,
|
static struct PrivilegeSet *set_unchanged = NULL,
|
||||||
*set_added = NULL,
|
*set_added = NULL,
|
||||||
*set_removed = NULL;
|
*set_removed = NULL;
|
||||||
static const struct PrivilegeSet *result_sets[3];
|
|
||||||
static size_t n_privs = 0;
|
static size_t n_privs = 0;
|
||||||
size_t new_size = n_privs ? n_privs : 32;
|
size_t new_size = n_privs ? n_privs : 32;
|
||||||
size_t i = 0, j = 0;
|
size_t i = 0, j = 0;
|
||||||
|
|
||||||
if (result_sets[0] == NULL)
|
if (set_unchanged == NULL)
|
||||||
{
|
{
|
||||||
result_sets[0] = set_unchanged = privilegeset_new_orphan("<unchanged>");
|
set_unchanged = privilegeset_new_orphan("<unchanged>");
|
||||||
result_sets[1] = set_added = privilegeset_new_orphan("<added>");
|
set_added = privilegeset_new_orphan("<added>");
|
||||||
result_sets[2] = set_removed = privilegeset_new_orphan("<removed>");
|
set_removed = privilegeset_new_orphan("<removed>");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (old == NULL)
|
if (old == NULL)
|
||||||
|
@ -390,7 +389,11 @@ privilegeset_diff(const struct PrivilegeSet *old, const struct PrivilegeSet *new
|
||||||
set_added->size = res_added - set_added->privs;
|
set_added->size = res_added - set_added->privs;
|
||||||
set_removed->size = res_removed - set_removed->privs;
|
set_removed->size = res_removed - set_removed->privs;
|
||||||
|
|
||||||
return result_sets;
|
return (struct privset_diff){
|
||||||
|
.unchanged = set_unchanged,
|
||||||
|
.added = set_added,
|
||||||
|
.removed = set_removed,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -975,19 +975,15 @@ report_and_set_user_flags(struct Client *source_p, struct ConfItem *aconf)
|
||||||
void
|
void
|
||||||
report_priv_change(struct Client *client, struct PrivilegeSet *old, struct PrivilegeSet *new)
|
report_priv_change(struct Client *client, struct PrivilegeSet *old, struct PrivilegeSet *new)
|
||||||
{
|
{
|
||||||
const struct PrivilegeSet *added, *removed, *unchanged;
|
struct privset_diff diff = privilegeset_diff(old, new);
|
||||||
const struct PrivilegeSet **result = privilegeset_diff(old, new);
|
|
||||||
unchanged = result[0];
|
|
||||||
added = result[1];
|
|
||||||
removed = result[2];
|
|
||||||
|
|
||||||
hook_data_priv_change hdata = {
|
hook_data_priv_change hdata = {
|
||||||
.client = client,
|
.client = client,
|
||||||
.new = new,
|
.new = new,
|
||||||
.old = old,
|
.old = old,
|
||||||
.unchanged = unchanged,
|
.unchanged = diff.unchanged,
|
||||||
.added = added,
|
.added = diff.added,
|
||||||
.removed = removed,
|
.removed = diff.removed,
|
||||||
};
|
};
|
||||||
call_hook(h_priv_change, &hdata);
|
call_hook(h_priv_change, &hdata);
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,23 +84,19 @@ static void test_privset_diff(void)
|
||||||
{
|
{
|
||||||
struct PrivilegeSet *old = privilegeset_set_new("old", "foo bar", 0);
|
struct PrivilegeSet *old = privilegeset_set_new("old", "foo bar", 0);
|
||||||
struct PrivilegeSet *new = privilegeset_set_new("new", "foo qux", 0);
|
struct PrivilegeSet *new = privilegeset_set_new("new", "foo qux", 0);
|
||||||
const struct PrivilegeSet *added, *removed, *unchanged;
|
struct privset_diff diff = privilegeset_diff(old, new);
|
||||||
const struct PrivilegeSet **result = privilegeset_diff(old, new);
|
|
||||||
unchanged = result[0];
|
|
||||||
added = result[1];
|
|
||||||
removed = result[2];
|
|
||||||
|
|
||||||
is_bool(true, privilegeset_in_set(unchanged, "foo"), MSG);
|
is_bool(true, privilegeset_in_set(diff.unchanged, "foo"), MSG);
|
||||||
is_bool(false, privilegeset_in_set(added, "foo"), MSG);
|
is_bool(false, privilegeset_in_set(diff.added, "foo"), MSG);
|
||||||
is_bool(false, privilegeset_in_set(removed, "foo"), MSG);
|
is_bool(false, privilegeset_in_set(diff.removed, "foo"), MSG);
|
||||||
|
|
||||||
is_bool(false, privilegeset_in_set(unchanged, "bar"), MSG);
|
is_bool(false, privilegeset_in_set(diff.unchanged, "bar"), MSG);
|
||||||
is_bool(false, privilegeset_in_set(added, "bar"), MSG);
|
is_bool(false, privilegeset_in_set(diff.added, "bar"), MSG);
|
||||||
is_bool(true, privilegeset_in_set(removed, "bar"), MSG);
|
is_bool(true, privilegeset_in_set(diff.removed, "bar"), MSG);
|
||||||
|
|
||||||
is_bool(false, privilegeset_in_set(unchanged, "qux"), MSG);
|
is_bool(false, privilegeset_in_set(diff.unchanged, "qux"), MSG);
|
||||||
is_bool(true, privilegeset_in_set(added, "qux"), MSG);
|
is_bool(true, privilegeset_in_set(diff.added, "qux"), MSG);
|
||||||
is_bool(false, privilegeset_in_set(removed, "qux"), MSG);
|
is_bool(false, privilegeset_in_set(diff.removed, "qux"), MSG);
|
||||||
|
|
||||||
cleanup();
|
cleanup();
|
||||||
}
|
}
|
||||||
|
@ -108,44 +104,37 @@ static void test_privset_diff(void)
|
||||||
static void test_privset_diff_rehash(void)
|
static void test_privset_diff_rehash(void)
|
||||||
{
|
{
|
||||||
struct PrivilegeSet *set = privilegeset_set_new("test", "foo bar", 0);
|
struct PrivilegeSet *set = privilegeset_set_new("test", "foo bar", 0);
|
||||||
const struct PrivilegeSet *added, *removed, *unchanged;
|
struct privset_diff diff;
|
||||||
const struct PrivilegeSet **result;
|
|
||||||
privilegeset_ref(set);
|
privilegeset_ref(set);
|
||||||
|
|
||||||
privilegeset_prepare_rehash();
|
privilegeset_prepare_rehash();
|
||||||
|
|
||||||
/* should have changed from foo, bar to nothing, i.e. -foo -bar */
|
/* should have changed from foo, bar to nothing, i.e. -foo -bar */
|
||||||
result = privilegeset_diff(set->shadow, set);
|
diff = privilegeset_diff(set->shadow, set);
|
||||||
unchanged = result[0];
|
|
||||||
added = result[1];
|
|
||||||
removed = result[2];
|
|
||||||
|
|
||||||
is_bool(false, privilegeset_in_set(unchanged, "foo"), MSG);
|
is_bool(false, privilegeset_in_set(diff.unchanged, "foo"), MSG);
|
||||||
is_bool(false, privilegeset_in_set(added, "foo"), MSG);
|
is_bool(false, privilegeset_in_set(diff.added, "foo"), MSG);
|
||||||
is_bool(true, privilegeset_in_set(removed, "foo"), MSG);
|
is_bool(true, privilegeset_in_set(diff.removed, "foo"), MSG);
|
||||||
|
|
||||||
is_bool(false, privilegeset_in_set(unchanged, "bar"), MSG);
|
is_bool(false, privilegeset_in_set(diff.unchanged, "bar"), MSG);
|
||||||
is_bool(false, privilegeset_in_set(added, "bar"), MSG);
|
is_bool(false, privilegeset_in_set(diff.added, "bar"), MSG);
|
||||||
is_bool(true, privilegeset_in_set(removed, "bar"), MSG);
|
is_bool(true, privilegeset_in_set(diff.removed, "bar"), MSG);
|
||||||
|
|
||||||
privilegeset_set_new("test", "foo qux", 0);
|
privilegeset_set_new("test", "foo qux", 0);
|
||||||
result = privilegeset_diff(set->shadow, set);
|
diff = privilegeset_diff(set->shadow, set);
|
||||||
unchanged = result[0];
|
|
||||||
added = result[1];
|
|
||||||
removed = result[2];
|
|
||||||
|
|
||||||
/* should have changed from foo, bar to foo, qux, i.e. =foo -bar +qux */
|
/* should have changed from foo, bar to foo, qux, i.e. =foo -bar +qux */
|
||||||
is_bool(true, privilegeset_in_set(unchanged, "foo"), MSG);
|
is_bool(true, privilegeset_in_set(diff.unchanged, "foo"), MSG);
|
||||||
is_bool(false, privilegeset_in_set(added, "foo"), MSG);
|
is_bool(false, privilegeset_in_set(diff.added, "foo"), MSG);
|
||||||
is_bool(false, privilegeset_in_set(removed, "foo"), MSG);
|
is_bool(false, privilegeset_in_set(diff.removed, "foo"), MSG);
|
||||||
|
|
||||||
is_bool(false, privilegeset_in_set(unchanged, "bar"), MSG);
|
is_bool(false, privilegeset_in_set(diff.unchanged, "bar"), MSG);
|
||||||
is_bool(false, privilegeset_in_set(added, "bar"), MSG);
|
is_bool(false, privilegeset_in_set(diff.added, "bar"), MSG);
|
||||||
is_bool(true, privilegeset_in_set(removed, "bar"), MSG);
|
is_bool(true, privilegeset_in_set(diff.removed, "bar"), MSG);
|
||||||
|
|
||||||
is_bool(false, privilegeset_in_set(unchanged, "qux"), MSG);
|
is_bool(false, privilegeset_in_set(diff.unchanged, "qux"), MSG);
|
||||||
is_bool(true, privilegeset_in_set(added, "qux"), MSG);
|
is_bool(true, privilegeset_in_set(diff.added, "qux"), MSG);
|
||||||
is_bool(false, privilegeset_in_set(removed, "qux"), MSG);
|
is_bool(false, privilegeset_in_set(diff.removed, "qux"), MSG);
|
||||||
|
|
||||||
privilegeset_cleanup_rehash();
|
privilegeset_cleanup_rehash();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue