9ae3f9
From 854defb4ff5e0d53f51545d20796aff662f9850f Mon Sep 17 00:00:00 2001
9ae3f9
From: Saravanakumar Arumugam <sarumuga@redhat.com>
9ae3f9
Date: Thu, 9 Jul 2015 15:56:28 +0530
9ae3f9
Subject: [PATCH 411/449] tools/glusterfind : validate session name
9ae3f9
9ae3f9
Validate a session name(during create) for the following:
9ae3f9
1. minimum 2 character length.
9ae3f9
2. Maximum 256 characters.
9ae3f9
3. No special characters apart from underscore, hyphen allowed.
9ae3f9
9ae3f9
Also, validate volume(expect, while using glusterfind list).
9ae3f9
9ae3f9
>Change-Id: I1b1e64e218f93d0a531d3cf69fc2ce7e2ed11d01
9ae3f9
>BUG: 1241494
9ae3f9
>Signed-off-by: Saravanakumar Arumugam <sarumuga@redhat.com>
9ae3f9
>Signed-off-by: Shwetha K Acharya <sacharya@redhat.com>
9ae3f9
9ae3f9
backport of https://review.gluster.org/#/c/glusterfs/+/11602/
9ae3f9
9ae3f9
BUG: 1234220
9ae3f9
Change-Id: I1b1e64e218f93d0a531d3cf69fc2ce7e2ed11d01
9ae3f9
Signed-off-by: Shwetha K Acharya <sacharya@redhat.com>
9ae3f9
Reviewed-on: https://code.engineering.redhat.com/gerrit/202469
9ae3f9
Tested-by: RHGS Build Bot <nigelb@redhat.com>
9ae3f9
Reviewed-by: Sunil Kumar Heggodu Gopala Acharya <sheggodu@redhat.com>
9ae3f9
---
9ae3f9
 tools/glusterfind/src/main.py | 50 ++++++++++++++++++++++++++++++++++++-------
9ae3f9
 1 file changed, 42 insertions(+), 8 deletions(-)
9ae3f9
9ae3f9
diff --git a/tools/glusterfind/src/main.py b/tools/glusterfind/src/main.py
9ae3f9
index 5ca1fec..4b5466d 100644
9ae3f9
--- a/tools/glusterfind/src/main.py
9ae3f9
+++ b/tools/glusterfind/src/main.py
9ae3f9
@@ -23,6 +23,7 @@ import tempfile
9ae3f9
 import signal
9ae3f9
 from datetime import datetime
9ae3f9
 import codecs
9ae3f9
+import re
9ae3f9
 
9ae3f9
 from utils import execute, is_host_local, mkdirp, fail
9ae3f9
 from utils import setup_logger, human_time, handle_rm_error
9ae3f9
@@ -520,11 +521,8 @@ def write_output(outfile, outfilemerger, field_separator):
9ae3f9
                 else:
9ae3f9
                     gfind_write(f, row[0], field_separator, p_rep)
9ae3f9
 
9ae3f9
-def mode_create(session_dir, args):
9ae3f9
-    logger.debug("Init is called - Session: %s, Volume: %s"
9ae3f9
-                 % (args.session, args.volume))
9ae3f9
-
9ae3f9
-    cmd = ["gluster", 'volume', 'info', args.volume, "--xml"]
9ae3f9
+def validate_volume(volume):
9ae3f9
+    cmd = ["gluster", 'volume', 'info', volume, "--xml"]
9ae3f9
     _, data, _ = execute(cmd,
9ae3f9
                          exit_msg="Failed to Run Gluster Volume Info",
9ae3f9
                          logger=logger)
9ae3f9
@@ -532,11 +530,42 @@ def mode_create(session_dir, args):
9ae3f9
         tree = etree.fromstring(data)
9ae3f9
         statusStr = tree.find('volInfo/volumes/volume/statusStr').text
9ae3f9
     except (ParseError, AttributeError) as e:
9ae3f9
-        fail("Invalid Volume: %s" % e, logger=logger)
9ae3f9
-
9ae3f9
+        fail("Invalid Volume: Check the Volume name! %s" % e)
9ae3f9
     if statusStr != "Started":
9ae3f9
-        fail("Volume %s is not online" % args.volume, logger=logger)
9ae3f9
+        fail("Volume %s is not online" % volume)
9ae3f9
+
9ae3f9
+# The rules for a valid session name.
9ae3f9
+SESSION_NAME_RULES = {
9ae3f9
+    'min_length': 2,
9ae3f9
+    'max_length': 256,  # same as maximum volume length
9ae3f9
+    # Specifies all alphanumeric characters, underscore, hyphen.
9ae3f9
+    'valid_chars': r'0-9a-zA-Z_-',
9ae3f9
+}
9ae3f9
+
9ae3f9
+
9ae3f9
+# checks valid session name, fail otherwise
9ae3f9
+def validate_session_name(session):
9ae3f9
+    # Check for minimum length
9ae3f9
+    if len(session) < SESSION_NAME_RULES['min_length']:
9ae3f9
+        fail('session_name must be at least ' +
9ae3f9
+                 str(SESSION_NAME_RULES['min_length']) + ' characters long.')
9ae3f9
+    # Check for maximum length
9ae3f9
+    if len(session) > SESSION_NAME_RULES['max_length']:
9ae3f9
+        fail('session_name must not exceed ' +
9ae3f9
+                 str(SESSION_NAME_RULES['max_length']) + ' characters length.')
9ae3f9
+
9ae3f9
+    # Matches strings composed entirely of characters specified within
9ae3f9
+    if not re.match(r'^[' + SESSION_NAME_RULES['valid_chars'] +
9ae3f9
+                        ']+$', session):
9ae3f9
+        fail('Session name can only contain these characters: ' +
9ae3f9
+                         SESSION_NAME_RULES['valid_chars'])
9ae3f9
+
9ae3f9
+
9ae3f9
+def mode_create(session_dir, args):
9ae3f9
+    validate_session_name(args.session)
9ae3f9
 
9ae3f9
+    logger.debug("Init is called - Session: %s, Volume: %s"
9ae3f9
+                 % (args.session, args.volume))
9ae3f9
     mkdirp(session_dir, exit_on_err=True, logger=logger)
9ae3f9
     mkdirp(os.path.join(session_dir, args.volume), exit_on_err=True,
9ae3f9
            logger=logger)
9ae3f9
@@ -850,6 +879,11 @@ def main():
9ae3f9
                 args.mode not in ["create", "list", "query"]:
9ae3f9
             fail("Invalid session %s" % args.session)
9ae3f9
 
9ae3f9
+        # volume involved, validate the volume first
9ae3f9
+        if args.mode not in ["list"]:
9ae3f9
+            validate_volume(args.volume)
9ae3f9
+
9ae3f9
+
9ae3f9
         # "default" is a system defined session name
9ae3f9
         if args.mode in ["create", "post", "pre", "delete"] and \
9ae3f9
                 args.session == "default":
9ae3f9
-- 
9ae3f9
1.8.3.1
9ae3f9