* Began (but did not finish) applying GPL3+ declarations to each source file. This...
[citadel.git] / citadel / citserver.c
index f127449d434ffd3f085506d936827993f9a65dec..b6970bf0a1b5239cdfcd518c02615225ccb37110 100644 (file)
@@ -3,6 +3,21 @@
  *
  * Main source module for the Citadel server
  *
+ * Copyright (c) 1987-2009 by the citadel.org team
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
 #include "sysdep.h"
@@ -278,7 +293,7 @@ void RemoveContext (struct CitContext *con)
 /*
  * cmd_info()  -  tell the client about this server
  */
-void cmd_info(void) {
+void cmd_info(char *cmdbuf) {
        cprintf("%d Server info:\n", LISTING_FOLLOWS);
        cprintf("%d\n", CC->cs_pid);
        cprintf("%s\n", config.c_nodename);
@@ -343,7 +358,7 @@ char CtdlCheckExpress(void) {
        }
 }
 
-void cmd_time(void)
+void cmd_time(char *argbuf)
 {
    time_t tv;
    struct tm tmp;
@@ -781,7 +796,7 @@ void cmd_term(char *cmdbuf)
 /* 
  * get the paginator prompt
  */
-void cmd_more(void) {
+void cmd_more(char *argbuf) {
        cprintf("%d %s\n", CIT_OK, config.c_moreprompt);
 }
 
@@ -863,7 +878,7 @@ void cmd_down(char *argbuf) {
 /*
  * Halt the server without exiting the server process.
  */
-void cmd_halt(void) {
+void cmd_halt(char *argbuf) {
 
        if (CtdlAccessCheck(ac_aide)) return;
 
@@ -966,6 +981,7 @@ void begin_session(struct CitContext *con)
        generate_nonce(con);
        safestrncpy(con->cs_host, config.c_fqdn, sizeof con->cs_host);
        safestrncpy(con->cs_addr, "", sizeof con->cs_addr);
+       con->cs_UDSclientUID = -1;
        con->cs_host[sizeof con->cs_host - 1] = 0;
        len = sizeof sin;
        if (!CC->is_local_socket) {
@@ -978,6 +994,34 @@ void begin_session(struct CitContext *con)
        }
        else {
                strcpy(con->cs_host, "");
+#ifdef HAVE_STRUCT_UCRED
+               {
+                       /* as http://www.wsinnovations.com/softeng/articles/uds.html told us... */
+                       struct ucred credentials;
+                       int ucred_length = sizeof(struct ucred);
+                       
+                       /*fill in the user data structure */
+                       if(getsockopt(con->client_socket, SOL_SOCKET, SO_PEERCRED, &credentials, &ucred_length)) {
+                               CtdlLogPrintf(CTDL_NOTICE, "could obtain credentials from unix domain socket");
+                               
+                       }
+                       else {          
+                               /* the process ID of the process on the other side of the socket */
+                               /* credentials.pid; */
+                               
+                               /* the effective UID of the process on the other side of the socket  */
+                               con->cs_UDSclientUID = credentials.uid;
+                               
+                               /* the effective primary GID of the process on the other side of the socket */
+                               /* credentials.gid; */
+                               
+                               /* To get supplemental groups, we will have to look them up in our account
+                                  database, after a reverse lookup on the UID to get the account name.
+                                  We can take this opportunity to check to see if this is a legit account.
+                               */
+                       }
+               }
+#endif
        }
        con->cs_flags = 0;
        con->upload_type = UPL_FILE;
@@ -1009,13 +1053,35 @@ void citproto_begin_session() {
                CC->kill_me = 1;
        }
        else {
-               cprintf("%d %s Citadel server ready.\n",
-                       CIT_OK, config.c_nodename);
+               cprintf("%d %s Citadel server ready.\n", CIT_OK, config.c_nodename);
+               CC->can_receive_im = 1;
        }
 }
 
 
 
+void cmd_noop(char *argbuf)
+{
+       cprintf("%d%cok\n", CIT_OK, CtdlCheckExpress() );
+}
+
+void cmd_qnop(char *argbuf)
+{
+       /* do nothing, this command returns no response */
+}
+
+void cmd_quit(char *argbuf)
+{
+       cprintf("%d Goodbye.\n", CIT_OK);
+       CC->kill_me = 1;
+}
+
+void cmd_lout(char *argbuf)
+{
+       if (CC->logged_in) 
+               logout();
+       cprintf("%d logged out.\n", CIT_OK);
+}
 
 /*
  * This loop recognizes all server commands.
@@ -1070,367 +1136,9 @@ void do_command_loop(void) {
           CC->cs_flags &= ~CS_POSTING;
        }
                   
-       if (!strncasecmp(cmdbuf, "NOOP", 4)) {
-               cprintf("%d%cok\n", CIT_OK, CtdlCheckExpress() );
-       }
-       
-       else if (!strncasecmp(cmdbuf, "XYZZY", 5)) {
-               cprintf("%d Nothing happens.\n", CIT_OK);
-       }
-       
-       else if (!strncasecmp(cmdbuf, "QNOP", 4)) {
-               /* do nothing, this command returns no response */
-       }
-
-       else if (!strncasecmp(cmdbuf,"QUIT",4)) {
-               cprintf("%d Goodbye.\n", CIT_OK);
-               CC->kill_me = 1;
-       }
-
-       else if (!strncasecmp(cmdbuf,"ASYN",4)) {
-               cmd_asyn(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LOUT",4)) {
-               if (CC->logged_in) logout();
-               cprintf("%d logged out.\n", CIT_OK);
-       }
-
-       else if (!strncasecmp(cmdbuf,"USER",4)) {
-               cmd_user(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"PASS",4)) {
-               cmd_pass(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"NEWU",4)) {
-               cmd_newu(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"CREU",4)) {
-               cmd_creu(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"SETP",4)) {
-               cmd_setp(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LRMS",4)) {
-               cmd_lrms(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LKRA",4)) {
-               cmd_lkra(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LKRN",4)) {
-               cmd_lkrn(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LKRO",4)) {
-               cmd_lkro(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LZRM",4)) {
-               cmd_lzrm(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LPRM",4)) {
-               cmd_lprm(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"GETU",4)) {
-               cmd_getu();
-       }
-
-       else if (!strncasecmp(cmdbuf,"SETU",4)) {
-               cmd_setu(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"GOTO",4)) {
-               cmd_goto(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MSGS",4)) {
-               cmd_msgs(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"WHOK",4)) {
-               cmd_whok();
-       }
-
-       else if (!strncasecmp(cmdbuf,"RDIR",4)) {
-               cmd_rdir();
-       }
-
-       else if (!strncasecmp(cmdbuf,"EUID",4)) {
-               cmd_euid(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MSG0",4)) {
-               cmd_msg0(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MSG2",4)) {
-               cmd_msg2(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MSG3",4)) {
-               cmd_msg3(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MSG4",4)) {
-               cmd_msg4(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MSGP",4)) {
-               cmd_msgp(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"OPNA",4)) {
-               cmd_opna(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"DLAT",4)) {
-               cmd_dlat(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"INFO",4)) {
-               cmd_info();
-       }
-
-       else if (!strncasecmp(cmdbuf,"SLRP",4)) {
-               cmd_slrp(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"INVT",4)) {
-               cmd_invt_kick(&cmdbuf[5],1);
-       }
-
-       else if (!strncasecmp(cmdbuf,"KICK",4)) {
-               cmd_invt_kick(&cmdbuf[5],0);
-       }
-
-       else if (!strncasecmp(cmdbuf,"GETR",4)) {
-               cmd_getr();
-       }
-
-       else if (!strncasecmp(cmdbuf,"SETR",4)) {
-               cmd_setr(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"GETA",4)) {
-               cmd_geta();
-       }
-
-       else if (!strncasecmp(cmdbuf,"SETA",4)) {
-               cmd_seta(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"ENT0",4)) {
-               cmd_ent0(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"RINF",4)) {
-               cmd_rinf();
-       }
-
-       else if (!strncasecmp(cmdbuf,"DELE",4)) {
-               cmd_dele(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"KILL",4)) {
-               cmd_kill(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"CRE8",4)) {
-               cmd_cre8(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MOVE",4)) {
-               cmd_move(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"FORG",4)) {
-               cmd_forg();
-       }
-
-       else if (!strncasecmp(cmdbuf,"MESG",4)) {
-               cmd_mesg(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"EMSG",4)) {
-               cmd_emsg(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"GNUR",4)) {
-               cmd_gnur();
-       }
-
-       else if (!strncasecmp(cmdbuf,"VALI",4)) {
-               cmd_vali(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"EINF",4)) {
-               cmd_einf(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LIST",4)) {
-               cmd_list(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"CHEK",4)) {
-               cmd_chek();
-       }
-
-       else if (!strncasecmp(cmdbuf,"DELF",4)) {
-               cmd_delf(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MOVF",4)) {
-               cmd_movf(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"OPEN",4)) {
-               cmd_open(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"CLOS",4)) {
-               cmd_clos();
-       }
-
-       else if (!strncasecmp(cmdbuf,"UOPN",4)) {
-               cmd_uopn(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"UCLS",4)) {
-               cmd_ucls(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"READ",4)) {
-               cmd_read(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"WRIT",4)) {
-               cmd_writ(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"QUSR",4)) {
-               cmd_qusr(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"ECHO",4)) {
-               cmd_echo(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"OIMG",4)) {
-               cmd_oimg(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"MORE",4)) {
-               cmd_more();
-       }
-
-       else if (!strncasecmp(cmdbuf,"NDOP",4)) {
-               cmd_ndop(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"NUOP",4)) {
-               cmd_nuop(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"LFLR",4)) {
-               cmd_lflr();
-       }
-
-       else if (!strncasecmp(cmdbuf,"CFLR",4)) {
-               cmd_cflr(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"KFLR",4)) {
-               cmd_kflr(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"EFLR",4)) {
-               cmd_eflr(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"IDEN",4)) {
-               cmd_iden(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"IPGM",4)) {
-               cmd_ipgm(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"TERM",4)) {
-               cmd_term(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"DOWN",4)) {
-               cmd_down(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf,"HALT",4)) {
-               cmd_halt();
-       }
-
-       else if (!strncasecmp(cmdbuf,"SCDN",4)) {
-               cmd_scdn(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "UIMG", 4)) {
-               cmd_uimg(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "TIME", 4)) {
-               cmd_time();
-       }
-
-       else if (!strncasecmp(cmdbuf, "AGUP", 4)) {
-               cmd_agup(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "ASUP", 4)) {
-               cmd_asup(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "GPEX", 4)) {
-               cmd_gpex(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "SPEX", 4)) {
-               cmd_spex(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "CONF", 4)) {
-               cmd_conf(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "SEEN", 4)) {
-               cmd_seen(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "GTSN", 4)) {
-               cmd_gtsn(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "VIEW", 4)) {
-               cmd_view(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "ISME", 4)) {
-               cmd_isme(&cmdbuf[5]);
-       }
-
-       else if (!strncasecmp(cmdbuf, "RENU", 4)) {
-               cmd_renu(&cmdbuf[5]);
-       }
-
-       else if (!DLoader_Exec_Cmd(cmdbuf)) {
+       if (!DLoader_Exec_Cmd(cmdbuf)) {
                cprintf("%d Unrecognized or unsupported command.\n", ERROR + CMD_NOT_SUPPORTED);
-       }
+       }       
 
        unbuffer_output();
 
@@ -1446,3 +1154,36 @@ void do_command_loop(void) {
 void do_async_loop(void) {
        PerformSessionHooks(EVT_ASYNC);
 }
+
+
+
+
+
+
+
+/*****************************************************************************/
+/*                      MODULE INITIALIZATION STUFF                          */
+/*****************************************************************************/
+
+CTDL_MODULE_INIT(citserver)
+{
+       CtdlRegisterProtoHook(cmd_noop, "NOOP", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_qnop, "QNOP", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_quit, "QUIT", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_lout, "LOUT", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_asyn, "ASYN", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_info, "INFO", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_mesg, "MESG", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_emsg, "EMSG", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_echo, "ECHO", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_more, "MORE", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_iden, "IDEN", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_ipgm, "IPGM", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_term, "TERM", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_down, "DOWN", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_halt, "HALT", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_scdn, "SCDN", "Autoconverted. TODO: document me.");
+       CtdlRegisterProtoHook(cmd_time, "TIME", "Autoconverted. TODO: document me.");
+        /* return our Subversion id for the Log */
+       return "$Id$";
+}