Beispiel #1
0
    def index(self, app, **params):
        # request param cast/defaults
        offset      = int(params.get('offset', 0))
        count       = int(params.get('count', 25))
        alerts_app  = getArgValue('eai:acl.app', params, app)
        alerts_user = urllib.unquote_plus(getArgValue('eai:acl.owner', params, '-'))

        # fired alerts search filters
        search_params = ['severity', 'search']
        search_string = []
        for key in search_params:
            value = params.get(key)
            if value and value != '*':
                if key=='search':
                    search_string.append('%s' % value)
                else:
                    search_string.append('%s="%s"' % (key, urllib.unquote_plus(value)))
        # fired alerts query
        if not 'alerts_id' in params:
            fired_alerts = FiredAlert.all()
        else:
            fired_alerts = FiredAlert.get_alerts(urllib.unquote_plus(params.get('alerts_id')))
        # augment query with search
        if len(search_string) > 0:
           fired_alerts = fired_alerts.search(' '.join(search_string))
        # augment query with app or user filters
        fired_alerts = fired_alerts.filter_by_app(alerts_app).filter_by_user(alerts_user)
        fired_alerts._count_per_req = count
        if 'sort_by' in params or 'sort_dir' in params:
            fired_alerts = fired_alerts.order_by(params.get('sort_by', 'trigger_time'), sort_dir=params.get('sort_dir', 'desc'))
        
        # fired alert summary information
        fired_alert_summary = FiredAlertSummary.all().filter_by_app(alerts_app).filter_by_user(alerts_user)
        fired_alert_summary._count_per_req = count
        
        # apps listings
        apps  = App.all().filter(is_disabled=False)
        
        # users listings
        users = User.all()
        max_users = 250
        users._count_per_req = max_users
        users = users[:max_users]
        
        # paginator
        pager = paginator.Google(fired_alerts.get_total(), max_items_page=count, item_offset=offset)
        
        app_label=splunk.bundle.getConf('app', namespace=app)['ui'].get('label')
        # view variables
        template_args = dict(app=alerts_app, apps=apps, users=users, count=count, 
                             fired_alerts=fired_alerts, 
                             fired_alert_summary=fired_alert_summary, 
                             offset=offset, pager=pager, app_label=app_label)
        return self.render_template('alerts/index.html', template_args)
Beispiel #2
0
 def passwordchange(self, newpassword=None, confirmpassword=None, return_to=None, **kw):
     '''
     Suggest admin to change the password on first time run
     '''
     # We set must_login to False in the expose_page decoator so we can perform the checks here instead
     # and give the user a more useful message if the session has expired leaving the password unchanged
     if not cherrypy.session.get('sessionKey', None) or not util.isValidFormKey(kw['splunk_form_key']):
         # The user intended to change the password; reset the flag so this page will be shown again
         cherrypy.session.delete()
         self.setLoginFlag(False) 
         templateArgs = self.getLoginTemplateArgs(return_to=return_to, session_expired_pw_change=True)
         return self.render_template('account/login.html', templateArgs)
         
     err = None
     templateArgs = {
         'err' : err,
         'return_to' : return_to,
         'cpSessionKey' : cherrypy.session.id
     }        
     
     if newpassword != confirmpassword:
         templateArgs['err'] = _("Passwords didn't match, please try again.")
         return self.render_template('account/passwordchange.html', templateArgs)
     
     if newpassword == 'changeme':
         templateArgs['err'] = _("For security reasons, the new password must be different from the default one.")
         return self.render_template('account/passwordchange.html', templateArgs)
     
     try:
         user = User.get('admin')
         user.password = newpassword
         if not user.save():
             logger.error('Unable to save new admin password.')
             
     except splunk.AuthenticationFailed:
         cherrypy.session.delete()
         self.setLoginFlag(False) 
         templateArgs = self.getLoginTemplateArgs(return_to=return_to, session_expired_pw_change=True)
         return self.render_template('account/login.html', templateArgs)
         
     except splunk.RESTException, e:
         err = e.get_message_text()
         if ':' in err:
             err = err[err.find(':')+2:]
             
         logger.error("Failed to change the password: %s." % err)       
         templateArgs['err'] = err
         return self.render_template('account/passwordchange.html', templateArgs)
