X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fcitserver.c;h=e5029fe51566f46a132fa598641f8a9ce6c3985f;hb=655de5af64c89584fbdd0110a27053a9f3bfd138;hp=28de7e6bf2d21925984b508b3e8cf2aa6e65b160;hpb=a799f677ca673c433515a8259f65701662b21983;p=citadel.git diff --git a/citadel/citserver.c b/citadel/citserver.c index 28de7e6bf..e5029fe51 100644 --- a/citadel/citserver.c +++ b/citadel/citserver.c @@ -12,15 +12,8 @@ * GNU General Public License for more details. */ -#include "sysdep.h" -#include -#include #include -#include -#include -#include -#include - +#include "sysdep.h" #if TIME_WITH_SYS_TIME # include # include @@ -35,35 +28,15 @@ #if HAVE_BACKTRACE #include #endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include "citadel.h" -#include "server.h" -#include "sysdep_decls.h" -#include "threads.h" -#include "citserver.h" -#include "config.h" -#include "database.h" + +#include "ctdl_module.h" #include "housekeeping.h" -#include "user_ops.h" -#include "msgbase.h" -#include "support.h" #include "locate_host.h" -#include "room_ops.h" +#include "citserver.h" +#include "user_ops.h" #include "control.h" -#include "euidindex.h" -#include "context.h" -#include "svn_revision.h" -#include "ctdl_module.h" +#include "config.h" char *unique_session_numbers; int ScheduledShutdown = 0; @@ -369,175 +342,6 @@ int CtdlIsPublicClient(void) -/* Don't show the names of private rooms unless the viewing - * user also knows the rooms. - */ -void GenerateRoomDisplay(char *real_room, - CitContext *viewed, - CitContext *viewer) { - - int ra; - - strcpy(real_room, viewed->room.QRname); - if (viewed->room.QRflags & QR_MAILBOX) { - strcpy(real_room, &real_room[11]); - } - if (viewed->room.QRflags & QR_PRIVATE) { - CtdlRoomAccess(&viewed->room, &viewer->user, &ra, NULL); - if ( (ra & UA_KNOWN) == 0) { - strcpy(real_room, " "); - } - } - - if (viewed->cs_flags & CS_CHAT) { - while (strlen(real_room) < 14) { - strcat(real_room, " "); - } - strcpy(&real_room[14], ""); - } - -} - -/* - * 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 ((required_level >= ac_logged_in_or_guest) && (CC->logged_in == 0) && (!config.c_guest_logins)) { - cprintf("%d Not logged in.\n", ERROR + NOT_LOGGED_IN); - return(-1); - } - - if ((required_level >= ac_logged_in) && (CC->logged_in == 0)) { - cprintf("%d Not logged in.\n", ERROR + NOT_LOGGED_IN); - return(-1); - } - - if (CC->user.axlevel >= AxAideU) return(0); - if (required_level >= ac_aide) { - cprintf("%d This command requires Admin 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 Admin or Room Admin access.\n", - ERROR + HIGHER_ACCESS_REQUIRED); - return(-1); - } - - /* shhh ... succeed quietly */ - return(0); -} - - - - - - - - -/* - * Back-end function for starting a session - */ -void begin_session(CitContext *con) -{ - /* - * Initialize some variables specific to our context. - */ - con->logged_in = 0; - con->internal_pgm = 0; - con->download_fp = NULL; - con->upload_fp = NULL; - con->cached_msglist = NULL; - con->cached_num_msgs = 0; - con->FirstExpressMessage = NULL; - time(&con->lastcmd); - time(&con->lastidle); - strcpy(con->lastcmdname, " "); - strcpy(con->cs_clientname, "(unknown)"); - strcpy(con->curr_user, NLI); - *con->net_node = '\0'; - *con->fake_username = '\0'; - *con->fake_hostname = '\0'; - *con->fake_roomname = '\0'; - *con->cs_clientinfo = '\0'; - 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; - if (!CC->is_local_socket) { - locate_host(con->cs_host, sizeof con->cs_host, - con->cs_addr, sizeof con->cs_addr, - con->client_socket - ); - } - else { - con->cs_host[0] = 0; - con->cs_addr[0] = 0; -#ifdef HAVE_STRUCT_UCRED - { - /* as http://www.wsinnovations.com/softeng/articles/uds.html told us... */ - struct ucred credentials; - socklen_t ucred_length = sizeof(struct ucred); - - /*fill in the user data structure */ - if(getsockopt(con->client_socket, SOL_SOCKET, SO_PEERCRED, &credentials, &ucred_length)) { - syslog(LOG_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. - */ - snprintf(con->cs_clientinfo, sizeof(con->cs_clientinfo), - "PID: "F_PID_T"; UID: "F_UID_T"; GID: "F_XPID_T" ", - credentials.pid, - credentials.uid, - credentials.gid); - } - } -#endif - } - con->cs_flags = 0; - con->upload_type = UPL_FILE; - con->dl_is_net = 0; - - con->nologin = 0; - if (((config.c_maxsessions > 0)&&(num_sessions > config.c_maxsessions)) || CtdlWantSingleUser()) { - con->nologin = 1; - } - - if (!CC->is_local_socket) { - syslog(LOG_NOTICE, "Session (%s) started from %s (%s).\n", con->ServiceName, con->cs_host, con->cs_addr); - } - else { - syslog(LOG_NOTICE, "Session (%s) started via local socket UID:%d.\n", con->ServiceName, con->cs_UDSclientUID); - } - - /* Run any session startup routines registered by loadable modules */ - PerformSessionHooks(EVT_START); -} - - void citproto_begin_session() { if (CC->nologin==1) { cprintf("%d %s: Too many users are already online (maximum is %d)\n",