コード例 #1
0
ファイル: mdserver.py プロジェクト: scottjiang1415/syndicate
    def restart_server(self, force_start=True):
        # signal the controller on this metadata server's host to restart this metadata server.
        # the state of the server (running/stopped) should not change, except on error

        server = self.api.connect_mdctl(self['host'])

        import SMDS.user

        # get our users
        user_ids = self['user_ids']
        users = []
        if user_ids:
            users = SMDS.user.Users(self.api, user_ids)

        logger.info("Restarting metadata server '%s' with users '%s'" %
                    (self['name'], [user['username'] for user in users]))

        rc = 0
        try:
            as_dict = {}
            as_dict.update(self)

            user_dicts = []
            for user in users:
                user_dict = {}
                user_dict.update(user)
                user_dicts.append(user_dict)

            rc = server.restart_server(as_dict, user_dicts, force_start)
        except Exception, e:
            logger.exception(e, "Could not restart metadata server")
            rc = -500
            self['status'] = 'stopped'
            self.sync()
コード例 #2
0
    def navbar(self, prefix='Welcome', action=None):
        """
      Create a pretty navigation bar
      """
        try:
            user = None
            session = current.session
            if session.auth:
                user = session.auth['user']

            request = current.request
            T = current.T
            if isinstance(prefix, str):
                prefix = T(prefix)
            if not action:
                action = URL(request.application, request.controller, 'user')
            if prefix:
                prefix = prefix.strip() + ' '

            if user:

                logout = A(T('logout'), _href=action + '/logout')
                profile = A(T('profile'), _href=action + '/profile')
                password = A(T('password'), _href=action + '/change_password')
                bar = SPAN(prefix,
                           user['username'],
                           ' [ ',
                           logout,
                           ']',
                           _class='auth_navbar')
                if not 'profile' in self.settings.actions_disabled:
                    bar.insert(4, ' | ')
                    bar.insert(5, profile)
                if not 'change_password' in self.settings.actions_disabled:
                    bar.insert(-1, ' | ')
                    bar.insert(-1, password)
            else:

                login = A(T('login'), _href=action + '/login')
                register = A(T('register'), _href=action + '/register')
                retrieve_username = A(T('forgot username?'),
                                      _href=action + '/retrieve_username')
                lost_password = A(T('lost password?'),
                                  _href=action + '/request_reset_password')
                bar = SPAN('[ ', login, ' ]', _class='auth_navbar')

                if not 'register' in self.settings.actions_disabled:
                    bar.insert(2, ' | ')
                    bar.insert(3, register)
                if 'username' in User.public_fieldnames and not 'retrieve_username' in self.settings.actions_disabled:
                    bar.insert(-1, ' | ')
                    bar.insert(-1, retrieve_username)
                if not 'request_reset_password' in self.settings.actions_disabled:
                    bar.insert(-1, ' | ')
                    bar.insert(-1, lost_password)

            return bar
        except Exception, e:
            logger.exception(e, "Navbar error")
            logger.flush()
コード例 #3
0
ファイル: mdserver.py プロジェクト: scottjiang1415/syndicate
    def create_server(self):
        # signal the controller on this metadata server's host to create this server
        self['status'] = 'stopped'
        server = self.api.connect_mdctl(self['host'])

        import SMDS.user

        # get our users
        if self.get('user_ids') == None:
            self['user_ids'] = []

        user_ids = self['user_ids']
        users = []
        if user_ids:
            users = SMDS.user.Users(self.api, user_ids)

        logger.info("Creating metadata server '%s' with users '%s'" %
                    (self['name'], [user['username'] for user in users]))

        rc = 0
        try:
            as_dict = {}
            as_dict.update(self)

            user_dicts = []
            for user in users:
                user_dict = {}
                user_dict.update(user)
                user_dicts.append(user_dict)

            rc = server.create_server(as_dict, user_dicts)
        except Exception, e:
            logger.exception(e, "Could not restart metadata server")
            rc = -500