def getPwnrs():
    pwnrList = User.all().search("roles=*")
    pwnrOptionList = [  {'label': "%s (%s)" % (x.name, x.realname), 'value': x.name} for x in pwnrList ]
    pwnrOptionList.append({'label': _("No owner"), 'value': 'nobody'})
    return pwnrOptionList
    def passwordchange(self, newpassword=None, confirmpassword=None, return_to=None, cval=None, **kw):
        '''
        Suggest admin to change the password on first time run 
        And force flagged users to change their passwords before they continue
        '''
        # We set must_login to False in the expose_page decoator so we can perform the checks here instead
        # and give the user a more useful message if the session has expired leaving the password unchanged
        # but first we check if the passwords pass
        
        err = None
        templateArgs = {
            'err' : err,
            'return_to' : return_to,
            'cpSessionKey' : cherrypy.session.id
        }

        if 'fpc' in cherrypy.session:
            templateArgs['fpc'] = True

        if not newpassword or len(newpassword) == 0:
            templateArgs['err'] = _("Empty passwords are not allowed.")
            return self.render_template('account/passwordchange.html', templateArgs)

        if newpassword != confirmpassword:
            templateArgs['err'] = _("Passwords didn't match, please try again.")
            return self.render_template('account/passwordchange.html', templateArgs)

        if newpassword == 'changeme':
            templateArgs['err'] = _("For security reasons, the new password must be different from the default one.")
            return self.render_template('account/passwordchange.html', templateArgs)

        # Forced Password Change workflow is checked before the session check b/c user isn't authenticated yet
        if 'fpc' in cherrypy.session:        
            try:
                # Fetch the user's verified cached credentials from when they originally attempted to login
                with AccountController.credential_lock:
                    # Will raise a KeyError if the credentials have expired from the LRU or CP was restarted
                    credentials = AccountController.credential_cache[cherrypy.session.id]

                if newpassword == credentials['password']:
                    templateArgs['err'] = _("For security reasons, the new password must be different from the previous one.")
                    return self.render_template('account/passwordchange.html', templateArgs)

                # Will be resetup, if required, by self.login()
                del cherrypy.session['fpc']
                with AccountController.credential_lock:
                    try:
                        del AccountController.credential_cache[cherrypy.session.id]
                    except KeyError:
                        pass

                # Fake a login form submission; this call must return as soon as the call to login() completes!
                return self.login(username=credentials['username'], password=credentials['password'],
                                  newpassword=newpassword, return_to=return_to, cval=cherrypy.session['cval'])

            except (splunk.AuthenticationFailed, KeyError):
                cherrypy.session.delete()
                self.setLoginFlag(False)
                templateArgs = self.getLoginTemplateArgs(return_to=return_to, session_expired_pw_change=True)
                return self.render_template('account/login.html', templateArgs)

        if not cherrypy.session.get('sessionKey', None) or not util.isValidFormKey(kw['splunk_form_key']):
            # The user intended to change the password; reset the flag so this page will be shown again
            cherrypy.session.delete()
            self.setLoginFlag(False)
            templateArgs = self.getLoginTemplateArgs(return_to=return_to, session_expired_pw_change=True)
            return self.render_template('account/login.html', templateArgs)

        try:
            user = User.get(cherrypy.session['user']['name'])
            user.password = newpassword
            if not user.save():
                logger.error('Unable to save new admin password.')

        except splunk.AuthenticationFailed:
            cherrypy.session.delete()
            self.setLoginFlag(False)
            templateArgs = self.getLoginTemplateArgs(return_to=return_to, session_expired_pw_change=True)
            return self.render_template('account/login.html', templateArgs)

        except splunk.RESTException, e:
            err = e.get_message_text()
            if ':' in err:
                err = err[err.find(':')+2:]

            logger.error("Failed to change the password: %s." % err)
            templateArgs['err'] = err
            return self.render_template('account/passwordchange.html', templateArgs)
