]> jfr.im git - solanum.git/blobdiff - modules/m_privs.c
ircd/packet.c: make function definition consistent with declaration (#301)
[solanum.git] / modules / m_privs.c
index fca73bf164be344b56de8fc416b586560f6a105b..5e637576bd69f0b5aaa03dbe84f630c97fff0ef3 100644 (file)
@@ -31,7 +31,6 @@
 
 #include "stdinc.h"
 #include "client.h"
-#include "common.h"
 #include "numeric.h"
 #include "send.h"
 #include "msg.h"
 #include "modules.h"
 #include "s_conf.h"
 #include "s_newconf.h"
+#include "hash.h"
 
-static int m_privs(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]);
-static int me_privs(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]);
-static int mo_privs(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]);
 static const char privs_desc[] = "Provides the PRIVS command to inspect an operator's privileges";
 
+static void m_privs(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]);
+static void me_privs(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]);
+static void mo_privs(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[]);
+
 struct Message privs_msgtab = {
        "PRIVS", 0, 0, 0, 0,
        {mg_unreg, {m_privs, 0}, mg_ignore, mg_ignore, {me_privs, 0}, {mo_privs, 0}}
@@ -55,22 +56,26 @@ mapi_clist_av1 privs_clist[] = {
        NULL
 };
 
-/* XXX this is a copy, not so nice */
+/* XXX this is a copy, not so nice
+ *
+ * Sort of... it's int in newconf.c since oper confs don't need 64-bit wide flags.
+ * --Elizafox
+ */
 struct mode_table
 {
        const char *name;
-       unsigned int mode;
+       uint64_t mode;
 };
 
 /* there is no such table like this anywhere else */
 static struct mode_table auth_client_table[] = {
-       {"resv_exempt",         FLAGS2_EXEMPTRESV       },
-       {"kline_exempt",        FLAGS2_EXEMPTKLINE      },
-       {"flood_exempt",        FLAGS2_EXEMPTFLOOD      },
-       {"spambot_exempt",      FLAGS2_EXEMPTSPAMBOT    },
-       {"shide_exempt",        FLAGS2_EXEMPTSHIDE      },
-       {"jupe_exempt",         FLAGS2_EXEMPTJUPE       },
-       {"extend_chans",        FLAGS2_EXTENDCHANS      },
+       {"resv_exempt",         FLAGS_EXEMPTRESV        },
+       {"kline_exempt",        FLAGS_EXEMPTKLINE       },
+       {"flood_exempt",        FLAGS_EXEMPTFLOOD       },
+       {"spambot_exempt",      FLAGS_EXEMPTSPAMBOT     },
+       {"shide_exempt",        FLAGS_EXEMPTSHIDE       },
+       {"jupe_exempt",         FLAGS_EXEMPTJUPE        },
+       {"extend_chans",        FLAGS_EXTENDCHANS       },
        {NULL, 0}
 };
 
@@ -78,92 +83,115 @@ DECLARE_MODULE_AV2(privs, NULL, NULL, privs_clist, NULL, NULL, NULL, NULL, privs
 
 static void show_privs(struct Client *source_p, struct Client *target_p)
 {
-       char buf[512];
        struct mode_table *p;
 
-       buf[0] = '\0';
-       if (target_p->localClient->privset)
-               rb_strlcat(buf, target_p->localClient->privset->privs, sizeof buf);
+       send_multiline_init(source_p, " ", form_str(RPL_PRIVS),
+                       get_id(&me, source_p),
+                       get_id(source_p, source_p),
+                       target_p->name,
+                       "* ");
+
+       send_multiline_remote_pad(source_p, &me);
+       send_multiline_remote_pad(source_p, source_p);
+
+       if (target_p->user->privset)
+               for (const char *const *s = privilegeset_privs(target_p->user->privset); *s != NULL; s++)
+                       send_multiline_item(source_p, "%s", *s);
+
        if (IsOper(target_p))
        {
-               if (buf[0] != '\0')
-                       rb_strlcat(buf, " ", sizeof buf);
-               rb_strlcat(buf, "operator:", sizeof buf);
-               rb_strlcat(buf, target_p->localClient->opername, sizeof buf);
+               if (target_p->user->opername)
+                       send_multiline_item(source_p, "operator:%s", target_p->user->opername);
 
-               if (target_p->localClient->privset)
-               {
-                       if (buf[0] != '\0')
-                               rb_strlcat(buf, " ", sizeof buf);
-                       rb_strlcat(buf, "privset:", sizeof buf);
-                       rb_strlcat(buf, target_p->localClient->privset->name, sizeof buf);
-               }
+               if (target_p->user->privset)
+                       send_multiline_item(source_p, "privset:%s", target_p->user->privset->name);
        }
        p = &auth_client_table[0];
        while (p->name != NULL)
        {
-               if (target_p->flags2 & p->mode)
-               {
-                       if (buf[0] != '\0')
-                               rb_strlcat(buf, " ", sizeof buf);
-                       rb_strlcat(buf, p->name, sizeof buf);
-               }
+               if (target_p->flags & p->mode)
+                       send_multiline_item(source_p, "%s", p->name);
                p++;
        }
-       sendto_one_numeric(source_p, RPL_PRIVS, form_str(RPL_PRIVS),
-                       target_p->name, buf);
+
+       send_multiline_fini(source_p, form_str(RPL_PRIVS),
+                       get_id(&me, source_p),
+                       get_id(source_p, source_p),
+                       target_p->name,
+                       "");
 }
 
-static int me_privs(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
+static void
+me_privs(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
 {
        struct Client *target_p;
 
        if (!IsOper(source_p) || parc < 2 || EmptyString(parv[1]))
-               return 0;
+               return;
 
-       /* we cannot show privs for remote clients */
-       if((target_p = find_person(parv[1])) && MyClient(target_p))
-               show_privs(source_p, target_p);
+       target_p = find_person(parv[1]);
 
-       return 0;
+       if (target_p != NULL)
+               show_privs(source_p, target_p);
 }
 
-static int mo_privs(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
+static void
+mo_privs(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
 {
        struct Client *target_p;
+       struct Client *server_p;
 
        if (parc < 2 || EmptyString(parv[1]))
-               target_p = source_p;
+       {
+               server_p = target_p = source_p;
+       }
        else
        {
-               target_p = find_named_person(parv[1]);
-               if (target_p == NULL)
+               if (parc >= 3)
+               {
+                       server_p = find_named_client(parv[1]);
+                       target_p = find_named_person(parv[2]);
+               }
+               else
+               {
+                       server_p = target_p = find_named_person(parv[1]);
+               }
+               if (server_p == NULL || target_p == NULL)
                {
                        sendto_one_numeric(source_p, ERR_NOSUCHNICK,
                                           form_str(ERR_NOSUCHNICK), parv[1]);
-                       return 0;
+                       return;
                }
        }
 
-       if (MyClient(target_p))
+       if (target_p != source_p && !HasPrivilege(source_p, "oper:privs"))
+       {
+               sendto_one(source_p, form_str(ERR_NOPRIVS),
+                          me.name, source_p->name, "privs");
+               return;
+       }
+
+       if (!IsServer(server_p))
+               server_p = server_p->servptr;
+
+       if (IsMe(server_p))
                show_privs(source_p, target_p);
        else
-               sendto_one(target_p, ":%s ENCAP %s PRIVS %s",
-                               get_id(source_p, target_p),
-                               target_p->servptr->name,
+               sendto_one(server_p, ":%s ENCAP %s PRIVS %s",
+                               get_id(source_p, server_p),
+                               server_p->name,
                                use_id(target_p));
-       return 0;
 }
 
-static int m_privs(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
+static void
+m_privs(struct MsgBuf *msgbuf_p, struct Client *client_p, struct Client *source_p, int parc, const char *parv[])
 {
        if (parc >= 2 && !EmptyString(parv[1]) &&
                        irccmp(parv[1], source_p->name)) {
                sendto_one_numeric(source_p, ERR_NOPRIVILEGES,
                                   form_str(ERR_NOPRIVILEGES));
-               return 0;
+               return;
        }
 
        show_privs(source_p, source_p);
-       return 0;
 }