コード例 #4
0
ファイル: mdserver.py プロジェクト: etherparty/syndicate
 def create_server(self):
    # signal the controller on this metadata server's host to create this server
    self['status'] = 'stopped'
    server = self.api.connect_mdctl( self['host'] )
    
    import SMDS.user
    
    # get our users
    if self.get('user_ids') == None:
       self['user_ids'] = []
    
    user_ids = self['user_ids']
    users = []
    if user_ids:
       users = SMDS.user.Users( self.api, user_ids )
    
    logger.info("Creating metadata server '%s' with users '%s'" % (self['name'], [user['username'] for user in users]))
    
    rc = 0
    try:
       as_dict = {}
       as_dict.update( self )
       
       user_dicts = []
       for user in users:
          user_dict = {}
          user_dict.update( user )
          user_dicts.append( user_dict )
          
       rc = server.create_server( as_dict, user_dicts )
    except Exception, e:
       logger.exception( e, "Could not restart metadata server")
       rc = -500
コード例 #5
0
ファイル: mdserver.py プロジェクト: etherparty/syndicate
 def restart_server(self, force_start=True ):
    # signal the controller on this metadata server's host to restart this metadata server.
    # the state of the server (running/stopped) should not change, except on error
    
    server = self.api.connect_mdctl( self['host'] )
    
    import SMDS.user 
    
    # get our users
    user_ids = self['user_ids']
    users = []
    if user_ids:
       users = SMDS.user.Users( self.api, user_ids )
    
    
    logger.info("Restarting metadata server '%s' with users '%s'" % (self['name'], [user['username'] for user in users]))
    
    rc = 0
    try:
       as_dict = {}
       as_dict.update( self )
       
       user_dicts = []
       for user in users:
          user_dict = {}
          user_dict.update( user )
          user_dicts.append( user_dict )
          
       rc = server.restart_server( as_dict, user_dicts, force_start )
    except Exception, e:
       logger.exception( e, "Could not restart metadata server")
       rc = -500
       self['status'] = 'stopped'
       self.sync()
コード例 #6
0
    def add_content(self, user, content_url):
        content_info = {
            "url": content_url,
            "enabled": True,
            "description": "Created by SMDS",
            "content_provider_id": self.content_provider['content_provider_id']
        }

        rc = None
        try:
            # try the new API (works with CoSFA)
            rc = self.cdn_api.Create(self.CDN_auth, "Content", content_info)

        except Exception, e:
            traceback.print_exc()
            # possibly using the old API
            try:
                logger.warn(
                    "VerivueCoBlitz(add_content): new API failed; trying old API"
                )
                rc = self.cdn_api.AddContent(
                    self.CDN_auth, content_info['content_provider_id'],
                    content_info)
            except Exception, e2:
                logger.exception(
                    e2,
                    "VerivueCoBlitz(add_content): could not add content '%s'" %
                    content_url)
コード例 #7
0
ファイル: SMDS_auth.py プロジェクト: etherparty/syndicate
   def navbar(self,prefix='Welcome',action=None):
      """
      Create a pretty navigation bar
      """
      try:
         user = None
         session = current.session
         if session.auth:
            user = session.auth['user']
         
         request = current.request
         T = current.T
         if isinstance(prefix,str):
            prefix = T(prefix)
         if not action:
            action=URL(request.application,request.controller,'user')
         if prefix:
            prefix = prefix.strip()+' '
         
         if user:
            
            logout=A(T('logout'),_href=action+'/logout')
            profile=A(T('profile'),_href=action+'/profile')
            password=A(T('password'),_href=action+'/change_password')
            bar = SPAN(prefix, user['username'],' [ ', logout, ']',_class='auth_navbar')
            if not 'profile' in self.settings.actions_disabled:
                  bar.insert(4, ' | ')
                  bar.insert(5, profile)
            if not 'change_password' in self.settings.actions_disabled:
                  bar.insert(-1, ' | ')
                  bar.insert(-1, password)
         else:
            
            login=A(T('login'),_href=action+'/login')
            register=A(T('register'),_href=action+'/register')
            retrieve_username=A(T('forgot username?'),
                              _href=action+'/retrieve_username')
            lost_password=A(T('lost password?'),
                              _href=action+'/request_reset_password')
            bar = SPAN('[ ',login,' ]',_class='auth_navbar')

            if not 'register' in self.settings.actions_disabled:
                  bar.insert(2, ' | ')
                  bar.insert(3, register)
            if 'username' in User.public_fieldnames and not 'retrieve_username' in self.settings.actions_disabled:
                  bar.insert(-1, ' | ')
                  bar.insert(-1, retrieve_username)
            if not 'request_reset_password' in self.settings.actions_disabled:
                  bar.insert(-1, ' | ')
                  bar.insert(-1, lost_password)
         
         return bar
      except Exception, e:
         logger.exception(e, "Navbar error")
         logger.flush()
