def create_alias_helper(self, user, aliasname, \ primary=False, rcpt=None, trusted=True, hint=None): """ Helper function to create alias. Generates <rand> for user for the <aliasname> specified. If <aliasname> belonging to the user already exists, the existing aid is used. If <aliasname> belonging to another user already exists, an error is returned. """ (aid, uid) = self.db.get_aliasname_data(aliasname) # Error if user doesn't own the aliasname if uid != None and uid != user.get_uid(): logging.info('User %d does not own "%s".', user.get_uid(), aliasname) # Create error response message err = ErrorMessage('createalias.notowner', fromaddx = self.cfg.GETALIAS, toaddx = user.get_account_address(), aliasname = aliasname) self.send(err['From'], [user.get_forwarding_address()], err) return None # # Now, aliasname either belongs to the user or is not in use. # # Gets the alias id, either by getting an existing one or create a new one. if uid == user.get_uid(): newaid = aid logging.debug('Using existing aid %d for aliasname "%s"', \ newaid, aliasname) elif uid == None: newaid = self.db.insert_alias(user.get_uid(), aliasname, primary) logging.debug('Created new aid %d for aliasname "%s"', \ newaid, aliasname) else: return None # # If a recipient is given, check history to see if there was any # previously generated <rand> that we can use. # TODO: We might have to make sure the recipient is active. # newalias = None cid = None if rcpt != None: cid = self.db.peek_cid(rcpt, user.get_salt()) rid = None if cid != None: rid = self.db.get_history_rid(aliasname, cid) if rid != None: # Found a history correspondence hist_alias = Alias(self.db.get_alias_data(rid)) hist_aliasname, hist_aliasrand = hist_alias.get_alias_pair() logging.debug('History aliasname\t:"%s"', hist_aliasname) if hist_aliasname == aliasname: logging.debug('Reuse history aliasrand\t:"%s"', \ hist_aliasrand) newalias = Alias(hist_aliasname, hist_aliasrand) else: # Can't use the rid found since aliasname differs rid = None # Create a new alias (aka aliasrand or <aliasname>.<rand>) if newalias == None: logging.debug('Generating new aliasrand') newalias = Alias(aliasname, alias.generate_rint()) logging.debug('Using alias\t\t: %s', newalias) # Update aid, uid and set isactive for new alias newalias.set_values(aid=newaid, uid=user.get_uid(), isactive=1) # Sets up alias pair alias_pair = newalias.get_alias_pair() # If we don't have rid yet, insert aliasrand to DB and mark as active if rid == None: rid = self.db.insert_aliasrnd(user.get_uid(), \ newaid, \ alias_pair[0], alias_pair[1], \ 1, trusted, hint) if rid == None: return None # Looks like this double counts in the history table; #if rcpt != None: # self.db.add_history(rid, True, [rcpt], user.get_salt()) # Creates the alias address, which includes the domain aliasaddx = Address(newalias.get_alias_address()) logging.info('Aliasrnd Address\t\t: %s', str(aliasaddx)) return aliasaddx