]> code.citadel.org Git - citadel.git/blobdiff - citadel/citserver.c
* Replaced most of the very repetitive and very redundant access level checks
[citadel.git] / citadel / citserver.c
index 5aafb8a518a399a3253e7bcef46e277d1d7735fe..c5417bedecb85dc29517358b776deec5860f2a36 100644 (file)
@@ -366,8 +366,10 @@ int is_public_client(char *where)
        char buf[256];
        FILE *fp;
 
-       if (hostnames_match(where,"localhost")) return(1);
-       if (hostnames_match(where,config.c_fqdn)) return(1);
+       lprintf(9, "Checking whether %s is a public client\n", where);
+
+       if (hostnames_match(where, "localhost")) return(1);
+       if (hostnames_match(where, config.c_fqdn)) return(1);
 
        fp = fopen("public_clients","r");
        if (fp == NULL) return(0);
@@ -397,6 +399,7 @@ void cmd_iden(char *argbuf)
        char desc[256];
        char from_host[256];
        struct in_addr addr;
+       int do_lookup = 0;
 
        if (num_parms(argbuf)<4) {
                cprintf("%d usage error\n",ERROR);
@@ -418,24 +421,36 @@ void cmd_iden(char *argbuf)
        safestrncpy(CC->cs_clientname, desc, sizeof CC->cs_clientname);
        CC->cs_clientname[31] = 0;
 
-       lprintf(9, "Looking up hostname '%s'\n", from_host);
-       if ((strlen(from_host)>0)
-         && ( (CC->is_local_socket) || (is_public_client(CC->cs_host)))) {
-               if ((addr.s_addr = inet_addr(from_host)) != INADDR_NONE)
+       if (strlen(from_host) > 0) {
+               if (CC->is_local_socket) do_lookup = 1;
+               else if (is_public_client(CC->cs_host)) do_lookup = 1;
+       }
+
+       if (do_lookup) {
+               lprintf(9, "Looking up hostname '%s'\n", from_host);
+               if ((addr.s_addr = inet_addr(from_host)) != -1) {
                        locate_host(CC->cs_host, &addr);
+               }
                else {
                        safestrncpy(CC->cs_host, from_host, sizeof CC->cs_host);
                        CC->cs_host[24] = 0;
                }
        }
 
+       lprintf(7, "client %d/%d/%01d.%02d (%s)\n",
+               dev_code,
+               cli_code,
+               (rev_level / 100),
+               (rev_level % 100),
+               desc);
+
        syslog(LOG_NOTICE,"client %d/%d/%01d.%02d (%s)\n",
                dev_code,
                cli_code,
                (rev_level / 100),
                (rev_level % 100),
                desc);
-               cprintf("%d Ok\n",OK);
+       cprintf("%d Ok\n",OK);
 }
 
 
@@ -496,11 +511,7 @@ void cmd_emsg(char *mname)
        char *dirs[2];
        int a;
 
-       if (CC->usersupp.axlevel < 6) {
-               cprintf("%d You must be an Aide to edit system messages.\n",
-                       ERROR+HIGHER_ACCESS_REQUIRED);
-               return;
-               }
+       if (CtdlAccessCheck(ac_aide)) return;
 
        extract(buf,mname,0);
        for (a=0; a<strlen(buf); ++a) {         /* security measure */
@@ -562,6 +573,42 @@ void GenerateRoomDisplay(char *real_room,
 
 }
 
+/*
+ * Convenience function.
+ */
+int CtdlAccessCheck(int required_level) {
+
+       if (CC->internal_pgm) return(0);
+       if (required_level >= ac_internal) {
+               cprintf("%d This is not a user-level command.\n",
+                       ERROR+HIGHER_ACCESS_REQUIRED);
+               return(-1);
+       }
+
+       if (CC->usersupp.axlevel >= 6) return(0);
+       if (required_level >= ac_aide) {
+               cprintf("%d This command requires Aide access.\n",
+                       ERROR+HIGHER_ACCESS_REQUIRED);
+               return(-1);
+       }
+
+       if (is_room_aide()) return(0);
+       if (required_level >= ac_room_aide) {
+               cprintf("%d This command requires Aide or Room Aide access.\n",
+                       ERROR + HIGHER_ACCESS_REQUIRED);
+               return(-1);
+       }
+
+       if (CC->logged_in) return(0);
+       if (required_level >= ac_logged_in) {
+               cprintf("%d Not logged in.\n", ERROR+NOT_LOGGED_IN);
+               return(-1);
+       }
+
+       /* shhh ... succeed quietly */
+       return(0);
+}
+
 
 
 /*
@@ -573,16 +620,7 @@ void cmd_term(char *cmdbuf)
        struct CitContext *ccptr;
        int found_it = 0;
 
-       if (!CC->logged_in) {
-               cprintf("%d Not logged in.\n",ERROR+NOT_LOGGED_IN);
-               return;
-               }
-
-       if (CC->usersupp.axlevel < 6) {
-               cprintf("%d You must be an Aide to terminate sessions.\n",
-                       ERROR+HIGHER_ACCESS_REQUIRED);
-               return;
-               }
+       if (CtdlAccessCheck(ac_aide)) return;
 
        session_num = extract_int(cmdbuf, 0);
        if (session_num == CC->cs_pid) {
@@ -654,16 +692,8 @@ void cmd_ipgm(char *argbuf)
  * Shut down the server
  */
 void cmd_down(void) {
-       if (!CC->logged_in) {
-               cprintf("%d Not logged in.\n", ERROR+NOT_LOGGED_IN);
-               return;
-               }
 
-       if (CC->usersupp.axlevel < 6) {
-               cprintf("%d You must be an Aide to shut down the server.\n",
-                       ERROR+HIGHER_ACCESS_REQUIRED);
-               return;
-               }
+       if (CtdlAccessCheck(ac_aide)) return;
 
        cprintf("%d Shutting down server.  Goodbye.\n", OK);
        master_cleanup();
@@ -676,16 +706,7 @@ void cmd_scdn(char *argbuf)
 {
        int new_state;
 
-       if (!CC->logged_in) {
-               cprintf("%d Not logged in.\n",ERROR+NOT_LOGGED_IN);
-               return;
-               }
-
-       if (CC->usersupp.axlevel < 6) {
-               cprintf("%d You must be an Aide to schedule a shutdown.\n",
-                       ERROR+HIGHER_ACCESS_REQUIRED);
-               return;
-               }
+       if (CtdlAccessCheck(ac_aide)) return;
 
        new_state = extract_int(argbuf, 0);
        if ((new_state == 0) || (new_state == 1)) {
@@ -1072,18 +1093,6 @@ void do_command_loop(void) {
                cmd_ipgm(&cmdbuf[5]);
                }
 
-       else if (!strncasecmp(cmdbuf,"EBIO",4)) {
-               cmd_ebio();
-               }
-
-       else if (!strncasecmp(cmdbuf,"RBIO",4)) {
-               cmd_rbio(&cmdbuf[5]);
-               }
-
-       else if (!strncasecmp(cmdbuf,"LBIO",4)) {
-               cmd_lbio();
-               }
-
        else if (!strncasecmp(cmdbuf,"TERM",4)) {
                cmd_term(&cmdbuf[5]);
                }