| | |
| | | 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()); |
| | | if (permission.atLeast(AccessPermission.PUSH) && !acceptPush(transport)) { |
| | | 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) && !acceptPush(Transport.SSH)) { |
| | | if (permission.atLeast(AccessPermission.PUSH) && !acceptsPush(Transport.SSH)) { |
| | | // downgrade the repo permission for this transport |
| | | // because it is not an acceptable PUSH transport |
| | | permission = AccessPermission.CLONE; |
| | |
| | | |
| | | // 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) && !acceptPush(Transport.GIT)) { |
| | | if (permission.atLeast(AccessPermission.PUSH) && !acceptsPush(Transport.GIT)) { |
| | | // downgrade the repo permission for this transport |
| | | // because it is not an acceptable PUSH transport |
| | | permission = AccessPermission.CLONE; |
| | |
| | | // 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 |
| | |
| | | |
| | | @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)) { |
| | |
| | | */ |
| | | @Override |
| | | public boolean isServingRepositories() { |
| | | return isServingHTTP() |
| | | return isServingHTTPS() |
| | | || isServingHTTP() |
| | | || isServingGIT() |
| | | || isServingSSH(); |
| | | } |
| | |
| | | */ |
| | | @Override |
| | | public boolean isServingHTTP() { |
| | | return settings.getBoolean(Keys.git.enableGitServlet, true); |
| | | return settings.getBoolean(Keys.git.enableGitServlet, true) |
| | | && ((gitblit.getStatus().isGO && settings.getInteger(Keys.server.httpPort, 0) > 0) |
| | | || !gitblit.getStatus().isGO); |
| | | } |
| | | |
| | | /* (non-Javadoc) |
| | | * @see com.gitblit.manager.IServicesManager#isServingHTTPS() |
| | | */ |
| | | @Override |
| | | public boolean isServingHTTPS() { |
| | | return settings.getBoolean(Keys.git.enableGitServlet, true) |
| | | && ((gitblit.getStatus().isGO && settings.getInteger(Keys.server.httpsPort, 0) > 0) |
| | | || !gitblit.getStatus().isGO); |
| | | } |
| | | |
| | | /* (non-Javadoc) |
| | |
| | | } |
| | | } |
| | | |
| | | protected boolean acceptPush(Transport byTransport) { |
| | | @Override |
| | | public boolean acceptsPush(Transport byTransport) { |
| | | if (byTransport == null) { |
| | | logger.info("Unknown transport, push rejected!"); |
| | | return false; |
| | |
| | | @Override |
| | | public void reschedule(FederationModel registration) { |
| | | // schedule the next pull |
| | | int mins = TimeUtils.convertFrequencyToMinutes(registration.frequency); |
| | | int mins = TimeUtils.convertFrequencyToMinutes(registration.frequency, 5); |
| | | registration.nextPull = new Date(System.currentTimeMillis() + (mins * 60 * 1000L)); |
| | | scheduledExecutor.schedule(new FederationPuller(registration), mins, TimeUnit.MINUTES); |
| | | logger.info(MessageFormat.format( |