Przeglądaj źródła

* Added whois_access(whoiser, victim) for checking higher flags...

svn: 574
Bryan Drewery 22 lat temu
rodzic
commit
499ed4ff93
5 zmienionych plików z 42 dodań i 30 usunięć
  1. 1 0
      doc/UPDATES
  2. 19 17
      src/cmds.c
  3. 17 0
      src/misc.c
  4. 1 0
      src/proto.h
  5. 4 13
      src/users.c

+ 1 - 0
doc/UPDATES

@@ -20,6 +20,7 @@ This is a summary of ChangeLog basically.
 17.Removed some redundant system calls in getin system.
 18.Fixed bots asking bots for ops in a chan where the op-bot is +d
 19.Changed cosmetics of ADDRESS: display in .whois for bots.
+20.cmd_match/cmd_userlist allowed getting around cmd_whois security checks.
 
 1.0.14
 1.Fixed order of log/info for cmd_whoami.

+ 19 - 17
src/cmds.c

@@ -981,7 +981,7 @@ static void cmd_userlist(struct userrec *u, int idx, char *par)
   putlog(LOG_CMDS, "*", STR("#%s# userlist"), dcc[idx].nick);
 
   for (u=userlist;u;u=u->next) {
-    if ((u->flags & USER_BOT) && (u->flags & USER_CHANHUB)) {
+    if (whois_access(dcc[idx].user, u) && (u->flags & USER_BOT) && (u->flags & USER_CHANHUB)) {
       if (cnt)
         dprintf(idx, ", ");
       else
@@ -1002,7 +1002,7 @@ static void cmd_userlist(struct userrec *u, int idx, char *par)
 
 #ifdef HUB
   for (u=userlist;u;u=u->next) {
-    if (!(u->flags & USER_BOT) && (u->flags & USER_ADMIN)) {
+    if (whois_access(dcc[idx].user, u) && !(u->flags & USER_BOT) && (u->flags & USER_ADMIN)) {
       if (cnt)
         dprintf(idx, ", ");
       else
@@ -1023,7 +1023,7 @@ static void cmd_userlist(struct userrec *u, int idx, char *par)
 
 
   for (u=userlist;u;u=u->next) {
-    if (!(u->flags & (USER_BOT | USER_ADMIN)) && (u->flags & USER_OWNER)) {
+    if (whois_access(dcc[idx].user, u) && !(u->flags & (USER_BOT | USER_ADMIN)) && (u->flags & USER_OWNER)) {
       if (cnt)
         dprintf(idx, ", ");
       else
@@ -1043,7 +1043,7 @@ static void cmd_userlist(struct userrec *u, int idx, char *par)
   cnt=0;
 
   for (u=userlist;u;u=u->next) {
-    if (!(u->flags & (USER_BOT | USER_OWNER)) && (u->flags & USER_MASTER)) {
+    if (whois_access(dcc[idx].user, u) && !(u->flags & (USER_BOT | USER_OWNER)) && (u->flags & USER_MASTER)) {
       if (cnt)
         dprintf(idx, ", ");
       else
@@ -1063,21 +1063,23 @@ static void cmd_userlist(struct userrec *u, int idx, char *par)
 #endif /* HUB */
 
   for (u=userlist;u;u=u->next) {
+    if (whois_access(dcc[idx].user, u)) {
 #ifdef HUB
-    if (!(u->flags & (USER_BOT | USER_MASTER)) && (u->flags & USER_OP)) {
+      if (!(u->flags & (USER_BOT | USER_MASTER)) && (u->flags & USER_OP)) {
 #else /* !HUB */
-    if (!(u->flags & USER_BOT) && (u->flags & USER_OP)) {
+      if (!(u->flags & USER_BOT) && (u->flags & USER_OP)) {
 #endif /* HUB */
-      if (cnt)
-        dprintf(idx, ", ");
-      else
-        dprintf(idx, STR("Ops     : "));
-      dprintf(idx, u->handle);
-      cnt++;
-      tt++;
-      if (cnt == 15) {
-        dprintf(idx, "\n");
-        cnt=0;
+        if (cnt)
+          dprintf(idx, ", ");
+        else
+          dprintf(idx, STR("Ops     : "));
+        dprintf(idx, u->handle);
+        cnt++;
+        tt++;
+        if (cnt == 15) {
+          dprintf(idx, "\n");
+          cnt=0;
+        }
       }
     }
   }
@@ -1086,7 +1088,7 @@ static void cmd_userlist(struct userrec *u, int idx, char *par)
   cnt=0;
 
   for (u=userlist;u;u=u->next) {
-    if (!(u->flags & (USER_BOT | USER_OP))) {
+    if (whois_access(dcc[idx].user, u) && !(u->flags & (USER_BOT | USER_OP))) {
       if (cnt)
         dprintf(idx, ", ");
       else

+ 17 - 0
src/misc.c

@@ -2309,3 +2309,20 @@ void baduname(char *conf, char *my_uname) {
   }
   nfree(tmpfile);
 }
+
+
+int whois_access(struct userrec *user, struct userrec *whois_user) 
+{
+  struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
+  struct flag_record whois = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
+ 
+  get_user_flagrec(user, &fr, NULL);
+  get_user_flagrec(whois_user, &whois, NULL);
+
+  if ((glob_master(whois) && !glob_master(fr)) ||
+     (glob_owner(whois) && !glob_owner(fr)) ||
+     (glob_admin(whois) && !glob_admin(fr)) ||
+     (glob_bot(whois) && !glob_master(fr)))
+    return 0;
+  return 1;
+}

+ 1 - 0
src/proto.h

@@ -232,6 +232,7 @@ void set_cmd_pass(char *, int);
 #endif /* S_DCCPASS */
 
 /* misc.c */
+int whois_access(struct userrec *, struct userrec *);
 void baduname(char *, char *);
 int email(char *, char *, int);
 char *color(int, int, int);

+ 4 - 13
src/users.c

@@ -542,8 +542,6 @@ void tell_user_ident(int idx, char *id, int master)
   char format[81];
   struct userrec *u;
   struct flag_record user = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
-  struct flag_record fr = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0};
-  int noax = 0;
 
   get_user_flagrec(dcc[idx].user, &user, NULL);
 
@@ -551,16 +549,7 @@ void tell_user_ident(int idx, char *id, int master)
   if (u == NULL)
     u = get_user_by_host(id);
 
-  if (u) {
-    get_user_flagrec(u, &fr, NULL);
-
-    if (glob_master(fr) && !glob_master(user)) { u = dcc[idx].user; noax = 1; }
-    else if (glob_owner(fr) && !glob_owner(user)) { u = dcc[idx].user; noax = 1; }
-    else if (glob_admin(fr) && !glob_admin(user)) { u = dcc[idx].user; noax = 1; }
-    else if (glob_bot(fr) && !glob_master(user)) { u = dcc[idx].user; noax = 1; }
-  }
-
-  if (u == NULL || noax) {
+  if (u == NULL || (u && !whois_access(dcc[idx].user, u))) {
     dprintf(idx, "%s.\n", USERF_NOMATCH);
     return;
   }
@@ -608,7 +597,9 @@ void tell_users_match(int idx, char *mtch, int start, int limit,
     flags = 1;
   }
   for (u = userlist; u; u = u->next) {
-    if (flags) {
+    if (!whois_access(dcc[idx].user, u)) {
+      continue;
+    } else if (flags) {
       get_user_flagrec(u, &user, chname);
       if (flagrec_eq(&pls, &user)) {
 	if (nomns || !flagrec_eq(&mns, &user)) {