diff roundup/cgi/client.py @ 7067:da58c2b28802

refactor: consolidate sets of identical log messages, flake8 fixes I had multiple places where identical messages were being logged in two places. Now I have one definition in each place and the same message is logged on two different code paths. Also wrapped some long strings making sure that they were included in extraction for translation. Fixed long comments.
author John Rouillard <rouilj@ieee.org>
date Wed, 23 Nov 2022 22:23:50 -0500
parents 8094cbf5f6f7
children bc06bad26872
line wrap: on
line diff
--- a/roundup/cgi/client.py	Wed Nov 23 21:16:01 2022 +0100
+++ b/roundup/cgi/client.py	Wed Nov 23 22:23:50 2022 -0500
@@ -1165,9 +1165,10 @@
                     # if we got here token is valid, use the role
                     # and sub claims.
                     try:
-                        # make sure to str(token['sub']) the subject. As decoded
-                        # by json, it is unicode which thows an error when used
-                        # with 'nodeid in db' down the call chain.
+                        # make sure to str(token['sub']) the
+                        # subject. As decoded by json, it is unicode
+                        # which thows an error when used with 'nodeid
+                        # in db' down the call chain.
                         user = self.db.user.get(str(token['sub']), 'username')
                     except IndexError:
                         raise LoginError("Token subject is invalid.")
@@ -1233,7 +1234,8 @@
         except TypeError:
             pass
         if isinstance(action, list):
-            raise SeriousError('broken form: multiple @action values submitted')
+            raise SeriousError(
+                self._('broken form: multiple @action values submitted'))
         elif action != '':
             action = action.value.lower()
         if action in ('login', 'register'):
@@ -1404,7 +1406,8 @@
             if (config["WEB_CSRF_ENFORCE_HEADER_%s" % header] == 'required'
                     and "HTTP_%s" % header.replace('-', '_') not in self.env):
                 logger.error(self._(
-                    "csrf header %(header)s required but missing for user%(userid)s.") % {
+                    ''"csrf header %(header)s required but missing "
+                    ''"for user%(userid)s.") % {
                         'header': header,
                         'userid': current_user})
                 raise Unauthorised(self._("Missing header: %s") % header)
@@ -1414,15 +1417,16 @@
         if 'HTTP_REFERER' in self.env and enforce != "no":
             if not self.is_referer_header_ok(api=api):
                 referer = self.env['HTTP_REFERER']
+                logmsg = self._(
+                    ''"csrf Referer header check failed for user%(userid)s. "
+                    ''"Value=%(referer)s") % {'userid': current_user,
+                                              'referer': referer}
                 if enforce in ('required', 'yes'):
-                    logger.error(self._(
-                        "csrf Referer header check failed for user%(userid)s. Value=%(referer)s") % {'userid': current_user, 'referer': referer})
+                    logger.error(logmsg)
                     raise Unauthorised(self._("Invalid Referer: %s") % (
                         referer))
                 elif enforce == 'logfailure':
-                    logger.warning(self._(
-                        "csrf Referer header check failed for user%(userid)s. Value=%(referer)s") % {
-                            'userid': current_user, 'referer': referer})
+                    logger.warning(logmsg)
             else:
                 header_pass += 1
 
@@ -1433,14 +1437,15 @@
         if 'HTTP_ORIGIN' in self.env and enforce != "no":
             if not self.is_origin_header_ok(api=api):
                 origin = self.env['HTTP_ORIGIN']
+                logmsg = self._(
+                    ''"csrf Origin header check failed for user%(userid)s. "
+                    ''"Value=%(origin)s") % {
+                        'userid': current_user, 'origin': origin}
                 if enforce in ('required', 'yes'):
-                    logger.error(self._(
-                        "csrf Origin header check failed for user%(userid)s. Value=%(origin)s") % {
-                        'userid': current_user, 'origin': origin})
+                    logger.error(logmsg)
                     raise Unauthorised(self._("Invalid Origin %s" % origin))
                 elif enforce == 'logfailure':
-                    logger.warning(self._(
-                        "csrf Origin header check failed for user%(userid)s. Value=%(origin)s") % {'userid': current_user, 'origin': origin})
+                    logger.warning(logmsg)
             else:
                 header_pass += 1
 
@@ -1451,16 +1456,16 @@
                 foundat = self.base.find('://' + host + '/')
                 # 4 means self.base has http:/ prefix, 5 means https:/ prefix
                 if foundat not in [4, 5]:
+                    logmsg = self._(
+                        ''"csrf X-FORWARDED-HOST header check failed "
+                        ''"for user%(userid)s. Value=%(host)s") % {
+                            'userid': current_user, 'host': host}
                     if enforce in ('required', 'yes'):
-                        logger.error(self._(
-                            "csrf X-FORWARDED-HOST header check failed for user%(userid)s. Value=%(host)s") % {
-                                'userid': current_user, 'host': host})
+                        logger.error(logmsg)
                         raise Unauthorised(self._(
                             "Invalid X-FORWARDED-HOST %s") % host)
                     elif enforce == 'logfailure':
-                        logger.warning(self._(
-                            "csrf X-FORWARDED-HOST header check failed for user%(userid)s. Value=%(host)s") % {
-                                'userid': current_user, 'host': host})
+                        logger.warning(logmsg)
                 else:
                     header_pass += 1
         else:
@@ -1476,11 +1481,15 @@
                 foundat = self.base.find('://' + host + '/')
                 # 4 means http:// prefix, 5 means https:// prefix
                 if foundat not in [4, 5]:
