INCOMPATIBLE CHANGE to the SSH2 private key file format. There is
[u/mdw/putty] / psftp.c
diff --git a/psftp.c b/psftp.c
index 37f39ff..6b7ff1d 100644 (file)
--- a/psftp.c
+++ b/psftp.c
@@ -130,6 +130,30 @@ char *canonify(char *name)
     }
 }
 
+/*
+ * Return a pointer to the portion of str that comes after the last
+ * slash (or backslash or colon, if `local' is TRUE).
+ */
+static char *stripslashes(char *str, int local)
+{
+    char *p;
+
+    if (local) {
+        p = strchr(str, ':');
+        if (p) str = p+1;
+    }
+
+    p = strrchr(str, '/');
+    if (p) str = p+1;
+
+    if (local) {
+       p = strrchr(str, '\\');
+       if (p) str = p+1;
+    }
+
+    return str;
+}
+
 /* ----------------------------------------------------------------------
  * Actual sftp commands.
  */
@@ -307,7 +331,8 @@ int sftp_general_get(struct sftp_command *cmd, int restart)
        printf("%s: %s\n", cmd->words[1], fxp_error());
        return 0;
     }
-    outfname = (cmd->nwords == 2 ? cmd->words[1] : cmd->words[2]);
+    outfname = (cmd->nwords == 2 ?
+               stripslashes(cmd->words[1], 0) : cmd->words[2]);
 
     fh = fxp_open(fname, SSH_FXF_READ);
     if (!fh) {
@@ -406,7 +431,8 @@ int sftp_general_put(struct sftp_command *cmd, int restart)
     }
 
     fname = cmd->words[1];
-    origoutfname = (cmd->nwords == 2 ? cmd->words[1] : cmd->words[2]);
+    origoutfname = (cmd->nwords == 2 ?
+                   stripslashes(cmd->words[1], 1) : cmd->words[2]);
     outfname = canonify(origoutfname);
     if (!outfname) {
        printf("%s: %s\n", origoutfname, fxp_error());
@@ -1336,6 +1362,25 @@ void askcipher(char *ciphername, int cs)
 }
 
 /*
+ * Warn about the obsolescent key file format.
+ */
+void old_keyfile_warning(void)
+{
+    static const char message[] =
+       "You are loading an SSH 2 private key which has an\n"
+       "old version of the file format. This means your key\n"
+       "file is not fully tamperproof. Future versions of\n"
+       "PuTTY may stop supporting this private key format,\n"
+       "so we recommend you convert your key to the new\n"
+       "format.\n"
+       "\n"
+       "Once the key is loaded into PuTTYgen, you can perform\n"
+       "this conversion simply by saving it again.\n";
+
+    fputs(message, stderr);
+}
+
+/*
  *  Print an error message and perform a fatal exit.
  */
 void fatalbox(char *fmt, ...)
@@ -1369,7 +1414,7 @@ void logevent(char *string)
 {
 }
 
-void ldisc_send(char *buf, int len)
+void ldisc_send(char *buf, int len, int interactive)
 {
     /*
      * This is only here because of the calls to ldisc_send(NULL,
@@ -1684,6 +1729,32 @@ int main(int argc, char *argv[])
        cfg.port = 22;
     }
 
+    /*
+     * Trim leading whitespace off the hostname if it's there.
+     */
+    {
+       int space = strspn(cfg.host, " \t");
+       memmove(cfg.host, cfg.host+space, 1+strlen(cfg.host)-space);
+    }
+
+    /* See if host is of the form user@host */
+    if (cfg.host[0] != '\0') {
+       char *atsign = strchr(cfg.host, '@');
+       /* Make sure we're not overflowing the user field */
+       if (atsign) {
+           if (atsign - cfg.host < sizeof cfg.username) {
+               strncpy(cfg.username, cfg.host, atsign - cfg.host);
+               cfg.username[atsign - cfg.host] = '\0';
+           }
+           memmove(cfg.host, atsign + 1, 1 + strlen(atsign + 1));
+       }
+    }
+
+    /*
+     * Trim a colon suffix off the hostname if it's there.
+     */
+    cfg.host[strcspn(cfg.host, ":")] = '\0';
+
     /* Set username */
     if (user != NULL && user[0] != '\0') {
        strncpy(cfg.username, user, sizeof(cfg.username) - 1);
@@ -1710,6 +1781,15 @@ int main(int argc, char *argv[])
     /* SFTP uses SSH2 by default always */
     cfg.sshprot = 2;
 
+    /*
+     * Disable scary things which shouldn't be enabled for simple
+     * things like SCP and SFTP: agent forwarding, port forwarding,
+     * X forwarding.
+     */
+    cfg.x11_forward = 0;
+    cfg.agentfwd = 0;
+    cfg.portfwd[0] = cfg.portfwd[1] = '\0';
+
     /* Set up subsystem name. */
     strcpy(cfg.remote_cmd, "sftp");
     cfg.ssh_subsys = TRUE;