コード例 #8
0
ファイル: mdctl.py プロジェクト: etherparty/syndicate
def read_config( config_file, required_attrs=None ):
   """
   Read the configuration, and assert that every required attribute
   is present.
   """

   try:
      fd = open( config_file, "r" )
   except Exception, e:
      logger.exception( e, "Could not open %s" % config_file )
      return None
コード例 #9
0
ファイル: mdctl.py プロジェクト: scottjiang1415/syndicate
def read_config(config_file, required_attrs=None):
    """
   Read the configuration, and assert that every required attribute
   is present.
   """

    try:
        fd = open(config_file, "r")
    except Exception, e:
        logger.exception(e, "Could not open %s" % config_file)
        return None
コード例 #10
0
 def get_contents( self, filter_=None, ret=None  ):
    content = None
    try:
       # try the new API (works with CoSFA)
       content = self.cdn_api.ListAll( self.CDN_auth, "Content", filter_, ret )
    except Exception, e:
       # possibly using the old API
       try:
          logger.warn("VerivueCoBlitz: new API failed; trying old API")
          content = self.cdn_api.GetContents( self.CDN_auth, filter_, ret )
       
       except Exception, e:
          logger.exception( e, "Could not get content")
コード例 #11
0
ファイル: postgres.py プロジェクト: scottjiang1415/syndicate
    def execute(self, query, params = None):

        cursor = self.cursor()
        try:

            # psycopg2 requires %()s format for all parameters,
            # regardless of type.
            # this needs to be done carefully though as with pattern-based filters
            # we might have percents embedded in the query
            # so e.g. GetPersons({'email':'*fake*'}) was resulting in .. LIKE '%sake%'
            if psycopg2:
                query = re.sub(r'(%\([^)]*\)|%)[df]', r'\1s', query)
            # rewrite wildcards set by Filter.py as '***' into '%'
            query = query.replace ('***','%')

            if not params:
                if self.debug:
                    print >> log,'execute0',query
                cursor.execute(query)
            elif isinstance(params,dict):
                if self.debug:
                    print >> log,'execute-dict: params',params,'query',query%params
                cursor.execute(query,params)
            elif isinstance(params,tuple) and len(params)==1:
                if self.debug:
                    print >> log,'execute-tuple',query%params[0]
                cursor.execute(query,params[0])
            else:
                param_seq=(params,)
                if self.debug:
                    for params in param_seq:
                        print >> log,'executemany',query%params
                cursor.executemany(query, param_seq)
            (self.rowcount, self.description, self.lastrowid) = \
                            (cursor.rowcount, cursor.description, cursor.lastrowid)
        except Exception, e:
            try:
                self.rollback()
            except:
                pass
            uuid = commands.getoutput("uuidgen")
            log.exception( e, "Database error %s:" % uuid )
            log.error( "Failed Query:" )
            log.error( query )
            log.error( "Failed Params:" )
            log.error( pformat(params) )
            raise MDDBError("Please contact " + \
                             self.api.config.MD_NAME + " Support " + \
                             "<" + self.api.config.MD_MAIL_SUPPORT_ADDRESS + ">" + \
                             " and reference " + uuid)
コード例 #12
0
    def get_contents(self, filter_=None, ret=None):
        content = None
        try:
            # try the new API (works with CoSFA)
            content = self.cdn_api.ListAll(self.CDN_auth, "Content", filter_,
                                           ret)
        except Exception, e:
            # possibly using the old API
            try:
                logger.warn("VerivueCoBlitz: new API failed; trying old API")
                content = self.cdn_api.GetContents(self.CDN_auth, filter_, ret)

            except Exception, e:
                logger.exception(e, "Could not get content")
コード例 #13
0
 def rm_content( self, content_id ):
    rc = None
    try:
       # try the new API (works with CoSFA)
       rc = self.cdn_api.Delete( self.CDN_auth, "Content", content_id )
       
    except Exception, e:
       traceback.print_exc()
       
       # possibly using the old API
       try:
          logger.warn("VerivueCoBlitz(rm_contet): new API failed; trying old API")
          rc = self.cdn_api.DeleteContent( self.CDN_auth, content_id )
       except Exception, e2:
          logger.exception( e2, "VerivueCoBlitz(rm_content): could not remove content '%s'" % content_id )
