bdfa378f70c7 — Oben Sonne 6 years ago
Tune integration of encfs config file option

- shorter naming
- version independent naming (if there are different config file
  versions to consider - other than 6 - we can detect them
  automatically)
- config file set in interactive mode, similar to other options
- adjust tests (though a test case for teh new feature is still missing)
3 files changed, 88 insertions(+), 49 deletions(-)

M gnome-encfs
M tests/test.exp
M tests/test.sh
M gnome-encfs +32 -23
@@ 45,6 45,7 @@ class preset:
     proceed = None
     password = None
     epath = None
+    econfig = None
     mpoint = None
     amount = None
 

          
@@ 63,6 64,9 @@ MSG_NO_MATCH = ("No matching EncFS items
                 "Use option --list to show available items or "
                 "option --add to add items.")
 
+MSG_NO_ENCFS_PATH = ("no EncFS at given path (or the EncFS config file "
+                     "location is invalid)")
+
 USAGE = """Usage: %prog --list
        %prog --mount [ENCFS-PATH-or-MOUNT-POINT]
        %prog --add ENCFS-PATH MOUNT-POINT

          
@@ 121,8 125,9 @@ def _options():
                   help="Input for mount point edit")
     og.add_option("", "--amount", default=None,
                   help="Input for auto mount question")
-    og.add_option("", "--encfs6config", default=None,
-                  help="Set an encfs6 config file to use (instead of using the one in the encfs path)")
+    og.add_option("", "--econfig", default=None,
+                  help="Input for encfs config file question")
+
     op.add_option_group(og)
 
     opts, args = op.parse_args()

          
@@ 159,7 164,7 @@ def _options():
     preset.epath = opts.epath
     preset.mpoint = opts.mpoint
     preset.amount = opts.amount
-    preset.encfs6config = opts.encfs6config
+    preset.econfig = opts.econfig
 
     return opts
 

          
@@ 173,7 178,7 @@ def _exit(rc):
 def _proceed(msg):
     print("Warning: %s" % msg)
     proceed = preset.proceed or raw_input("Proceed [y/N]: ")
-    if proceed.strip()[0].lower() != "y":
+    if not proceed or proceed.strip()[0].lower() != "y":
         _exit(2)
 
 def _pathify(path):

          
@@ 184,10 189,11 @@ def _pathify(path):
     path = os.path.realpath(path)
     return path
 
-def _env_with_encfs6config(encfs6config):
+def _encfs_env(econfig):
+    """Get environment for encfs commands."""
     env = os.environ.copy()
-    if encfs6config != "":
-        env["ENCFS6_CONFIG"] = encfs6config
+    if econfig != "-":
+        env["ENCFS6_CONFIG"] = econfig
     return env
 
 def _is_mounted(mpoint):

          
@@ 200,11 206,11 @@ def _is_mounted(mpoint):
     points = [os.path.abspath(p) for p in points]
     return os.path.abspath(mpoint) in points
 
-def _is_encfs(epath, encfs6config):
+def _is_encfs(epath, econfig):
     """Check if 'epath' points to an EncFS directory."""
 
     p = subprocess.Popen(["encfsctl", "info", epath], stdout=subprocess.PIPE,
-                         stderr=subprocess.PIPE, env = _env_with_encfs6config(encfs6config))
+        stderr=subprocess.PIPE, env=_encfs_env(econfig))
     p.communicate()
     return p.returncode == 0
 

          
@@ 282,30 288,32 @@ def list_items(path=None):
         epath = item.attributes["encfs-path"]
         mpoint = item.attributes["mount-point"]
         amount = item.attributes["auto-mount"]
-        encfs6config = item.attributes.get("encfs6config", "[in encfs path]")
+        econfig = item.attributes.get("encfs-config", "-")
         print("* encfs path     : %s" % epath)
         print("  mount point    : %s" % mpoint)
         print("  mount at login : %s" % (amount == "y" and "yes" or "no"))
-        print("  encfs6config   : %s" % encfs6config)
+        print("  encfs config   : %s" % econfig)
 
     return RC_OK
 
 def add_item(epath, mpoint):
     """Add new EncFS item to keyring."""
 
-    encfs6config = preset.encfs6config or ""
-
-    if not _is_encfs(epath, encfs6config):
-        _proceed("no EncFS at given path (maybe you want to specify an external encfs configfile using --encfsconfig)")
     if not os.path.isdir(mpoint):
         _proceed("mount point is not a directory")
     if _get_items(mpoint=mpoint):
         _proceed("mount point already in keyring")
 
+    econfig = preset.econfig or raw_input("EncFS config file [-]: ") or "-"
+
+    if not _is_encfs(epath, econfig):
+        _proceed(MSG_NO_ENCFS_PATH)
+
     secret = preset.password or getpass.getpass("EncFS password: ")
     amount = preset.amount or raw_input("Mount at login [Y/n]: ") or "y"
     amount = amount.strip()[0].lower() == "y" and "y" or "n"
-    attr = {"encfs-path": epath, "mount-point": mpoint, "auto-mount": amount, "encfs6config": encfs6config}
+    attr = {"encfs-path": epath, "mount-point": mpoint, "auto-mount": amount,
+        "encfs-config": econfig}
     attr.update(GENCFS_ATTR)
     name = "EncFS mount at %s" % mpoint
     gk.item_create_sync(KEYRING, ITYPE, name, attr, secret, False)

          
@@ 331,13 339,13 @@ def edit_item(mpoint):
         epath = item.attributes["encfs-path"]
         mpoint = item.attributes["mount-point"]
         amount = item.attributes["auto-mount"]
-        encfs6config = item.attributes.get("encfs6config","")
+        econfig = item.attributes.get("encfs-config", "-")
         epath = preset.epath or raw_input("EncFS path [%s]: " % epath) or epath
+        econfig = preset.econfig or raw_input("EncFS config file [%s] (`-`: default): " % econfig) or econfig
         mpoint = preset.mpoint or raw_input("Mount point [%s]: " % mpoint) or mpoint
         secret = preset.password or getpass.getpass("Password [**current**]: ") or item.secret
         hint = amount == "y" and "Y/n" or "y/N"
         amount = preset.amount or raw_input("Mount at login [%s]: " % hint) or amount
-        encfs6config = preset.encfs6config or encfs6config
         amount = amount.strip()[0].lower() == "y" and "y" or "n"
         mpoint = _pathify(mpoint)
         epath = _pathify(epath)

          
@@ 346,8 354,8 @@ def edit_item(mpoint):
         for other in [i for i in items if i.item_id != item.item_id]:
             if other.attributes["mount-point"] == mpoint:
                 _proceed("mount point already in use")
-        if not _is_encfs(epath, encfs6config):
-            _proceed("no EncFS at given path")
+        if not _is_encfs(epath, econfig):
+            _proceed(MSG_NO_ENCFS_PATH)
         if not os.path.isdir(mpoint):
             _proceed("mount point is not a directory")
 

          
@@ 356,7 364,7 @@ def edit_item(mpoint):
         attributes["encfs-path"] = epath
         attributes["mount-point"] = mpoint
         attributes["auto-mount"] = amount
-        attributes["encfs6config"] = encfs6config
+        attributes["encfs-config"] = econfig
         gk.item_set_attributes_sync(KEYRING, item.item_id, attributes)
         info = gk.item_get_info_sync(KEYRING, item.item_id)
         info.set_secret(secret)

          
@@ 406,7 414,7 @@ def mount_items(path, autostart):
     for item in items:
         epath = item.attributes["encfs-path"]
         mpoint = item.attributes["mount-point"]
-        encfs6config = item.attributes["encfs6config"]
+        econfig = item.attributes["encfs-config"]
         msg = "Mounting %s at %s: " % (epath, mpoint)
         if _is_mounted(mpoint):
             msg += "mount point already in use"

          
@@ 416,7 424,8 @@ def mount_items(path, autostart):
             rc |= RC_INVALID_PATH
         else:
             cmd = ["encfs", "-o", "nonempty", "-S", epath, mpoint]
-            p = subprocess.Popen(cmd, stdin=subprocess.PIPE, env = _env_with_encfs6config(encfs6config))
+            p = subprocess.Popen(cmd, stdin=subprocess.PIPE,
+                env=_encfs_env(econfig))
             p.communicate(input="%s\n" % item.secret)
             msg += p.returncode and "FAILED" or "OK"
             rc |= 0 if p.returncode == os.EX_OK else RC_MOUNT_FAILED

          
M tests/test.exp +33 -7
@@ 4,51 4,62 @@ 
 * encfs path     : ./tenv/e1
   mount point    : ./tenv/m1
   mount at login : yes
+  encfs config   : -
 # EXPECT: failing add - mount point in use
 Warning: mount point already in keyring
 # EXPECT: 1 listed item (1)
 * encfs path     : ./tenv/e1
   mount point    : ./tenv/m1
   mount at login : yes
+  encfs config   : -
 # EXPECT: succeeding add (2)
 # EXPECT: 2 listed items (1,2)
 * encfs path     : ./tenv/e1
   mount point    : ./tenv/m1
   mount at login : yes
+  encfs config   : -
 * encfs path     : ./tenv/e2
   mount point    : ./tenv/m2
   mount at login : yes
+  encfs config   : -
 # EXPECT: succeeding add (3a)
 # EXPECT: 3 listed items (1,2,3a)
 * encfs path     : ./tenv/e1
   mount point    : ./tenv/m1
   mount at login : yes
+  encfs config   : -
 * encfs path     : ./tenv/e2
   mount point    : ./tenv/m2
   mount at login : yes
+  encfs config   : -
 * encfs path     : ./tenv/e3
   mount point    : ./tenv/m3a
   mount at login : yes
+  encfs config   : -
 # EXPECT: succeeding add (3b)
 # EXPECT: 4 listed items (1,2,3a,3b)
 * encfs path     : ./tenv/e1
   mount point    : ./tenv/m1
   mount at login : yes
+  encfs config   : -
 * encfs path     : ./tenv/e2
   mount point    : ./tenv/m2
   mount at login : yes
+  encfs config   : -
 * encfs path     : ./tenv/e3
   mount point    : ./tenv/m3a
   mount at login : yes
+  encfs config   : -
 * encfs path     : ./tenv/e3
   mount point    : ./tenv/m3b
   mount at login : yes
+  encfs config   : -
 # EXPECT: 2 succeeding mounts (3a,3b)
 Mounting ./tenv/m3a: OK
 Mounting ./tenv/m3b: OK
 # EXPECT: 2 mounted paths (3a,3b)
-encfs on ./tenv/m3a type fuse.encfs (rw,nosuid,nodev,default_permissions,)
-encfs on ./tenv/m3b type fuse.encfs (rw,nosuid,nodev,default_permissions,)
+encfs on ./tenv/m3a type fuse.encfs
+encfs on ./tenv/m3b type fuse.encfs
 # EXPECT: no mounted paths - all unmounted
 # EXPECT: 4 succeeding mounts (1,2,3a,3b)
 Mounting ./tenv/m1: OK

          
@@ 56,10 67,10 @@ Mounting ./tenv/m2: OK
 Mounting ./tenv/m3a: OK
 Mounting ./tenv/m3b: OK
 # EXPECT: 4 mounted paths (1,2,3a,3b)
-encfs on ./tenv/m1 type fuse.encfs (rw,nosuid,nodev,default_permissions,)
-encfs on ./tenv/m2 type fuse.encfs (rw,nosuid,nodev,default_permissions,)
-encfs on ./tenv/m3a type fuse.encfs (rw,nosuid,nodev,default_permissions,)
-encfs on ./tenv/m3b type fuse.encfs (rw,nosuid,nodev,default_permissions,)
+encfs on ./tenv/m1 type fuse.encfs
+encfs on ./tenv/m2 type fuse.encfs
+encfs on ./tenv/m3a type fuse.encfs
+encfs on ./tenv/m3b type fuse.encfs
 # EXPECT: 4 failing mounts - already mounted
 Mounting ./tenv/m1: mount point already in use
 Mounting ./tenv/m2: mount point already in use

          
@@ 70,32 81,41 @@ Mounting ./tenv/m3b: mount point already
 * encfs path     : ./tenv/e1
   mount point    : ./tenv/m1
   mount at login : yes
+  encfs config   : -
 * encfs path     : ./tenv/e2
   mount point    : ./tenv/m2
   mount at login : yes
+  encfs config   : -
 * encfs path     : ./tenv/e3
   mount point    : ./tenv/m3b
   mount at login : yes
+  encfs config   : -
 # EXPECT: 3 items (1,2,3a)
 * encfs path     : ./tenv/e1
   mount point    : ./tenv/m1
   mount at login : yes
+  encfs config   : -
 * encfs path     : ./tenv/e2
   mount point    : ./tenv/m2
   mount at login : yes
+  encfs config   : -
 * encfs path     : ./tenv/e3
   mount point    : ./tenv/m3a
   mount at login : yes
+  encfs config   : -
 # EXPECT: 3 items (1,2,3a)
 * encfs path     : ./tenv/e1
   mount point    : ./tenv/m1
   mount at login : yes
+  encfs config   : -
 * encfs path     : ./tenv/e2
   mount point    : ./tenv/m2
   mount at login : yes
+  encfs config   : -
 * encfs path     : ./tenv/e3
   mount point    : ./tenv/m3a
   mount at login : yes
+  encfs config   : -
 # EXPECT: 1 failing mount (3a) - wrong password
 Error decoding volume key, password incorrect
 Mounting ./tenv/m3a: FAILED

          
@@ 104,16 124,19 @@ Mounting ./tenv/m3a: FAILED
 * encfs path     : ./tenv/e1
   mount point    : ./tenv/m1
   mount at login : yes
+  encfs config   : -
 * encfs path     : ./tenv/e2
   mount point    : ./tenv/m2
   mount at login : yes
+  encfs config   : -
 * encfs path     : ./tenv/e3
   mount point    : ./tenv/m3b
   mount at login : yes
+  encfs config   : -
 # EXPECT: 1 succeeding mount (3b)
 Mounting ./tenv/m3b: OK
 # EXPECT: 1 mounted path (3b)
-encfs on ./tenv/m3b type fuse.encfs (rw,nosuid,nodev,default_permissions,)
+encfs on ./tenv/m3b type fuse.encfs
 # EXPECT: no mounted paths - all unmounted
 # EXPECT: failing edit (3b->2) - mount point in use
 Warning: mount point already in use

          
@@ 121,12 144,15 @@ Warning: mount point already in use
 * encfs path     : ./tenv/e1
   mount point    : ./tenv/m1
   mount at login : yes
+  encfs config   : -
 * encfs path     : ./tenv/e2
   mount point    : ./tenv/m2
   mount at login : yes
+  encfs config   : -
 * encfs path     : ./tenv/e3
   mount point    : ./tenv/m3b
   mount at login : yes
+  encfs config   : -
 # EXPECT: autostart on
 autostart on
 # EXPECT: 2 succeeding edits

          
M tests/test.sh +23 -19
@@ 4,6 4,10 @@ expect() {
 	echo "# EXPECT: $1"
 }
 
+mounts() {
+    mount | grep "/tenv/m[0-9]" | sed -r -e "s/ \([^ ]+\)//"
+}
+
 if [ ! -e ./tenv.tar ] ; then
     echo "Abort. Not in testing environment."
     exit 1

          
@@ 31,45 35,45 @@ expect "no listed items"
 $GENCFS -l
 
 expect "succeeding add (1)"
-$GENCFS -a $TENV/e1 $TENV/m1 --password p1 --proceed n --amount y
+$GENCFS -a $TENV/e1 $TENV/m1 --econfig "-" --password p1 --proceed n --amount y
 expect "1 listed item (1)"
 $GENCFS -l
 
 expect "failing add - mount point in use"
-$GENCFS -a ./tenv/e1 ./tenv/m1 --password p1 --proceed n --amount y
+$GENCFS -a ./tenv/e1 ./tenv/m1 --econfig "-" --password p1 --proceed n --amount y
 expect "1 listed item (1)"
 $GENCFS -l
 
 expect "succeeding add (2)"
-$GENCFS -a $TENV/e2 $TENV/m2 --password p2 --proceed n --amount y
+$GENCFS -a $TENV/e2 $TENV/m2 --econfig "-" --password p2 --proceed n --amount y
 expect "2 listed items (1,2)"
 $GENCFS -l
 
 expect "succeeding add (3a)"
-$GENCFS -a $TENV/e3 $TENV/m3a --password p3 --proceed n --amount y
+$GENCFS -a $TENV/e3 $TENV/m3a --econfig "-" --password p3 --proceed n --amount y
 expect "3 listed items (1,2,3a)"
 $GENCFS -l
 
 expect "succeeding add (3b)"
-$GENCFS -a $TENV/e3 $TENV/m3b --password p3 --proceed n --amount y
+$GENCFS -a $TENV/e3 $TENV/m3b --econfig "-" --password p3 --proceed n --amount y
 expect "4 listed items (1,2,3a,3b)"
 $GENCFS -l
 
 expect "2 succeeding mounts (3a,3b)"
 $GENCFS -m ./tenv/e3
 expect "2 mounted paths (3a,3b)"
-mount | grep "/tenv/m[0-9]" | sed -e "s/user=\w\+//"
+mounts
 
 for MPOINT in $TENV/m3* ; do
     fusermount -u $MPOINT 2>&1
 done
 expect "no mounted paths - all unmounted"
-mount | grep "/tenv/m[0-9]"
+mounts
 
 expect "4 succeeding mounts (1,2,3a,3b)"
 $GENCFS -m
 expect "4 mounted paths (1,2,3a,3b)"
-mount | grep "/tenv/m[0-9]" | sed -e "s/user=\w\+//"
+mounts
 
 expect "4 failing mounts - already mounted"
 $GENCFS -m

          
@@ 78,54 82,54 @@ for MPOINT in $TENV/m* ; do
 	fusermount -u $MPOINT 2>&1
 done
 expect "no mounted paths - all unmounted"
-mount | grep "/tenv/m[0-9]" | sed -e "s/user=\w\+//"
+mounts
 
 $GENCFS -r $TENV/m3a
 expect "3 items (1,2,3b)"
 $GENCFS -l
 
-$GENCFS -e $TENV/m3b --password p3 --epath $TENV/e3 --mpoint $TENV/m3a --amount y
+$GENCFS -e $TENV/m3b --econfig "-" --password p3 --epath $TENV/e3 --mpoint $TENV/m3a --amount y
 expect "3 items (1,2,3a)"
 $GENCFS -l
 
-$GENCFS -e $TENV/m3a --password px --epath $TENV/e3 --mpoint $TENV/m3a --amount y
+$GENCFS -e $TENV/m3a --econfig "-" --password px --epath $TENV/e3 --mpoint $TENV/m3a --amount y
 expect "3 items (1,2,3a)"
 $GENCFS -l
 
 expect "1 failing mount (3a) - wrong password"
 $GENCFS -m $TENV/m3a
 expect "no mounted paths"
-mount | grep "/tenv/m[0-9]" | sed -e "s/user=\w\+//"
+mounts
 
-$GENCFS -e $TENV/m3a --password p3 --epath $TENV/e3 --mpoint $TENV/m3b --amount y
+$GENCFS -e $TENV/m3a --econfig "-" --password p3 --epath $TENV/e3 --mpoint $TENV/m3b --amount y
 expect "3 items (1,2,3b)"
 $GENCFS -l
 
 expect "1 succeeding mount (3b)"
 $GENCFS -m $TENV/m3b
 expect "1 mounted path (3b)"
-mount | grep "/tenv/m[0-9]" | sed -e "s/user=\w\+//"
+mounts
 
 fusermount -u $TENV/m3b 2>&1
 
 expect "no mounted paths - all unmounted"
-mount | grep "/tenv/m[0-9]" | sed -e "s/user=\w\+//"
+mounts
 
 expect "failing edit (3b->2) - mount point in use"
-$GENCFS -e $TENV/m3b --password p3 --epath $TENV/e3 --mpoint $TENV/m2 --proceed n --amount y
+$GENCFS -e $TENV/m3b --econfig "-" --password p3 --epath $TENV/e3 --mpoint $TENV/m2 --proceed n --amount y
 expect "3 items (1,2,3b)"
 $GENCFS -l
 expect "autostart on"
 test -e autostart.desktop && echo "autostart on" ||  echo "autostart off"
 expect "2 succeeding edits"
-$GENCFS -e $TENV/m1 --password p1 --epath $TENV/e1 --mpoint $TENV/m1 --proceed n --amount n
-$GENCFS -e $TENV/m2 --password p2 --epath $TENV/e2 --mpoint $TENV/m2 --proceed n --amount n
+$GENCFS -e $TENV/m1 --econfig "-" --password p1 --epath $TENV/e1 --mpoint $TENV/m1 --proceed n --amount n
+$GENCFS -e $TENV/m2 --econfig "-" --password p2 --epath $TENV/e2 --mpoint $TENV/m2 --proceed n --amount n
 expect "autostart on"
 test -e autostart.desktop && echo "autostart on" ||  echo "autostart off"
 expect "autostart content"
 cat autostart.desktop
 expect "1 succeeding edits"
-$GENCFS -e $TENV/m3b --password p3 --epath $TENV/e3 --mpoint $TENV/m3b --proceed n --amount n
+$GENCFS -e $TENV/m3b --econfig "-" --password p3 --epath $TENV/e3 --mpoint $TENV/m3b --proceed n --amount n
 expect "autostart off"
 test -e autostart.desktop && echo "autostart on" ||  echo "autostart off"