diff --git a/src/XMPPCommand/Options.c b/src/XMPPCommand/Options.c index 6c67fe8..183eefc 100644 --- a/src/XMPPCommand/Options.c +++ b/src/XMPPCommand/Options.c @@ -160,7 +160,12 @@ XMPPOptionToXML(XMPPOption *opt) case XMPP_OPTION_BOOL: XMLAddAttr(elem, "type", "boolean"); break; /* TODO */ - case XMPP_OPTION_LIST: XMLAddAttr(elem, "type", "list-single"); break; + case XMPP_OPTION_LIST: + XMLAddAttr(elem, + "type", + opt->data.as_arr.single ? "list-single" : "list-multi" + ); + break; case XMPP_OPTION_FIXED: XMLAddAttr(elem, "type", "fixed"); break; } XMLAddAttr(elem, "var", opt->id); diff --git a/src/XMPPCommands/DelAdmin.c b/src/XMPPCommands/DelAdmin.c index bab7fb5..038f9a2 100644 --- a/src/XMPPCommands/DelAdmin.c +++ b/src/XMPPCommands/DelAdmin.c @@ -11,6 +11,25 @@ #include #include +/* Removes one admin user */ +static bool +DelAdmin(Array *admin_list, char *glob) +{ + size_t i; + bool removed = false; + for (i = 0; i < ArraySize(admin_list); i++) + { + char *admin = JsonValueAsString(ArrayGet(admin_list, i)); + if (StrEquals(admin, glob)) + { + removed = true; + JsonValueFree(ArrayDelete(admin_list, i)); + break; + } + } + + return removed; +} void DelAdminCallback(XMPPCommandManager *m, char *from, XMLElement *form, XMLElement *out) { @@ -20,10 +39,10 @@ DelAdminCallback(XMPPCommandManager *m, char *from, XMLElement *form, XMLElement DbRef *admins; Array *admin_list; - size_t i; - bool removed = false; + size_t i, globs; + bool removed = true; - GetFieldValue(glob, "glob", form); + GFVCount(globs, "glob", form); if (!ParseeIsAdmin(data, trimmed)) { @@ -32,26 +51,26 @@ DelAdminCallback(XMPPCommandManager *m, char *from, XMLElement *form, XMLElement Free(trimmed); return; } - if (!glob) + if (!globs) { SetNote("error", "No glob found."); Free(trimmed); return; } - Log(LOG_INFO, "glob=%s", glob); admins = DbLock(data->db, 1, "admins"); admin_list = GrabArray(DbJson(admins), 1, "admins"); - for (i = 0; i < ArraySize(admin_list); i++) + for (i = 0; i < globs; i++) { - char *admin = JsonValueAsString(ArrayGet(admin_list, i)); - if (StrEquals(admin, glob)) + GFVMulti(glob, "glob", form, i); + if (!glob) { - SetNote("info", "Admin sucessfully removed."); - removed = true; - JsonValueFree(ArrayDelete(admin_list, i)); - break; + continue; + } + if (!DelAdmin(admin_list, glob)) + { + removed = false; } } @@ -60,8 +79,10 @@ DelAdminCallback(XMPPCommandManager *m, char *from, XMLElement *form, XMLElement if (!removed) { - SetNote("warn", "Glob wasn't in list."); + SetNote("warn", "Couldn't remove some globrules."); + return; } + SetNote("info", "Sucessfully removed admins"); /* TODO */ } void @@ -77,13 +98,13 @@ FormDelAdminCallback(XMPPCommandManager *m, XMPPCommand *cmd, char *from) if (!ParseeIsAdmin(data, trimmed)) { Free(trimmed); - admin_opt = XMPPCreateList(true, true, "glob", "[NOT AUTHORIZED!]"); + admin_opt = XMPPCreateList(true, false, "glob", "[NOT AUTHORIZED!]"); XMPPAddOption(cmd, admin_opt); return; } Free(trimmed); - admin_opt = XMPPCreateList(true, true, "glob", "[NVM!]"); + admin_opt = XMPPCreateList(true, false, "glob", "[NVM!]"); admins = DbLock(data->db, 1, "admins"); admin_list = GrabArray(DbJson(admins), 1, "admins"); diff --git a/src/include/XMPPFormTool.h b/src/include/XMPPFormTool.h index c46e9d9..f4af07f 100644 --- a/src/include/XMPPFormTool.h +++ b/src/include/XMPPFormTool.h @@ -46,6 +46,23 @@ } \ } \ while(0) +#define GFVMulti(to,id,form,n) do \ +{ \ + XMLElement *field_content = XMLookForTKV(form, "field", "var", id); \ + XMLElement *value = field_content ? ArrayGet(field_content->children, n) : NULL; \ + XMLElement *val_data = value ? ArrayGet(value->children, 0) : NULL; \ + if (val_data && val_data->data) \ + { \ + to = val_data->data; \ + } \ +} \ +while(0) +#define GFVCount(to,id,form) do \ +{ \ + XMLElement *field_content = XMLookForTKV(form, "field", "var", id); \ + to = field_content ? ArraySize(field_content->children) : 0; \ +} \ +while(0) #define SetNote(type, text) do \ { \