コード例 #14
0
ファイル: mdserver.py プロジェクト: scottjiang1415/syndicate
    def destroy_server(self):
        # signal the controller on this metadata server's host to destroy this server
        self['status'] = 'stopped'
        server = self.api.connect_mdctl(self['host'])

        logger.info("Destroying metadata server '%s'" % self['name'])

        rc = 0
        try:
            as_dict = {}
            as_dict.update(self)
            rc = server.destroy_server(as_dict)
        except Exception, e:
            logger.exception(e, "Could not restart metadata server")
            rc = -500
コード例 #15
0
ファイル: mdserver.py プロジェクト: etherparty/syndicate
 def destroy_server(self):
    # signal the controller on this metadata server's host to destroy this server
    self['status'] = 'stopped'
    server = self.api.connect_mdctl( self['host'] )
    
    logger.info("Destroying metadata server '%s'" % self['name'])
    
    rc = 0
    try:
       as_dict = {}
       as_dict.update( self )
       rc = server.destroy_server( as_dict )
    except Exception, e:
       logger.exception( e, "Could not restart metadata server")
       rc = -500
コード例 #16
0
ファイル: mdserver.py プロジェクト: scottjiang1415/syndicate
    def start_server(self):
        # signal the controller on this metadata server's host to start this metadata server
        old_status = self['status']
        self['status'] = 'running'

        server = self.api.connect_mdctl(self['host'])

        logger.info("Starting metadata server '%s'" % self['name'])

        ret = None
        try:
            as_dict = {}
            as_dict.update(self)
            ret = server.start_server(as_dict)
        except Exception, e:
            logger.exception(e, "Could not start metadata server")
            ret = None
コード例 #17
0
ファイル: mdserver.py プロジェクト: etherparty/syndicate
 def start_server(self):
    # signal the controller on this metadata server's host to start this metadata server
    old_status = self['status']
    self['status'] = 'running'
    
    server = self.api.connect_mdctl( self['host'] )
    
    logger.info("Starting metadata server '%s'" % self['name'])
    
    ret = None
    try:
       as_dict = {}
       as_dict.update( self )
       ret = server.start_server( as_dict )
    except Exception, e:
       logger.exception( e, "Could not start metadata server")
       ret = None
コード例 #18
0
    def setup(self, api):
        self.api = api

        self.CDN_auth = {
            "AuthMethod": "password",
            "Username": api.config.MD_CDN_USERNAME,
            "AuthString": api.config.MD_CDN_PASSWORD,
        }

        # read the SFA credential, if it exists
        try:
            credf = open(api.config.MD_SFA_CREDENTIAL)
            credstr = credf.read()
            credf.close()

            self.CDN_auth["SFA_DelegatedCred"] = credstr
        except:
            logger.warn("VerivueCoBlitz: no SFA credential given")

        rc = None

        # connect to the CMI
        self.cdn_api = xmlrpclib.ServerProxy(api.config.MD_CDN_API_URL,
                                             allow_none=True)

        # get our content provider struct
        try:
            self.content_provider = self.cdn_api.Read(
                self.CDN_auth, "ContentProvider",
                api.config.MD_CONTENT_PROVIDER)[0]
            rc = 1
        except Exception, e:
            try:
                logger.warn(
                    "VerivueCoBlitz(setup): new API failed; trying old API")
                self.content_provider = self.cdn_api.GetContentProviders(
                    self.CDN_auth,
                    {'account': api.config.MD_CONTENT_PROVIDER})[0]
                rc = 1
            except Exception, e2:
                logger.exception(
                    e2,
                    "VerivueCoBlitz(setup): could not look up SMDS CDN content provider account '%s'"
                    % api.config.MD_CONTENT_PROVIDER)
                rc = None
コード例 #19
0
    def rm_content(self, content_id):
        rc = None
        try:
            # try the new API (works with CoSFA)
            rc = self.cdn_api.Delete(self.CDN_auth, "Content", content_id)

        except Exception, e:
            traceback.print_exc()

            # possibly using the old API
            try:
                logger.warn(
                    "VerivueCoBlitz(rm_contet): new API failed; trying old API"
                )
                rc = self.cdn_api.DeleteContent(self.CDN_auth, content_id)
            except Exception, e2:
                logger.exception(
                    e2,
                    "VerivueCoBlitz(rm_content): could not remove content '%s'"
                    % content_id)