class AlertsController(BaseController):
    @route('/:app')
    @expose_page(must_login=True, methods='GET')
    def index(self, app, **params):
        # request param cast/defaults
        offset = int(params.get('offset', 0))
        count = int(params.get('count', 25))
        alerts_app = getArgValue('eai:acl.app', params, app)
        alerts_user = urllib.unquote_plus(
            getArgValue('eai:acl.owner', params, '-'))

        # fired alerts search filters
        search_params = ['severity', 'search']
        search_string = []
        for key in search_params:
            value = params.get(key)
            if value and value != '*':
                if key == 'search':
                    search_string.append('%s' % value)
                else:
                    search_string.append('%s="%s"' %
                                         (key, urllib.unquote_plus(value)))
        # fired alerts query
        if not 'alerts_id' in params:
            fired_alerts = FiredAlert.all()
        else:
            fired_alerts = FiredAlert.get_alerts(
                urllib.unquote_plus(params.get('alerts_id')))

        # augment query with search
        if len(search_string) > 0:
            fired_alerts = fired_alerts.search(' '.join(search_string))
        # augment query with app or user filters
        fired_alerts = fired_alerts.filter_by_app(alerts_app).filter_by_user(
            alerts_user)
        fired_alerts._count_per_req = count
        if 'sort_by' in params or 'sort_dir' in params:
            fired_alerts = fired_alerts.order_by(
                params.get('sort_by', 'trigger_time'),
                sort_dir=params.get('sort_dir', 'desc'))

        # fired alert summary information
        fired_alert_summary = FiredAlertSummary.all().filter_by_app(
            alerts_app).filter_by_user(alerts_user)
        fired_alert_summary._count_per_req = count
        try:
            fired_alert_summary[0]
        except Exception, e:
            if e.statusCode == 402:
                return self.render_template('admin/402.html',
                                            {'feature': _('Alerting')})
        # apps listings
        apps = App.all().filter(is_disabled=False)

        # users listings
        users = User.all()
        max_users = 250
        users._count_per_req = max_users
        users = users[:max_users]

        # paginator
        pager = paginator.Google(fired_alerts.get_total(),
                                 max_items_page=count,
                                 item_offset=offset)

        app_label = splunk.bundle.getConf('app',
                                          namespace=app)['ui'].get('label')
        # view variables
        template_args = dict(
            app=alerts_app,
            apps=apps,
            users=users,
            count=count,
            current_user=splunk.auth.getCurrentUser().get('name'),
            fired_alerts=fired_alerts,
            fired_alert_summary=fired_alert_summary,
            offset=offset,
            pager=pager,
            app_label=app_label)
        return self.render_template('alerts/index.html', template_args)
