jabberd2
2.2.16
|
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 }