コード例 #20
0
 def add_content( self, user, content_url ):
    content_info = {
       "url":                  content_url,
       "enabled":              True,
       "description":          "Created by SMDS",
       "content_provider_id":  self.content_provider['content_provider_id']
    }
    
    rc = None
    try:
       # try the new API (works with CoSFA)
       rc = self.cdn_api.Create( self.CDN_auth, "Content", content_info )
       
    except Exception, e:
       traceback.print_exc()
       # possibly using the old API
       try:
          logger.warn("VerivueCoBlitz(add_content): new API failed; trying old API")
          rc = self.cdn_api.AddContent( self.CDN_auth, content_info['content_provider_id'], content_info )
       except Exception, e2:
          logger.exception( e2, "VerivueCoBlitz(add_content): could not add content '%s'" % content_url )
コード例 #21
0
ファイル: mdserver.py プロジェクト: etherparty/syndicate
 def stop_server(self):
    # signal the controller on this metadata server's host to stop this metadata server
    old_status = self['status']
    self['status'] = 'stopped'
    
    server = self.api.connect_mdctl( self['host'] )
    
    logger.info("Stopping metadata server '%s'" % self['name'])
    
    rc = 0
    try:
       as_dict = {}
       as_dict.update( self )
       rc = server.stop_server( as_dict )
       if rc == 0:
          logger.warn( "Server '%s' was not running" % self['name'])
          rc = 1      # it's OK if it wasn't running
          
    except Exception, e:
       logger.exception( e, "Could not stop metadata server")
       rc = -500;
コード例 #22
0
ファイル: mdserver.py プロジェクト: scottjiang1415/syndicate
    def stop_server(self):
        # signal the controller on this metadata server's host to stop this metadata server
        old_status = self['status']
        self['status'] = 'stopped'

        server = self.api.connect_mdctl(self['host'])

        logger.info("Stopping metadata server '%s'" % self['name'])

        rc = 0
        try:
            as_dict = {}
            as_dict.update(self)
            rc = server.stop_server(as_dict)
            if rc == 0:
                logger.warn("Server '%s' was not running" % self['name'])
                rc = 1  # it's OK if it wasn't running

        except Exception, e:
            logger.exception(e, "Could not stop metadata server")
            rc = -500
コード例 #23
0
    def __call__(self, *args, **kwds):
        """
        Main entry point for all MDAPI functions. Type checks
        arguments, authenticates, and executes call().
        """

        try:
            start = time.time()

            (min_args, max_args, defaults) = self.args()

            # Check that the right number of arguments were passed in
            if len(args) < len(min_args) or len(args) > len(max_args):
                raise MDInvalidArgumentCount(len(args), len(min_args),
                                             len(max_args))

            for name, value, expected in zip(max_args, args, self.accepts):
                self.type_check(name, value, expected, args)

            result = self.call(*args, **kwds)
            runtime = time.time() - start

            return result

        except MDException, fault:

            if self.caller:
                caller = 'uid %s' % self.caller.get('user_id')
            else:
                caller = '(unknown)'

            # Prepend caller and method name to expected faults
            fault.faultString = caller + ": " + self.name + ": " + fault.faultString
            runtime = time.time() - start

            logger.exception(fault, "%s: %s" % (caller, str(args)))

            raise fault
コード例 #24
0
ファイル: method.py プロジェクト: etherparty/syndicate
    def __call__(self, *args, **kwds):
        """
        Main entry point for all MDAPI functions. Type checks
        arguments, authenticates, and executes call().
        """

        try:
            start = time.time()

            (min_args, max_args, defaults) = self.args()

            # Check that the right number of arguments were passed in
            if len(args) < len(min_args) or len(args) > len(max_args):
               raise MDInvalidArgumentCount(len(args), len(min_args), len(max_args))

            for name, value, expected in zip(max_args, args, self.accepts):
               self.type_check(name, value, expected, args)

            result = self.call(*args, **kwds)
            runtime = time.time() - start
            
            return result

        except MDException, fault:

            if self.caller:
               caller = 'uid %s'  % self.caller.get('user_id')
            else:
               caller = '(unknown)'
            
            # Prepend caller and method name to expected faults
            fault.faultString = caller + ": " +  self.name + ": " + fault.faultString
            runtime = time.time() - start

            logger.exception( fault, "%s: %s" % (caller, str(args)) )

            raise fault