Beispiel #6
0
    def passwordchange(self,
                       newpassword=None,
                       confirmpassword=None,
                       return_to=None,
                       **kw):
        '''
        Suggest admin to change the password on first time run
        '''
        # We set must_login to False in the expose_page decoator so we can perform the checks here instead
        # and give the user a more useful message if the session has expired leaving the password unchanged
        if not cherrypy.session.get('sessionKey',
                                    None) or not util.isValidFormKey(
                                        kw['splunk_form_key']):
            # The user intended to change the password; reset the flag so this page will be shown again
            cherrypy.session.delete()
            self.setLoginFlag(False)
            templateArgs = self.getLoginTemplateArgs(
                return_to=return_to, session_expired_pw_change=True)
            return self.render_template('account/login.html', templateArgs)

        err = None
        templateArgs = {
            'err': err,
            'return_to': return_to,
            'cpSessionKey': cherrypy.session.id
        }

        if newpassword != confirmpassword:
            templateArgs['err'] = _(
                "Passwords didn't match, please try again.")
            return self.render_template('account/passwordchange.html',
                                        templateArgs)

        if newpassword == 'changeme':
            templateArgs['err'] = _(
                "For security reasons, the new password must be different from the default one."
            )
            return self.render_template('account/passwordchange.html',
                                        templateArgs)

        try:
            user = User.get('admin')
            user.password = newpassword
            if not user.save():
                logger.error('Unable to save new admin password.')

        except splunk.AuthenticationFailed:
            cherrypy.session.delete()
            self.setLoginFlag(False)
            templateArgs = self.getLoginTemplateArgs(
                return_to=return_to, session_expired_pw_change=True)
            return self.render_template('account/login.html', templateArgs)

        except splunk.RESTException, e:
            err = e.get_message_text()
            if ':' in err:
                err = err[err.find(':') + 2:]

            logger.error("Failed to change the password: %s." % err)
            templateArgs['err'] = err
            return self.render_template('account/passwordchange.html',
                                        templateArgs)
    def passwordchange(self,
                       newpassword=None,
                       confirmpassword=None,
                       return_to=None,
                       cval=None,
                       **kw):
        '''
        Suggest admin to change the password on first time run 
        And force flagged users to change their passwords before they continue
        '''
        # We set must_login to False in the expose_page decoator so we can perform the checks here instead
        # and give the user a more useful message if the session has expired leaving the password unchanged
        # but first we check if the passwords pass

        err = None
        templateArgs = {
            'err': err,
            'return_to': return_to,
            'cpSessionKey': cherrypy.session.id
        }

        if 'fpc' in cherrypy.session:
            templateArgs['fpc'] = True

        if not newpassword or len(newpassword) == 0:
            templateArgs['err'] = _("Empty passwords are not allowed.")
            return self.render_template('account/passwordchange.html',
                                        templateArgs)

        if newpassword != confirmpassword:
            templateArgs['err'] = _(
                "Passwords didn't match, please try again.")
            return self.render_template('account/passwordchange.html',
                                        templateArgs)

        if newpassword == 'changeme':
            templateArgs['err'] = _(
                "For security reasons, the new password must be different from the default one."
            )
            return self.render_template('account/passwordchange.html',
                                        templateArgs)

        # Forced Password Change workflow is checked before the session check b/c user isn't authenticated yet
        if 'fpc' in cherrypy.session:
            try:
                # Fetch the user's verified cached credentials from when they originally attempted to login
                with AccountController.credential_lock:
                    # Will raise a KeyError if the credentials have expired from the LRU or CP was restarted
                    credentials = AccountController.credential_cache[
                        cherrypy.session.id]

                if newpassword == credentials['password']:
                    templateArgs['err'] = _(
                        "For security reasons, the new password must be different from the previous one."
                    )
                    return self.render_template('account/passwordchange.html',
                                                templateArgs)

                # Will be resetup, if required, by self.login()
                del cherrypy.session['fpc']
                with AccountController.credential_lock:
                    try:
                        del AccountController.credential_cache[
                            cherrypy.session.id]
                    except KeyError:
                        pass

                # Fake a login form submission; this call must return as soon as the call to login() completes!
                return self.login(username=credentials['username'],
                                  password=credentials['password'],
                                  newpassword=newpassword,
                                  return_to=return_to,
                                  cval=cherrypy.session['cval'])

            except (splunk.AuthenticationFailed, KeyError):
                cherrypy.session.delete()
                self.setLoginFlag(False)
                templateArgs = self.getLoginTemplateArgs(
                    return_to=return_to, session_expired_pw_change=True)
                return self.render_template('account/login.html', templateArgs)

        if not cherrypy.session.get('sessionKey',
                                    None) or not util.isValidFormKey(
                                        kw['splunk_form_key']):
            # The user intended to change the password; reset the flag so this page will be shown again
            cherrypy.session.delete()
            self.setLoginFlag(False)
            templateArgs = self.getLoginTemplateArgs(
                return_to=return_to, session_expired_pw_change=True)
            return self.render_template('account/login.html', templateArgs)

        try:
            user = User.get(cherrypy.session['user']['name'])
            user.password = newpassword
            if not user.save():
                logger.error('Unable to save new admin password.')

        except splunk.AuthenticationFailed:
            cherrypy.session.delete()
            self.setLoginFlag(False)
            templateArgs = self.getLoginTemplateArgs(
                return_to=return_to, session_expired_pw_change=True)
            return self.render_template('account/login.html', templateArgs)

        except splunk.RESTException, e:
            err = e.get_message_text()
            if ':' in err:
                err = err[err.find(':') + 2:]

            logger.error("Failed to change the password: %s." % err)
            templateArgs['err'] = err
            return self.render_template('account/passwordchange.html',
                                        templateArgs)