From bd911ba8143f07fa4f14b682ddcd559a69a208e8 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Wed, 29 Sep 2010 04:30:56 -0400
Subject: [PATCH] Pool some code for command line tools; avoid displaying password on shell (#1486947); fix msgexport now using the new imap wrapper

---
 CHANGELOG                    |    2 
 program/include/clisetup.php |   90 ++++++++++++++++++++++++++++++
 bin/msgimport.sh             |   43 -------------
 bin/msgexport.sh             |   44 +-------------
 4 files changed, 98 insertions(+), 81 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index e4a19cf..d38bbb9 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,8 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Fix msgexport.sh now using the new imap wrapper
+- Avoid displaying password on shell (#1486947)
 - Only lower-case user name if first login attempt failed (#1486393)
 - Make alias setting in squirrelmail_usercopy plugin configurable (patch by pommi, #1487007)
 - Prevent from saving a non-existing skin path in user prefs (#1486936)
diff --git a/bin/msgexport.sh b/bin/msgexport.sh
index 005e2ca..0aa33b5 100755
--- a/bin/msgexport.sh
+++ b/bin/msgexport.sh
@@ -1,45 +1,10 @@
 #!/usr/bin/env php
 <?php
-if (php_sapi_name() != 'cli') {
-    die('Not on the "shell" (php-cli).');
-}
 
 define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
 ini_set('memory_limit', -1);
 
-require_once INSTALL_PATH.'program/include/iniset.php';
-
-/**
- * Parse commandline arguments into a hash array
- */
-function get_opt($aliases=array())
-{
-	$args = array();
-	for ($i=1; $i<count($_SERVER['argv']); $i++)
-	{
-		$arg = $_SERVER['argv'][$i];
-		if (substr($arg, 0, 2) == '--')
-		{
-			$sp = strpos($arg, '=');
-			$key = substr($arg, 2, $sp - 2);
-			$value = substr($arg, $sp+1);
-		}
-		else if ($arg{0} == '-')
-		{
-			$key = substr($arg, 1);
-			$value = $_SERVER['argv'][++$i];
-		}
-		else
-			continue;
-
-		$args[$key] = preg_replace(array('/^["\']/', '/["\']$/'), '', $value);
-		
-		if ($alias = $aliases[$key])
-			$args[$alias] = $args[$key];
-	}
-
-	return $args;
-}
+require_once INSTALL_PATH.'program/include/clisetup.php';
 
 function print_usage()
 {
@@ -89,8 +54,8 @@
 		$from = current($IMAP->decode_address_list($headers->from, 1, false));
 		
 		fwrite($out, sprintf("From %s %s UID %d\n", $from['mailto'], $headers->date, $headers->uid));
-		fwrite($out, iil_C_FetchPartHeader($IMAP->conn, $mbox, $i, null));
-		fwrite($out, iil_C_HandlePartBody($IMAP->conn, $mbox, $i, null, 1));
+		fwrite($out, $IMAP->conn->fetchPartHeader($mbox, $i));
+		fwrite($out, $IMAP->conn->handlePartBody($mbox, $i));
 		fwrite($out, "\n\n\n");
 		
 		progress_update($i, $count);
@@ -125,8 +90,7 @@
 }
 
 // prompt for password
-vputs("Password: ");
-$args['pass'] = trim(fgets(STDIN));
+$args['pass'] = prompt_silent("Password: ");
 
 
 // parse $host URL
diff --git a/bin/msgimport.sh b/bin/msgimport.sh
index a5161e0..74dc816 100755
--- a/bin/msgimport.sh
+++ b/bin/msgimport.sh
@@ -1,45 +1,10 @@
 #!/usr/bin/env php
 <?php
-if (php_sapi_name() != 'cli') {
-    die('Not on the "shell" (php-cli).');
-}
 
 define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
 ini_set('memory_limit', -1);
 
-require_once INSTALL_PATH.'program/include/iniset.php';
-
-/**
- * Parse commandline arguments into a hash array
- */
-function get_opt($aliases=array())
-{
-	$args = array();
-	for ($i=1; $i<count($_SERVER['argv']); $i++)
-	{
-		$arg = $_SERVER['argv'][$i];
-		if (substr($arg, 0, 2) == '--')
-		{
-			$sp = strpos($arg, '=');
-			$key = substr($arg, 2, $sp - 2);
-			$value = substr($arg, $sp+1);
-		}
-		else if ($arg{0} == '-')
-		{
-			$key = substr($arg, 1);
-			$value = $_SERVER['argv'][++$i];
-		}
-		else
-			continue;
-
-		$args[$key] = preg_replace(array('/^["\']/', '/["\']$/'), '', $value);
-		
-		if ($alias = $aliases[$key])
-			$args[$alias] = $args[$key];
-	}
-
-	return $args;
-}
+require_once INSTALL_PATH.'program/include/clisetup.php';
 
 function print_usage()
 {
@@ -82,11 +47,7 @@
 // prompt for password
 if (empty($args['pass']))
 {
-	echo "Password: ";
-	$args['pass'] = trim(fgets(STDIN));
-
-	// clear password input
-	echo chr(8)."\rPassword: ".str_repeat("*", strlen($args['pass']))."\n";
+	$args['pass'] = prompt_silent("Password: ");
 }
 
 // parse $host URL
diff --git a/program/include/clisetup.php b/program/include/clisetup.php
new file mode 100644
index 0000000..fbea980
--- /dev/null
+++ b/program/include/clisetup.php
@@ -0,0 +1,90 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/clisetup.php                                          |
+ |                                                                       |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2010, Roundcube Dev, - Switzerland                      |
+ | Licensed under the GNU GPL                                            |
+ |                                                                       |
+ | PURPOSE:                                                              |
+ |   Setup the command line environment and provide some utitlity        |
+ |   functions.                                                          |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com>                        |
+ +-----------------------------------------------------------------------+
+
+ $Id$
+
+*/
+
+if (php_sapi_name() != 'cli') {
+  die('Not on the "shell" (php-cli).');
+}
+
+require_once 'iniset.php';
+
+
+/**
+ * Parse commandline arguments into a hash array
+ */
+function get_opt($aliases=array())
+{
+	$args = array();
+	for ($i=1; $i<count($_SERVER['argv']); $i++)
+	{
+		$arg = $_SERVER['argv'][$i];
+		if (substr($arg, 0, 2) == '--')
+		{
+			$sp = strpos($arg, '=');
+			$key = substr($arg, 2, $sp - 2);
+			$value = substr($arg, $sp+1);
+		}
+		else if ($arg{0} == '-')
+		{
+			$key = substr($arg, 1);
+			$value = $_SERVER['argv'][++$i];
+		}
+		else
+			continue;
+
+		$args[$key] = preg_replace(array('/^["\']/', '/["\']$/'), '', $value);
+		
+		if ($alias = $aliases[$key])
+			$args[$alias] = $args[$key];
+	}
+
+	return $args;
+}
+
+
+/**
+ * from http://blogs.sitepoint.com/2009/05/01/interactive-cli-password-prompt-in-php/
+ */
+function prompt_silent($prompt = "Password:")
+{
+  if (preg_match('/^win/i', PHP_OS)) {
+    $vbscript = sys_get_temp_dir() . 'prompt_password.vbs';
+    file_put_contents($vbscript, 'wscript.echo(InputBox("' . addslashes($prompt) . '", "", "password here"))');
+    $command = "cscript //nologo " . escapeshellarg($vbscript);
+    $password = rtrim(shell_exec($command));
+    unlink($vbscript);
+    return $password;
+  }
+  else {
+    $command = "/usr/bin/env bash -c 'echo OK'";
+    if (rtrim(shell_exec($command)) !== 'OK') {
+      echo $prompt;
+      $pass = trim(fgets(STDIN));
+      echo chr(8)."\r" . $prompt . str_repeat("*", strlen($pass))."\n";
+      return $pass;
+    }
+    $command = "/usr/bin/env bash -c 'read -s -p \"" . addslashes($prompt) . "\" mypassword && echo \$mypassword'";
+    $password = rtrim(shell_exec($command));
+    echo "\n";
+    return $password;
+  }
+}
+
+?>
\ No newline at end of file

--
Gitblit v1.9.1