コード例 #25
0
 def setup(self, api):
    self.api = api
    
    self.CDN_auth = {
       "AuthMethod": "password",
       "Username": api.config.MD_CDN_USERNAME,
       "AuthString": api.config.MD_CDN_PASSWORD,
    }
    
    # read the SFA credential, if it exists
    try:
       credf = open(api.config.MD_SFA_CREDENTIAL)
       credstr = credf.read()
       credf.close()
       
       self.CDN_auth["SFA_DelegatedCred"] = credstr
    except:
       logger.warn("VerivueCoBlitz: no SFA credential given")
    
    rc = None
    
    # connect to the CMI
    self.cdn_api = xmlrpclib.ServerProxy( api.config.MD_CDN_API_URL, allow_none = True )
    
    # get our content provider struct
    try:
       self.content_provider = self.cdn_api.Read( self.CDN_auth, "ContentProvider", api.config.MD_CONTENT_PROVIDER )[0]
       rc = 1
    except Exception, e:
       try:
          logger.warn("VerivueCoBlitz(setup): new API failed; trying old API")
          self.content_provider = self.cdn_api.GetContentProviders( self.CDN_auth, {'account': api.config.MD_CONTENT_PROVIDER} )[0]
          rc = 1
       except Exception, e2:
          logger.exception(e2, "VerivueCoBlitz(setup): could not look up SMDS CDN content provider account '%s'" % api.config.MD_CONTENT_PROVIDER )
          rc = None
コード例 #26
0
ファイル: SMDS_auth.py プロジェクト: etherparty/syndicate
   def register(self, next=DEFAULT, onvalidation=DEFAULT, onaccept=DEFAULT, log=DEFAULT):
      """
      Register a new user
      """
      
      request = current.request
      response = current.response
      session = current.session
      
      if self.is_logged_in():
         # don't allow registration if we're already logged in
         redirect(self.settings.logged_url)
      
      # fill in defaults
      if next == DEFAULT:
         next = request.get_vars._next \
               or request.post_vars._next \
               or self.settings.register_next
      if onvalidation == DEFAULT:
         onvalidation = self.settings.register_onvalidation
      if onaccept == DEFAULT:
         onaccept = self.settings.register_onaccept
      if log == DEFAULT:
         log = self.messages.register_log

      # create a form...
      userfield = self.settings.login_userfield
      passfield = self.settings.password_field
      formstyle = self.settings.formstyle
      form =FORM(                                                                             \
                     TABLE(                                                                   \
                        TR(TD('Username:'******'Email:'),            TD(INPUT(_name="email", _type="text",requires=IS_EMAIL(error_message=self.messages.invalid_email)))),          \
                        TR(TD('Password:'******'Re-type Password:'******'password',None))),                   \
                                                       error_message=self.settings.mismatched_password)))    \
                     ),                                                                       \
                     INPUT(_type="Submit",_value="Register"),                                    \
                     _name="register"
               )
            

      if form.accepts(request, session, formname='register', onvalidation=onvalidation,hideerror=self.settings.hideerror):
         
         # verify that the password forms are the same
         if form.vars['password'] != form.vars['password2']:
            response.flash = messages.mismatched_password
            
         # inform the admin
         """
         if not self.settings.mailer or \
            not self.settings.mailer.send(
               to=self.maint_email,
               subject=self.messages.verify_email_subject,
               message=self.messages.verify_email % dict(username=form.vars['username'], email=form.vars['email'])):
                     
            response.flash = self.messages.unable_send_email
            return form
            
         session.flash = self.messages.email_sent
         """
         
         # make sure this user does not exist
         rc = 0
         msg = ""
         try:
            user = Users(self.api, {'username': form.vars['username']})[0]
            rc = -1     # already exists
            msg = "User already exists"
         except:
            pass
            
         # create the user
         if rc == 0:
            try:
               user_fields = {'username': form.vars['username'], 'password': form.vars['password'], 'email': form.vars['email']}
               rc = self.api.call( ("127.0.0.1", "localhost"), "AddUser", self.api.maint_auth, user_fields )
            except Exception, e:
               logger.exception(e, "register: exception")
               logger.flush()
               msg = "User could not be registered"
               rc = -1
         
         if rc < 0:
            response.flash = msg
            logger.error("Failed to add user '%s' (email '%s')" % (user_fields['username'], user_fields['email']) )
            return form
            
         session.flash = self.messages.registration_pending
         if log:
            logger.info("Added user '%s' (email '%s')" % (user_fields['username'], user_fields['email']) )
         
         callback(onaccept,form)
         if not next:
            next = self.url(args = request.args)
         elif isinstance(next, (list, tuple)): ### fix issue with 2.6
            next = next[0]
         elif next and not next[0] == '/' and next[:4] != 'http':
            next = self.url(next.replace('[id]', str(form.vars.id)))
         redirect(next)
