jabberd2  2.2.16
sm/user.c
Go to the documentation of this file.
00001 /*
00002  * jabberd - Jabber Open Source Server
00003  * Copyright (c) 2002 Jeremie Miller, Thomas Muldowney,
00004  *                    Ryan Eatmon, Robert Norris
00005  *
00006  * This program is free software; you can redistribute it and/or modify
00007  * it under the terms of the GNU General Public License as published by
00008  * the Free Software Foundation; either version 2 of the License, or
00009  * (at your option) any later version.
00010  *
00011  * This program is distributed in the hope that it will be useful,
00012  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
00014  * GNU General Public License for more details.
00015  *
00016  * You should have received a copy of the GNU General Public License
00017  * along with this program; if not, write to the Free Software
00018  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA02111-1307USA
00019  */
00020 
00021 #include "sm.h"
00022 
00031 static user_t _user_alloc(sm_t sm, jid_t jid) {
00032     pool_t p;
00033     user_t user;
00034 
00035     p = pool_new();
00036 
00037     user = (user_t) pmalloco(p, sizeof(struct user_st));
00038 
00039     user->p = p;
00040     user->sm = sm;
00041 
00042     user->jid = jid_dup(jid);
00043     pool_cleanup(p, (void (*)(void *)) jid_free, user->jid);
00044 
00045     /* a place for modules to store stuff */
00046     user->module_data = (void **) pmalloco(p, sizeof(void *) * sm->mm->nindex);
00047 
00048     return user;
00049 }
00050 
00052 user_t user_load(sm_t sm, jid_t jid) {
00053     user_t user;
00054 
00055     /* already loaded */
00056     user = xhash_get(sm->users, jid_user(jid));
00057     if(user != NULL) {
00058         log_debug(ZONE, "returning previously-created user data for %s", jid_user(jid));
00059         return user;
00060     }
00061 
00062     /* make a new one */
00063     user = _user_alloc(sm, jid);
00064 
00065     /* get modules to setup */
00066     if(mm_user_load(sm->mm, user) != 0) {
00067         log_debug(ZONE, "modules failed user load for %s", jid_user(jid));
00068         pool_free(user->p);
00069         return NULL;
00070     }
00071 
00072     /* save them for later */
00073     xhash_put(sm->users, jid_user(user->jid), (void *) user);
00074 
00075     log_debug(ZONE, "loaded user data for %s", jid_user(jid));
00076 
00077     return user;
00078 }
00079 
00080 void user_free(user_t user) {
00081     log_debug(ZONE, "freeing user %s", jid_user(user->jid));
00082 
00083     xhash_zap(user->sm->users, jid_user(user->jid));
00084     pool_free(user->p);
00085 }
00086 
00088 int user_create(sm_t sm, jid_t jid) {
00089     user_t user;
00090 
00091     log_debug(ZONE, "create user request for %s", jid_user(jid));
00092 
00093     /* check whether it is to serviced domain */
00094     if(xhash_get(sm->hosts, jid->domain) == NULL) {
00095         log_write(sm->log, LOG_ERR, "request to create user for non-serviced domain: jid=%s", jid_user(jid));
00096         log_debug(ZONE, "no such domain, not creating");
00097         return 1;
00098     }
00099 
00100     user = user_load(sm, jid);
00101     if(user != NULL) {
00102         log_write(sm->log, LOG_ERR, "request to create already-active user: jid=%s", jid_user(jid));
00103         log_debug(ZONE, "user already active, not creating");
00104         return 1;
00105     }
00106 
00107     /* modules create */
00108     if(mm_user_create(sm->mm, jid) != 0) {
00109         log_write(sm->log, LOG_ERR, "user creation failed: jid=%s", jid_user(jid));
00110         log_debug(ZONE, "user create failed, forcing deletion for cleanup");
00111         mm_user_delete(sm->mm, jid);
00112         return 1;
00113     }
00114 
00115     log_write(sm->log, LOG_NOTICE, "created user: jid=%s", jid_user(jid));
00116 
00117     return 0;
00118 }
00119 
00121 void user_delete(sm_t sm, jid_t jid) {
00122     user_t user;
00123     sess_t scan, next;
00124 
00125     log_debug(ZONE, "delete user request for %s", jid_user(jid));
00126 
00127     user = user_load(sm, jid);
00128     if(user == NULL) {
00129         log_debug(ZONE, "user doesn't exist, can't delete");
00130         return;
00131     }
00132 
00133     /* close their sessions first (this will free user, after the last session ends) */
00134     scan = user->sessions;
00135     while(scan != NULL) {
00136         next = scan->next;
00137         sm_c2s_action(scan, "ended", NULL);
00138         sess_end(scan);
00139         scan = next;
00140     }
00141 
00142     mm_user_delete(sm->mm, jid);
00143 
00144     log_write(sm->log, LOG_NOTICE, "deleted user: jid=%s", jid_user(jid));
00145 }