James Moger
2015-11-22 ed552ba47c02779c270ffd62841d6d1048dade70
src/main/java/com/gitblit/transport/ssh/WelcomeShell.java
@@ -1,4 +1,5 @@
/*
 * Copyright (C) 2009 The Android Open Source Project
 * Copyright 2014 gitblit.com.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
@@ -34,6 +35,8 @@
import com.gitblit.IStoredSettings;
import com.gitblit.Keys;
import com.gitblit.models.UserModel;
import com.gitblit.transport.ssh.commands.DispatchCommand;
import com.gitblit.transport.ssh.commands.SshCommandFactory;
import com.gitblit.utils.StringUtils;
/**
@@ -56,7 +59,7 @@
   private static class SendMessage implements Command, SessionAware {
      private final IStoredSettings settings;
      private SshDaemonClient client;
      private ServerSession session;
      private InputStream in;
      private OutputStream out;
@@ -89,7 +92,7 @@
      @Override
      public void setSession(final ServerSession session) {
         this.client = session.getAttribute(SshDaemonClient.KEY);
         this.session = session;
      }
      @Override
@@ -105,31 +108,83 @@
      @Override
      public void destroy() {
         this.session = null;
      }
      String getMessage() {
         SshDaemonClient client = session.getAttribute(SshDaemonClient.KEY);
         UserModel user = client.getUser();
         String hostname = getHostname();
         int port = settings.getInteger(Keys.git.sshPort, 0);
         final String b1 = StringUtils.rightPad("", 72, '═');
         final String b2 = StringUtils.rightPad("", 72, '─');
         final String nl = "\r\n";
         StringBuilder msg = new StringBuilder();
         msg.append("\r\n");
         msg.append("  Hi ");
         msg.append(nl);
         msg.append(b1);
         msg.append(nl);
         msg.append(" ");
         msg.append(com.gitblit.Constants.getGitBlitVersion());
         msg.append(nl);
         msg.append(b1);
         msg.append(nl);
         msg.append(nl);
         msg.append(" Hi ");
         msg.append(user.getDisplayName());
         msg.append(", you have successfully connected to Gitblit over SSH.");
         msg.append("\r\n");
         msg.append("\r\n");
         msg.append(", you have successfully connected over SSH.");
         msg.append(nl);
         msg.append(" Interactive shells are not available.");
         msg.append(nl);
         msg.append(nl);
         msg.append("   client:   ");
         msg.append(session.getClientVersion());
         msg.append(nl);
         msg.append(nl);
         msg.append("  You may clone a repository with the following Git syntax:\r\n");
         msg.append("\r\n");
         msg.append(b2);
         msg.append(nl);
         msg.append(nl);
         msg.append(" You may clone a repository with the following Git syntax:");
         msg.append(nl);
         msg.append(nl);
         msg.append("  git clone ");
         msg.append(formatUrl(user.username));
         msg.append("\r\n");
         msg.append("\r\n");
         msg.append("   git clone ");
         msg.append(formatUrl(hostname, port, user.username));
         msg.append(nl);
         msg.append(nl);
         msg.append(b2);
         msg.append(nl);
         msg.append(nl);
         if (client.getKey() == null) {
            // user has authenticated with a password
            // display add public key instructions
            msg.append(" You may upload an SSH public key with the following syntax:");
            msg.append(nl);
            msg.append(nl);
            msg.append(String.format("   cat ~/.ssh/id_rsa.pub | ssh -l %s -p %d %s keys add", user.username, port, hostname));
            msg.append(nl);
            msg.append(nl);
            msg.append(b2);
            msg.append(nl);
            msg.append(nl);
         }
         // display the core commands
         SshCommandFactory cmdFactory = (SshCommandFactory) session.getFactoryManager().getCommandFactory();
         DispatchCommand root = cmdFactory.createRootDispatcher(client, "");
         String usage = root.usage().replace("\n", nl);
         msg.append(usage);
         return msg.toString();
      }
      private String formatUrl(String username) {
      private String getHostname() {
         String host = null;
         String url = settings.getString(Keys.web.canonicalUrl, "https://localhost:8443");
         if (url != null) {
@@ -141,15 +196,22 @@
         if (StringUtils.isEmpty(host)) {
            host = SystemReader.getInstance().getHostname();
         }
         return host;
      }
         int port = settings.getInteger(Keys.git.sshPort, 0);
         if (port == 22) {
      private String formatUrl(String hostname, int port, String username) {
         int displayPort = settings.getInteger(Keys.git.sshAdvertisedPort, port);
         String displayHostname = settings.getString(Keys.git.sshAdvertisedHost, "");
         if(displayHostname.isEmpty()) {
            displayHostname = hostname;
         }
         if (displayPort == 22) {
            // standard port
            return MessageFormat.format("{0}@{1}/REPOSITORY.git", username, host);
            return MessageFormat.format("{0}@{1}/REPOSITORY.git", username, displayHostname);
         } else {
            // non-standard port
            return MessageFormat.format("ssh://{0}@{1}:{2,number,0}/REPOSITORY.git",
                  username, host, port);
                  username, displayHostname, displayPort);
         }
      }
   }