def delUser(self, user_ids, comment, del_connections, del_audit_logs, admin_name, remote_address): """ delete users with ids in user_ids comment: comment when deleting users del_connection tells if we should delete user(s) connection logs too """ self.__delUserCheckInput(user_ids, comment, del_connections, del_audit_logs, admin_name, remote_address) admin_obj = admin_main.getLoader().getAdminByName(admin_name) map(lambda user_id: user_main.getUserPool().addToBlackList, user_ids) try: loaded_users = self.getLoadedUsersByUserID(user_ids) total_credit = self.__delUserCheckUsers(loaded_users) admin_deposit = total_credit * -1 ibs_query = IBSQuery() ibs_query += user_main.getCreditChangeLogActions( ).logCreditChangeQuery("DEL_USER", admin_obj.getAdminID(), user_ids, 0, admin_deposit, remote_address, comment) ibs_query += admin_main.getActionManager().consumeDepositQuery( admin_obj.getAdminID(), admin_deposit) ibs_query += ias_main.getActionsManager().logEvent( "DELETE_USER", admin_name, 0, ",".join(user_ids)) self.__delUserQuery(ibs_query, user_ids, del_connections, del_audit_logs) ibs_query.runQuery() admin_obj.consumeDeposit(admin_deposit) map(user_main.getUserPool().userChanged, user_ids) finally: map(lambda user_id: user_main.getUserPool().removeFromBlackList, user_ids) self.__postDelUser(loaded_users)
def voipAuthenticate(self, ras_msg): if ras_msg.hasAttr("h323_pre_authentication") or ras_msg.hasAttr( "pre_authentication"): loaded_user = user_main.getUserPool().getUserByCallerID( ras_msg["caller_id"]) else: loaded_user = user_main.getUserPool().getUserByVoIPUsername( ras_msg["voip_username"]) self.loading_user.loadingStart(loaded_user.getUserID()) try: user_obj = self.getUserObj(loaded_user.getUserID()) if user_obj != None and not user_obj.isVoIPUser(): raise GeneralException( errorText("USER_LOGIN", "CANT_USE_MORE_THAN_ONE_SERVICE")) finally: self.loading_user.loadingEnd(loaded_user.getUserID()) user_obj = self.__loadUserObj( loaded_user, "VoIP") #always test login on new user_obj, #and trash it after test ras_msg["no_commit"] = True user_obj.login(ras_msg) #test login return True
def delUser(self,user_ids,comment,del_connections,admin_name,remote_address): """ delete users with ids in user_ids comment: comment when deleting users del_connection tells if we should delete user(s) connection logs too """ self.__delUserCheckInput(user_ids,comment,del_connections,admin_name,remote_address) admin_obj=admin_main.getLoader().getAdminByName(admin_name) map(lambda user_id:user_main.getUserPool().addToBlackList,user_ids) try: loaded_users=self.getLoadedUsersByUserID(user_ids) total_credit=self.__delUserCheckUsers(loaded_users) admin_deposit=total_credit*-1 ibs_query=IBSQuery() ibs_query+=user_main.getCreditChangeLogActions().logCreditChangeQuery("DEL_USER", admin_obj.getAdminID(), user_ids, 0, admin_deposit, remote_address, comment) ibs_query+=admin_main.getActionManager().consumeDepositQuery(admin_obj.getAdminID(),admin_deposit) self.__delUserQuery(ibs_query,user_ids,del_connections) ibs_query.runQuery() admin_obj.consumeDeposit(admin_deposit) map(user_main.getUserPool().userChanged,user_ids) finally: map(lambda user_id:user_main.getUserPool().removeFromBlackList,user_ids)
def applySuccess(self, ras_msg): """ apply error/return codes to successful voip ras message """ if ras_msg.hasAttr("single_session_h323"): user_obj = self.__getUserObj(ras_msg) if ras_msg.hasAttr("h323_pre_authentication"): remaining_credit = user_main.getUserPool().getUserByCallerID( ras_msg["caller_id"]).getBasicUser().getCredit() ras_msg.getRasObj().setSingleH323CreditAmount( ras_msg.getReplyPacket(), remaining_credit) elif ras_msg.hasAttr("h323_authentication"): remaining_credit = user_main.getUserPool( ).getUserByVoIPUsername( ras_msg["voip_username"]).getBasicUser().getCredit() ras_msg.getRasObj().setSingleH323CreditAmount( ras_msg.getReplyPacket(), remaining_credit) elif ras_msg.hasAttr("h323_authorization"): remaining_time = user_obj.getTypeObj( ).getSingleSessionRemainingTime() ras_msg.getRasObj().setSingleH323CreditTime( ras_msg.getReplyPacket(), remaining_time) ras_msg.getRasObj().setSingleH323ReturnCode( ras_msg.getReplyPacket(), 0) return True
def __reloadUsers(self, admin_id): """ reload users whom owner is deleted admin """ user_main.getUserPool().reloadUsersWithFilter( lambda loaded_user: loaded_user.getBasicUser().getOwnerObj( ).getAdminID() == admin_id)
def __logoutRecalcEvent(self,user_obj,global_unique_id): if user_obj.instances==0: self.__removePrevUserEvent(user_obj.getUserID()) user_obj.getLoadedUser().setOnlineFlag(False) user_main.getUserPool().userChanged(user_obj.getUserID()) self.__removeFromOnlines(user_obj,global_unique_id) else: self.recalcNextUserEvent(user_obj.getUserID(),True)
def getLoadedUsersByUserID(self,user_ids): """ return a list of LoadedUser instances for users with ids "user_ids" """ user_ids=map(lambda x:to_int(x,"user id"),user_ids) loaded_users=map(user_main.getUserPool().getUserByID,user_ids) return loaded_users
def __broadcastChange(self,user_ids): """ broadcast that users with id in "users" has been change normally user_pool should be told to refresh the user """ userChanged=user_main.getUserPool().userChanged map(userChanged,user_ids)
def getLastDestination(self, voip_username): """ return last destination dialed by user or empty string if no number was dialed yet """ loaded_user = user_main.getUserPool().getUserByVoIPUsername( voip_username) ret = db_main.getHandle().selectQuery("""select value from connection_log,connection_log_details where connection_log.connection_log_id=connection_log_details.connection_log_id and service=2 and user_id=%s and name='called_number' order by login_time limit 1""" % loaded_user.getUserID()) try: return ret[0]["value"] except IndexError: return ""
def getLoadedUsersByVoIPUsername(self, voip_usernames): """ return a list of LoadedUser instances for users with voip_usernames "voip_usernames" """ loaded_users = map(user_main.getUserPool().getUserByVoIPUsername, voip_usernames) return loaded_users
def getLoadedUsersByNormalUsername(self, normal_usernames): """ return a list of LoadedUser instances for users with normal_usernames "normal_usernames" """ loaded_users = map(user_main.getUserPool().getUserByNormalUsername, normal_usernames) return loaded_users
def broadcastChange(self, user_ids): """ broadcast that users with id in "users" has been change normally user_pool should be told to refresh the user """ userChanged = user_main.getUserPool().userChanged map(userChanged, user_ids)
def __checkUserID(self, user_id): if not isLong(user_id): raise GeneralException( errorText("USER", "INVALID_USER_ID") % user_id) loaded_user = user_main.getUserPool().getUserByID( user_id) #check user id
def calcNearestExpDate(_id, _type, raw_attrs, parsed_attrs, date_type): if _type != "user": return nearest_exp_date = defs.MAXLONG group_obj = user_main.getUserPool().getUserByID( _id).getBasicUser().getGroupObj() if raw_attrs.has_key("first_login"): if raw_attrs.has_key("rel_exp_date"): nearest_exp_date = long(raw_attrs["first_login"]) + long( raw_attrs["rel_exp_date"]) elif group_obj.hasAttr("rel_exp_date"): nearest_exp_date = long(raw_attrs["first_login"]) + long( group_obj.getAttr("rel_exp_date")) if raw_attrs.has_key("abs_exp_date"): nearest_exp_date = min(nearest_exp_date, long(raw_attrs["abs_exp_date"])) elif group_obj.hasAttr("abs_exp_date"): nearest_exp_date = min(nearest_exp_date, long(group_obj.getAttr("abs_exp_date"))) if nearest_exp_date != defs.MAXLONG: parsed_attrs["nearest_exp_date"] = AbsDateFromEpoch( nearest_exp_date).getDate(date_type) parsed_attrs["nearest_exp_date_epoch"] = nearest_exp_date parsed_attrs[ "time_to_nearest_exp_date"] = nearest_exp_date - time.time()
def voipAuthorize(self, ras_msg): self.__checkDuplicateOnline(ras_msg) loaded_user = user_main.getUserPool().getUserByVoIPUsername( ras_msg["voip_username"], True) self.loading_user.loadingStart(loaded_user.getUserID()) try: user_obj = None try: user_obj = self.getUserObj(loaded_user.getUserID()) if user_obj == None: user_obj = self.__loadUserObj(loaded_user, "VoIP") elif not user_obj.isVoIPUser(): raise GeneralException( errorText("USER_LOGIN", "CANT_USE_MORE_THAN_ONE_SERVICE")) user_obj.login(ras_msg) self.__authSuccessfull(user_obj, ras_msg) except: if user_obj == None or user_obj.instances == 0: loaded_user.setOnlineFlag(False) raise finally: self.loading_user.loadingEnd(loaded_user.getUserID())
def persistentLanStop(self, ras_msg): loaded_user = user_main.getUserPool().getUserByID(ras_msg["user_id"]) self.loading_user.loadingStart(loaded_user.getUserID()) try: user_obj = self.getUserObj(loaded_user.getUserID()) if user_obj == None: toLog( "Got persistent lan stop for user %s, but he's not online" % ras_msg["user_id"], LOG_DEBUG) return instance = user_obj.getInstanceFromRasMsg(ras_msg) if instance == None: toLog( errorText("USER", "CANT_FIND_INSTANCE") % (loaded_user.getUserID(), ras_msg.getRasID(), ras_msg.getUniqueIDValue())) return global_unique_id = user_obj.getGlobalUniqueID(instance) accounting_started = user_obj.accountingStarted(instance) user_credit = user_obj.logout(instance, ras_msg) self.__logoutRecalcEvent(user_obj, global_unique_id, accounting_started) finally: self.loading_user.loadingEnd(loaded_user.getUserID())
def getLoadedUsersByUserID(self, user_ids, keep_order=False): """ return a list of LoadedUser instances for users with ids "user_ids" """ user_ids = map(lambda x: to_int(x, "user id"), user_ids) loaded_users = user_main.getUserPool().getUsersByID( user_ids, keep_order) return loaded_users
def _postAuth(self,ras_msg, auth_success): Ras._postAuth(self,ras_msg, auth_success) if self.__authSuccess(ras_msg, auth_success, "h323_pre_authentication"): voip_username = user_main.getUserPool().getUserByCallerID(ras_msg["caller_id"]).getUserAttrs()["voip_username"] self.pre_auth_usernames[ ras_msg["h323_conf_id"] ] = voip_username elif self.__authSuccess(ras_msg, auth_success, "h323_authorization"): self.__addToOnlines(ras_msg["voip_username"], ras_msg["h323_conf_id"])
def __logoutRecalcEvent(self, user_obj, global_unique_id, accounting_started): """ accounting_started(bool): is start accounting received for this instance of this user? """ self.__removeFromRasOnlines(global_unique_id) if user_obj.instances == 0: self.__removeFromUserOnlines(user_obj) if accounting_started: self.__removePrevUserEvent(user_obj.getUserID()) user_obj.getLoadedUser().setOnlineFlag(False) user_main.getUserPool().userChanged(user_obj.getUserID()) else: if accounting_started: self.recalcNextUserEvent(user_obj.getUserID(), True)
def getUserCredit(self, request): """ return credit amount of user username(str): pin number of user """ self.__checkAsteriskAuth(request) request.checkArgs("username") loaded_user = user_main.getUserPool().getUserByVoIPUsername( request["username"]) return loaded_user.getBasicUser().getCredit()
def checkAuth(self, username, password, auth_type): """ check user authentication, for server requests. return loaded_user of authenticated user username(string): username password(Password Instance): auth_type(string): requested authentication type. Can be either "NORMAL_USER" or "VOIP_USER" """ if auth_type == "NORMAL_USER": loaded_user = user_main.getUserPool().getUserByNormalUsername( username) pass_attr_name = "normal_password" elif auth_type == "VOIP_USER": loaded_user = user_main.getUserPool().getUserByVoIPUsername( username) pass_attr_name = "voip_password" self.__checkUserPassword(loaded_user, pass_attr_name, password) return loaded_user
def getFastDialDestination(self, voip_username, _index): """ return fast dial destination of voip_username and _index return an empty string if fast_dial is not set for _index """ loaded_user = user_main.getUserPool().getUserByVoIPUsername( voip_username) try: return loaded_user.getUserAttrs()["fast_dial"].split(",")[_index] except: return ""
def preAuthenticate(self, caller_id, channel, unique_id): ras_msg = self.__createRasMsg(channel, unique_id) ras_msg["caller_id"] = caller_id ras_msg["pre_authentication"] = True ras_msg.setAction("VOIP_AUTHENTICATE") if ras_msg.send(): loaded_user = user_main.getUserPool().getUserByCallerID(caller_id) return (loaded_user.getUserAttrs()["voip_username"], loaded_user.getBasicUser().getCredit(), self.__getLanguageForUser(loaded_user)) else: raise GeneralException(ras_msg["error_key"])
def authenticate(self, username, password, caller_id, channel, unique_id): ras_msg = self.__createRasMsg(channel, unique_id) ras_msg["caller_id"] = caller_id ras_msg["voip_username"] = username ras_msg["voip_password"] = password ras_msg.setAction("VOIP_AUTHENTICATE") if ras_msg.send(): loaded_user = user_main.getUserPool().getUserByVoIPUsername( username) return loaded_user.getBasicUser().getCredit() else: raise GeneralException(ras_msg["error_key"])
def getUsernameReprForUserID(self, user_id): """ return text representation of any available username for user_id this function tries to find user_id username and return that in format type:username first the normal username and then voip username is tried. If user doesn't have either of these N/A is returned """ try: loaded_user = user_main.getUserPool().getUserByID(user_id) except GeneralException: #user not found return "N/A" return self.__getUsernameReprForLoadedUser(loaded_user)
def killUser(self,request): request.needAuthType(request.ADMIN) request.checkArgs("user_id","ras_ip","unique_id_val","kill") requester=request.getAuthNameObj() user_id=to_int(request["user_id"],"user_id") loaded_user=user_main.getUserPool().getUserByID(user_id) if request["kill"]: self.__canKillUser(loaded_user,requester) else: self.__canClearUser(loaded_user,requester) return user_main.getActionManager().killUser(user_id, request["ras_ip"], request["unique_id_val"], request["kill"],requester.getUsername())
def _postAuth(self,ras_msg, auth_success): GeneralUpdateRas._postAuth(self,ras_msg, auth_success) if ras_msg.hasAttr("h323_pre_authentication") and auth_success: user_attrs = user_main.getUserPool().getUserByCallerID(ras_msg["caller_id"]).getUserAttrs() username = user_attrs["voip_username"] + user_attrs["voip_password"] ras_msg.getReplyPacket()["Cisco-AVPair"]="h323-ivr-in=%s"%username if user_attrs.hasAttr("voip_preferred_language"): self.setH323PreferredLanguage(ras_msg.getReplyPacket(), user_attrs["voip_preferred_language"]) elif ras_msg.hasAttr("h323_authorization") and auth_success: self.__addToAuthH323IDs(ras_msg["h323_conf_id"])
def changePassword(self, request): request.needAuthType(request.ADMIN, request.VOIP_USER) if request.hasAuthType(request.ADMIN): loaded_user = user_main.getUserPool().getUserByVoIPUsername( request["voip_username"]) request.getAuthNameObj().canChangeVoIPAttrs(loaded_user) user_id = loaded_user.getUserID() else: user_id = request.getAuthNameObj().getUserID() self.__checkOldPassword(request.getAuthNameObj(), request["old_password"]) getActionsManager().changePassword(user_id, request["password"])
def __rrqAuth(self,request,reply): """ do the RRQ Auth. We do it by just checking the username and password other checkings will be done in authorization request. """ try: loaded_user=user_main.getUserPool().getUserByVoIPUsername(request["User-Name"][0]) except GeneralException: return False if not request.checkChapPassword(loaded_user.getUserAttrs()["voip_password"]): return False return True
def __rrqAuth(self, request, reply): """ do the RRQ Auth. We do it by just checking the username and password other checkings will be done in authorization request. """ try: loaded_user = user_main.getUserPool().getUserByVoIPUsername( request["User-Name"][0]) except GeneralException: return False if not request.checkChapPassword( loaded_user.getUserAttrs()["voip_password"]): return False return True
def calcApproxDuration(self, request): if request.hasAuthType(request.ADMIN): request.checkArgs("user_id") loaded_user = user_main.getUserPool().getUserByID( request["user_id"]) admin_obj = request.getAuthNameObj() admin_obj.canAccessUser(loaded_user) elif request.hasAuthType(request.NORMAL_USER) or request.hasAuthType( request.VOIP_USER): loaded_user = request.getAuthNameObj() else: raise request.raiseIncompleteRequest("auth_type") return user_main.getActionManager().calcApproxDuration(loaded_user)
def lockUser(self, request): request.needAuthType(request.ADMIN) requester_obj = request.getAuthNameObj() requester_obj.canDo("HANDLE IAS EVENTS") request.checkArgs("user_id", "reason") loaded_user = user_main.getUserPool().getUserByUserID( request["user_id"]) if loaded_user.userHasAttr("lock"): lock_reason = "%s, %s" % (loaded_user.getUserAttrs()["lock"], request["reason"]) else: lock_reason = request["reason"] self.updateUserAttrs([loaded_user], requester_obj, {"lock": lock_reason}, [])
def addCallerIDAuthentication(self, voip_username, caller_id): """ add caller_id to voip_username list of voip caller_ids """ self.__addCallerIDAuthenticationCheckInput(voip_username, caller_id) loaded_user = user_main.getUserPool().getUserByVoIPUsername( voip_username) if loaded_user.userHasAttr("caller_id"): caller_ids = loaded_user.getUserAttrs()["caller_id"] else: caller_ids = [] if caller_id not in caller_ids: caller_ids.append(caller_id) self.updateUserAttrs([loaded_user], admin_main.getLoader().getAdminByName("system"), {"caller_id": ",".join(caller_ids)}, [])
def changePassword(self, request): request.needAuthType(request.ADMIN, request.NORMAL_USER) if request.hasAuthType(request.ADMIN): loaded_user = user_main.getUserPool().getUserByNormalUsername( request["normal_username"]) request.getAuthNameObj().canChangeNormalAttrs(loaded_user) user_id = loaded_user.getUserID() else: user_id = request.getAuthNameObj().getUserID() self.__checkOldPassword(request.getAuthNameObj(), request["old_password"]) password = Password(request["password"]) self.__changePasswordCheckInput(password) self.__updatePasswordDB(user_id, password.getPassword()) user_main.getActionManager().broadcastChange([user_id])
def voipStop(self,ras_msg): loaded_user=user_main.getUserPool().getUserByVoIPUsername(ras_msg["voip_username"]) self.loading_user.loadingStart(loaded_user.getUserID()) try: user_obj=self.getUserObj(loaded_user.getUserID()) if user_obj==None: toLog("Got VoIP stop for user %s, but he's not online"%ras_msg["voip_username"],LOG_DEBUG) return instance=user_obj.getInstanceFromRasMsg(ras_msg) if instance==None: toLog(errorText("USER","CANT_FIND_INSTANCE")%(loaded_user.getUserID(),ras_msg.getRasID(),ras_msg.getUniqueIDValue()),LOG_DEBUG) return global_unique_id=user_obj.getGlobalUniqueID(user_obj.instances) user_obj.logout(instance,ras_msg) self.__logoutRecalcEvent(user_obj,global_unique_id) finally: self.loading_user.loadingEnd(loaded_user.getUserID())
def authorize(self, username, destination, caller_id, channel, unique_id): ras_msg = self.__createRasMsg(channel, unique_id) ras_msg["caller_id"] = caller_id ras_msg["voip_username"] = username ras_msg["calc_remaining_time"] = True ras_msg["start_accounting"] = True ras_msg["called_number"] = destination ras_msg.setAction("VOIP_AUTHORIZE") if ras_msg.send(): loaded_user = user_main.getUserPool().getUserByVoIPUsername( username) user_obj = user_main.getOnline().getUserObj( loaded_user.getUserID()) return user_obj.getTypeObj().getRemainingTime( user_obj.getInstanceFromRasMsg(ras_msg)) else: raise GeneralException(ras_msg["error_key"])
def addDestinationToFastDial(self, voip_username, destination, _index): """ add "destination" to fast dial _index of "voip_username" """ self.__addDestinationToFastDialCheckInput(voip_username, destination, _index) loaded_user = user_main.getUserPool().getUserByVoIPUsername( voip_username) if loaded_user.userHasAttr("fast_dial"): fast_dials = loaded_user.getUserAttrs()["fast_dial"].split(",") else: fast_dials = ['' for i in range(10)] fast_dials[_index] = destination user_main.getActionManager().updateUserAttrs( [loaded_user], admin_main.getLoader().getAdminByName("system"), {"fast_dial": fast_dials}, [])
def persistentLanAuthenticate(self,ras_msg): loaded_user=user_main.getUserPool().getUserByID(ras_msg["user_id"],True) self.loading_user.loadingStart(loaded_user.getUserID()) try: user_obj=None try: user_obj=self.getUserObj(loaded_user.getUserID()) if user_obj==None: user_obj=self.__loadUserObj(loaded_user,"Normal") elif not user_obj.isNormalUser(): raise GeneralException(errorText("USER_LOGIN","CANT_USE_MORE_THAN_ONE_SERVICE")) user_obj.login(ras_msg) self.__authenticateSuccessfull(user_obj,ras_msg) except: if user_obj!=None and user_obj.instances==0: loaded_user.setOnlineFlag(False) raise finally: self.loading_user.loadingEnd(loaded_user.getUserID())
def getLoadedUsersByVoIPUsername(self,voip_usernames): """ return a list of LoadedUser instances for users with voip_usernames "voip_usernames" """ loaded_users=map(user_main.getUserPool().getUserByVoIPUsername,voip_usernames) return loaded_users
def getLoadedUsersByNormalUsername(self,normal_usernames): """ return a list of LoadedUser instances for users with normal_usernames "normal_usernames" """ loaded_users=map(user_main.getUserPool().getUserByNormalUsername,normal_usernames) return loaded_users
from core.user import user_main user_obj=user_main.getUserPool().getUserByID(222) print user_obj.hasAttr("normal_username") user_attrs=user_obj.getUserAttrs().getAllAttributes() for attr in user_attrs: print attr,user_attrs[attr]