Beispiel #1
0
  /**
   * Get the applicable Connection type for the given CVSRoot object. At present this can only be
   * either pserver or ext using internal ssh.
   *
   * @return a Connection object for the cvsroot or null if invalid
   */
  private static Connection getConnection(CVSRoot cvsRoot) {
    SocketFactory socketFactory = SocketFactory.getDefault();

    if (CVSRoot.METHOD_EXT.equals(cvsRoot.getMethod())) {
      // set port to 22 unless it is already set to something other than 0
      int port = 22;

      if (cvsRoot.getPort() != 0) {
        port = cvsRoot.getPort();
      }

      GSSHConnection sshConnection =
          new GSSHConnection(
              socketFactory,
              cvsRoot.getHostName(),
              port,
              cvsRoot.getUserName(),
              cvsRoot.getPassword());
      sshConnection.setRepository(cvsRoot.getRepository());

      return sshConnection;
    } else if (CVSRoot.METHOD_PSERVER.equals(cvsRoot.getMethod())) {
      PServerConnection pConnection = new PServerConnection(cvsRoot, socketFactory);

      // pServerConnection.setRepository(cvsRoot.getRepository());
      return pConnection;
    }

    return null;
  }
  /**
   * Sets up connection to a given CVS root including any proxies on route.
   *
   * @param cvsRoot root to connect to
   * @return Connection object ready to connect to the given CVS root
   * @throws IllegalArgumentException if the 'method' part of the supplied CVS Root is not
   *     recognized
   */
  public static Connection setupConnection(CVSRoot cvsRoot) throws IllegalArgumentException {

    // for testing porposes allow to use dynamically generated port numbers
    String t9yRoot = System.getProperty("netbeans.t9y.cvs.connection.CVSROOT"); // NOI18N
    CVSRoot patchedCvsRoot = cvsRoot;
    if (t9yRoot != null && t9yRoot.length() > 0) {
      int idx = t9yRoot.indexOf(',');
      if (idx != -1) {
        System.setProperty(
            "netbeans.t9y.cvs.connection.CVSROOT", t9yRoot.substring(idx + 1)); // NOI18N
        t9yRoot = t9yRoot.substring(0, idx);
      }
      try {
        patchedCvsRoot = CVSRoot.parse(t9yRoot);
        assert patchedCvsRoot.getRepository().equals(cvsRoot.getRepository());
        assert patchedCvsRoot.getHostName() == cvsRoot.getHostName()
            || patchedCvsRoot.getHostName().equals(cvsRoot.getHostName());
        ErrorManager.getDefault()
            .log(
                ErrorManager.INFORMATIONAL,
                "CVS.ClientRuntime: using patched CVSROOT " + t9yRoot); // NOI18N
      } catch (IllegalArgumentException ex) {
        ErrorManager.getDefault().annotate(ex, "While parsing: " + t9yRoot); // NOI18N
        ErrorManager.getDefault().notify(ex);
      }
    }

    if (cvsRoot.isLocal()) {
      LocalConnection con = new LocalConnection();
      con.setRepository(cvsRoot.getRepository());
      return con;
    }

    ProxySocketFactory factory = ProxySocketFactory.getDefault();

    String method = cvsRoot.getMethod();
    if (CVSRoot.METHOD_PSERVER.equals(method)) {
      PServerConnection con = new PServerConnection(patchedCvsRoot, factory);
      char[] passwordChars =
          KeyringSupport.read(CvsModuleConfig.PREFIX_KEYRING_KEY, cvsRoot.toString());
      String password;
      if (passwordChars != null) {
        password = new String(passwordChars);
      } else {
        password = PasswordsFile.findPassword(cvsRoot.toString());
        if (password != null) {
          KeyringSupport.save(
              CvsModuleConfig.PREFIX_KEYRING_KEY, cvsRoot.toString(), password.toCharArray(), null);
        }
      }
      con.setEncodedPassword(password);
      return con;
    } else if (CVSRoot.METHOD_EXT.equals(method)) {
      CvsModuleConfig.ExtSettings extSettings =
          CvsModuleConfig.getDefault().getExtSettingsFor(cvsRoot);
      String userName = cvsRoot.getUserName();
      String host = cvsRoot.getHostName();
      if (extSettings.extUseInternalSsh) {
        int port = patchedCvsRoot.getPort();
        port = port == 0 ? 22 : port; // default port
        String password = new String(extSettings.extPassword);
        if (password == null) {
          password = "******"; // NOI18N    user will be asked later on
        }
        SSHConnection sshConnection = new SSHConnection(factory, host, port, userName, password);
        sshConnection.setRepository(cvsRoot.getRepository());
        return sshConnection;
      } else {
        // What do we want to achieve here?
        // It's possible to mimics ordinary cvs or cvsnt behaviour:
        // Ordinary cvs style (CVS_RSH):
        //   command += " $hostname [-l$username] $CVS_SERVER"
        // cvsnt style (CVS_EXT and CVS_RSH):
        //   command += " cvs server"
        // I prefer the cvs style, see issue #62683 for details.

        String command = extSettings.extCommand;
        String cvs_server = System.getenv("CVS_SERVER");
        cvs_server = cvs_server != null ? cvs_server + " server" : "cvs server"; // NOI18N
        String userOption = ""; // NOI18N
        if (userName != null) {
          userOption = " -l " + userName; // NOI18N
        }
        command += " " + host + userOption + " " + cvs_server; // NOI18N
        ExtConnection connection = new ExtConnection(command);
        connection.setRepository(cvsRoot.getRepository());
        return connection;
      }
    }

    throw new IllegalArgumentException("Unrecognized CVS Root: " + cvsRoot); // NOI18N
  }