コード例 #27
0
    def register(self,
                 next=DEFAULT,
                 onvalidation=DEFAULT,
                 onaccept=DEFAULT,
                 log=DEFAULT):
        """
      Register a new user
      """

        request = current.request
        response = current.response
        session = current.session

        if self.is_logged_in():
            # don't allow registration if we're already logged in
            redirect(self.settings.logged_url)

        # fill in defaults
        if next == DEFAULT:
            next = request.get_vars._next \
                  or request.post_vars._next \
                  or self.settings.register_next
        if onvalidation == DEFAULT:
            onvalidation = self.settings.register_onvalidation
        if onaccept == DEFAULT:
            onaccept = self.settings.register_onaccept
        if log == DEFAULT:
            log = self.messages.register_log

        # create a form...
        userfield = self.settings.login_userfield
        passfield = self.settings.password_field
        formstyle = self.settings.formstyle
        form =FORM(                                                                             \
                       TABLE(                                                                   \
                          TR(TD('Username:'******'Email:'),            TD(INPUT(_name="email", _type="text",requires=IS_EMAIL(error_message=self.messages.invalid_email)))),          \
                          TR(TD('Password:'******'Re-type Password:'******'password',None))),                   \
                                                         error_message=self.settings.mismatched_password)))    \
                       ),                                                                       \
                       INPUT(_type="Submit",_value="Register"),                                    \
                       _name="register"
                 )

        if form.accepts(request,
                        session,
                        formname='register',
                        onvalidation=onvalidation,
                        hideerror=self.settings.hideerror):

            # verify that the password forms are the same
            if form.vars['password'] != form.vars['password2']:
                response.flash = messages.mismatched_password

            # inform the admin
            """
         if not self.settings.mailer or \
            not self.settings.mailer.send(
               to=self.maint_email,
               subject=self.messages.verify_email_subject,
               message=self.messages.verify_email % dict(username=form.vars['username'], email=form.vars['email'])):
                     
            response.flash = self.messages.unable_send_email
            return form
            
         session.flash = self.messages.email_sent
         """

            # make sure this user does not exist
            rc = 0
            msg = ""
            try:
                user = Users(self.api, {'username': form.vars['username']})[0]
                rc = -1  # already exists
                msg = "User already exists"
            except:
                pass

            # create the user
            if rc == 0:
                try:
                    user_fields = {
                        'username': form.vars['username'],
                        'password': form.vars['password'],
                        'email': form.vars['email']
                    }
                    rc = self.api.call(("127.0.0.1", "localhost"), "AddUser",
                                       self.api.maint_auth, user_fields)
                except Exception, e:
                    logger.exception(e, "register: exception")
                    logger.flush()
                    msg = "User could not be registered"
                    rc = -1

            if rc < 0:
                response.flash = msg
                logger.error("Failed to add user '%s' (email '%s')" %
                             (user_fields['username'], user_fields['email']))
                return form

            session.flash = self.messages.registration_pending
            if log:
                logger.info("Added user '%s' (email '%s')" %
                            (user_fields['username'], user_fields['email']))

            callback(onaccept, form)
            if not next:
                next = self.url(args=request.args)
            elif isinstance(next, (list, tuple)):  ### fix issue with 2.6
                next = next[0]
            elif next and not next[0] == '/' and next[:4] != 'http':
                next = self.url(next.replace('[id]', str(form.vars.id)))
            redirect(next)