+                    logmsg = self._(
+                        ''"csrf HOST header check failed for "
+                        ''"user%(userid)s. Value=%(host)s") % {
+                            'userid': current_user, 'host': host}
                     if enforce in ('required', 'yes'):
-                        logger.error(self._("csrf HOST header check failed for user%(userid)s. Value=%(host)s") % {'userid': current_user, 'host': host})
+                        logger.error(logmsg)
                         raise Unauthorised(self._("Invalid HOST %s") % host)
                     elif enforce == 'logfailure':
-                        logger.warning(self._("csrf HOST header check failed for user%(userid)s. Value=%(host)s") % {'userid': current_user, 'host': host})
+                        logger.warning(logmsg)
                 else:
                     header_pass += 1
 
@@ -1501,7 +1510,8 @@
                 # see: https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet#Protecting_REST_Services:_Use_of_Custom_Request_Headers
                 if 'HTTP_X_REQUESTED_WITH' not in self.env:
                     logger.error(self._(
-                        "csrf X-REQUESTED-WITH xmlrpc required header check failed for user%s."),
+                        ''"csrf X-REQUESTED-WITH xmlrpc required header "
+                        ''"check failed for user%s."),
                                  current_user)
                     raise UsageError(self._("Required Header Missing"))
 
@@ -1540,8 +1550,11 @@
         enforce = config['WEB_CSRF_ENFORCE_TOKEN']
         if key is None:  # we do not have an @csrf token
             if enforce == 'required':
-                logger.error(self._("Required csrf field missing for user%s"), current_user)
-                raise UsageError(self._("We can't validate your session (csrf failure). Re-enter any unsaved data and try again."))
+                logger.error(self._(
+                    "Required csrf field missing for user%s"), current_user)
+                raise UsageError(self._(
+                    ''"We can't validate your session (csrf failure). "
+                    ''"Re-enter any unsaved data and try again."))
             elif enforce == 'logfailure':
                 # FIXME include url
                 logger.warning(self._("csrf field not supplied by user%s"),
@@ -1590,39 +1603,39 @@
         '''
         # validate against user and session
         if current_user != nonce_user:
-            if enforce in ('required', "yes"):
-                logger.error(
-                    self._("Csrf mismatch user: current user %(user)s != stored user %(stored)s, current session, stored session: %(cur_sess)s,%(stor_sess)s for key %(key)s.") % {
-                        'user': current_user,
-                        'stored': nonce_user,
-                        'cur_sess': current_session,
-                        'stor_sess': nonce_session,
-                        'key': key})
-                raise UsageError(self._("We can't validate your session (csrf failure). Re-enter any unsaved data and try again."))
+            logmsg = self._(
+                ''"Csrf mismatch user: current user %(user)s != stored "
+                ''"user %(stored)s, current session, stored session: "
+                ''"%(cur_sess)s,%(stor_sess)s for key %(key)s.") % {
+                    'user': current_user,
+                    'stored': nonce_user,
+                    'cur_sess': current_session,
+                    'stor_sess': nonce_session,
+                    'key': key}
+            if enforce in ('required', 'yes'):
+                logger.error(logmsg)
+                raise UsageError(self._(
+                    ''"We can't validate your session (csrf failure). "
+                    ''"Re-enter any unsaved data and try again."))
             elif enforce == 'logfailure':
-                logger.warning(
-                    self._("Csrf mismatch user: current user %(user)s != stored user %(stored)s, current session, stored session: %(cur_sess)s,%(stor_sess)s for key %(key)s.") % {
-                        'user': current_user,
-                        'stored': nonce_user,
-                        'cur_sess': current_session,
-                        'stor_sess': nonce_session,
-                        'key': key})
+                logger.warning(logmsg)
+
         if current_session != nonce_session:
-            if enforce in ('required', "yes"):
-                logger.error(
-                    self._("Csrf mismatch user: current session %(curr_sess)s != stored session %(stor_sess)s, current user/stored user is: %(user)s for key %(key)s.") % {
-                        'curr_sess': current_session,
-                        'stor_sess': nonce_session,
-                        'user': current_user,
-                        'key': key})
-                raise UsageError(self._("We can't validate your session (csrf failure). Re-enter any unsaved data and try again."))
+            logmsg = self._(
+                ''"Csrf mismatch user: current session %(curr_sess)s "
+                ''"!= stored session %(stor_sess)s, current user/stored "
+                ''"user is: %(user)s for key %(key)s.") % {
+                    'curr_sess': current_session,
+                    'stor_sess': nonce_session,
+                    'user': current_user,
+                    'key': key}
+            if enforce in ('required', 'yes'):
+                logger.error(logmsg)
+                raise UsageError(self._(
+                    ''"We can't validate your session (csrf failure). "
+                    ''"Re-enter any unsaved data and try again."))
             elif enforce == 'logfailure':
-                logger.warning(
-                    self._("logged only: Csrf mismatch user: current session %(curr_sess)s != stored session %(stor_sess)s, current user/stored user is: %(user)s for key %(key)s.") % {
-                        'curr_sess': current_session,
-                        'stor_sess': nonce_session,
-                        'user': current_user,
-                        'key': key})
+                logger.warning(logmsg)
 
         # we are done and the change can occur.
         return True
@@ -2214,7 +2227,8 @@
             return None
 
         if isinstance(action, list):
-            raise SeriousError('broken form: multiple @action values submitted')
+            raise SeriousError(
+                self._('broken form: multiple @action values submitted'))
         else:
             action = action.value.lower()
 

Roundup Issue Tracker: http://roundup-tracker.org/