Paul Martin
2016-04-16 eecaad8b8e2c447429c31a01d49260ddd6b4ee03
src/main/java/com/gitblit/manager/ServicesManager.java
@@ -162,22 +162,25 @@
      List<RepositoryUrl> list = new ArrayList<RepositoryUrl>();
      // http/https url
      if (settings.getBoolean(Keys.git.enableGitServlet, true)) {
      if (settings.getBoolean(Keys.git.enableGitServlet, true) &&
         settings.getBoolean(Keys.web.showHttpServletUrls, true)) {
         AccessPermission permission = user.getRepositoryPermission(repository).permission;
         if (permission.exceeds(AccessPermission.NONE)) {
            Transport transport = Transport.fromString(request.getScheme());
            String repoUrl = getRepositoryUrl(request, username, repository);
            Transport transport = Transport.fromUrl(repoUrl);
            if (permission.atLeast(AccessPermission.PUSH) && !acceptsPush(transport)) {
               // downgrade the repo permission for this transport
               // because it is not an acceptable PUSH transport
               permission = AccessPermission.CLONE;
            }
            list.add(new RepositoryUrl(getRepositoryUrl(request, username, repository), permission));
            list.add(new RepositoryUrl(repoUrl, permission));
         }
      }
      // ssh daemon url
      String sshDaemonUrl = getSshDaemonUrl(request, user, repository);
      if (!StringUtils.isEmpty(sshDaemonUrl)) {
      if (!StringUtils.isEmpty(sshDaemonUrl) &&
         settings.getBoolean(Keys.web.showSshDaemonUrls, true)) {
         AccessPermission permission = user.getRepositoryPermission(repository).permission;
         if (permission.exceeds(AccessPermission.NONE)) {
            if (permission.atLeast(AccessPermission.PUSH) && !acceptsPush(Transport.SSH)) {
@@ -192,7 +195,8 @@
      // git daemon url
      String gitDaemonUrl = getGitDaemonUrl(request, user, repository);
      if (!StringUtils.isEmpty(gitDaemonUrl)) {
      if (!StringUtils.isEmpty(gitDaemonUrl) &&
            settings.getBoolean(Keys.web.showGitDaemonUrls, true)) {
         AccessPermission permission = getGitDaemonAccessPermission(user, repository);
         if (permission.exceeds(AccessPermission.NONE)) {
            if (permission.atLeast(AccessPermission.PUSH) && !acceptsPush(Transport.GIT)) {
@@ -207,16 +211,35 @@
      // add all other urls
      // {0} = repository
      // {1} = username
      boolean advertisePermsForOther = settings.getBoolean(Keys.web.advertiseAccessPermissionForOtherUrls, false);
      for (String url : settings.getStrings(Keys.web.otherUrls)) {
         String externalUrl = null;
         if (url.contains("{1}")) {
            // external url requires username, only add url IF we have one
            if (!StringUtils.isEmpty(username)) {
               list.add(new RepositoryUrl(MessageFormat.format(url, repository.name, username), null));
            if (StringUtils.isEmpty(username)) {
               continue;
            } else {
               externalUrl = MessageFormat.format(url, repository.name, username);
            }
         } else {
            // external url does not require username
            list.add(new RepositoryUrl(MessageFormat.format(url, repository.name), null));
            // external url does not require username, just do repo name formatting
            externalUrl = MessageFormat.format(url, repository.name);
         }
         AccessPermission permission = null;
         if (advertisePermsForOther) {
            permission = user.getRepositoryPermission(repository).permission;
            if (permission.exceeds(AccessPermission.NONE)) {
               Transport transport = Transport.fromUrl(externalUrl);
               if (permission.atLeast(AccessPermission.PUSH) && !acceptsPush(transport)) {
                  // downgrade the repo permission for this transport
                  // because it is not an acceptable PUSH transport
                  permission = AccessPermission.CLONE;
               }
            }
         }
         list.add(new RepositoryUrl(externalUrl, permission));
      }
      // sort transports by highest permission and then by transport security
@@ -224,13 +247,13 @@
         @Override
         public int compare(RepositoryUrl o1, RepositoryUrl o2) {
            if (!o1.isExternal() && o2.isExternal()) {
               // prefer Gitblit over external
            if (o1.hasPermission() && !o2.hasPermission()) {
               // prefer known permission items over unknown
               return -1;
            } else if (o1.isExternal() && !o2.isExternal()) {
               // prefer Gitblit over external
            } else if (!o1.hasPermission() && o2.hasPermission()) {
               // prefer known permission items over unknown
               return 1;
            } else if (o1.isExternal() && o2.isExternal()) {
            } else if (!o1.hasPermission() && !o2.hasPermission()) {
               // sort by Transport ordinal
               return o1.transport.compareTo(o2.transport);
            } else if (o1.permission.exceeds(o2.permission)) {