// Copyright (C) 2010 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.gerrit.client.download; import com.google.gerrit.client.Gerrit; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences; import com.google.gerrit.reviewdb.client.AccountGeneralPreferences.DownloadScheme; import com.google.gerrit.reviewdb.client.AuthType; import com.google.gwt.aria.client.Roles; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.core.client.GWT; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Anchor; import com.google.gwt.user.client.ui.Widget; import com.google.gwtjsonrpc.common.AsyncCallback; import com.google.gwtjsonrpc.common.VoidResult; import java.util.ArrayList; import java.util.List; import java.util.Set; public class DownloadUrlLink extends Anchor implements ClickHandler { public static class DownloadRefUrlLink extends DownloadUrlLink { protected String projectName; protected String ref; protected DownloadRefUrlLink(DownloadScheme urlType, String text, String project, String ref) { super(urlType, text); this.projectName = project; this.ref = ref; } protected void appendRef(StringBuilder r) { if (ref != null) { r.append(" "); r.append(ref); } } } public static class AnonGitLink extends DownloadRefUrlLink { public AnonGitLink(String project, String ref) { super(DownloadScheme.ANON_GIT, Util.M.anonymousDownload("Git"), project, ref); } @Override public String getUrlData() { StringBuilder r = new StringBuilder(); r.append(Gerrit.getConfig().getGitDaemonUrl()); r.append(projectName); appendRef(r); return r.toString(); } } public static class AnonHttpLink extends DownloadRefUrlLink { public AnonHttpLink(String project, String ref) { super(DownloadScheme.ANON_HTTP, Util.M.anonymousDownload("HTTP"), project, ref); } @Override public String getUrlData() { StringBuilder r = new StringBuilder(); if (Gerrit.getConfig().getGitHttpUrl() != null) { r.append(Gerrit.getConfig().getGitHttpUrl()); } else { r.append(hostPageUrl); } r.append(projectName); appendRef(r); return r.toString(); } } public static class SshLink extends DownloadRefUrlLink { public SshLink(String project, String ref) { super(DownloadScheme.SSH, "SSH", project, ref); } @Override public String getUrlData() { String sshAddr = Gerrit.getConfig().getSshdAddress(); final StringBuilder r = new StringBuilder(); r.append("ssh://"); r.append(Gerrit.getUserAccount().getUserName()); r.append("@"); if (sshAddr.startsWith("*:") || "".equals(sshAddr)) { r.append(Window.Location.getHostName()); } if (sshAddr.startsWith("*")) { sshAddr = sshAddr.substring(1); } r.append(sshAddr); r.append("/"); r.append(projectName); appendRef(r); return r.toString(); } } public static class HttpLink extends DownloadRefUrlLink { protected boolean anonymous; public HttpLink(String project, String ref, boolean anonymous) { super(DownloadScheme.HTTP, "HTTP", project, ref); this.anonymous = anonymous; } @Override public String getUrlData() { final StringBuilder r = new StringBuilder(); if (Gerrit.getConfig().getGitHttpUrl() != null && (anonymous || siteReliesOnHttp())) { r.append(Gerrit.getConfig().getGitHttpUrl()); } else { String base = hostPageUrl; int p = base.indexOf("://"); int s = base.indexOf('/', p + 3); if (s < 0) { s = base.length(); } String host = base.substring(p + 3, s); if (host.contains("@")) { host = host.substring(host.indexOf('@') + 1); } r.append(base.substring(0, p + 3)); r.append(Gerrit.getUserAccount().getUserName()); r.append('@'); r.append(host); r.append(base.substring(s)); } r.append(projectName); appendRef(r); return r.toString(); } } public static boolean siteReliesOnHttp() { return Gerrit.getConfig().getGitHttpUrl() != null && Gerrit.getConfig().getAuthType() == AuthType.CUSTOM_EXTENSION && !Gerrit.getConfig().siteHasUsernames(); } public static List<DownloadUrlLink> createDownloadUrlLinks(String project, String ref, boolean allowAnonymous) { List<DownloadUrlLink> urls = new ArrayList<>(); Set<DownloadScheme> allowedSchemes = Gerrit.getConfig().getDownloadSchemes(); if (allowAnonymous && Gerrit.getConfig().getGitDaemonUrl() != null && (allowedSchemes.contains(DownloadScheme.ANON_GIT) || allowedSchemes.contains(DownloadScheme.DEFAULT_DOWNLOADS))) { urls.add(new DownloadUrlLink.AnonGitLink(project, ref)); } if (allowAnonymous && (allowedSchemes.contains(DownloadScheme.ANON_HTTP) || allowedSchemes.contains(DownloadScheme.DEFAULT_DOWNLOADS))) { urls.add(new DownloadUrlLink.AnonHttpLink(project, ref)); } if (Gerrit.getConfig().getSshdAddress() != null && hasUserName() && (allowedSchemes.contains(DownloadScheme.SSH) || allowedSchemes.contains(DownloadScheme.DEFAULT_DOWNLOADS))) { urls.add(new DownloadUrlLink.SshLink(project, ref)); } if ((hasUserName() || siteReliesOnHttp()) && (allowedSchemes.contains(DownloadScheme.HTTP) || allowedSchemes.contains(DownloadScheme.DEFAULT_DOWNLOADS))) { urls.add(new DownloadUrlLink.HttpLink(project, ref, allowAnonymous)); } return urls; } private static boolean hasUserName() { return Gerrit.isSignedIn() && Gerrit.getUserAccount().getUserName() != null && Gerrit.getUserAccount().getUserName().length() > 0; } protected DownloadScheme urlType; protected String urlData; protected String hostPageUrl = GWT.getHostPageBaseURL(); public DownloadUrlLink(DownloadScheme urlType, String text, String urlData) { this(text); this.urlType = urlType; this.urlData = urlData; } public DownloadUrlLink(DownloadScheme urlType, String text) { this(text); this.urlType = urlType; } public DownloadUrlLink(String text) { super(text); setStyleName(Gerrit.RESOURCES.css().downloadLink()); Roles.getTabRole().set(getElement()); addClickHandler(this); if (!hostPageUrl.endsWith("/")) { hostPageUrl += "/"; } } public String getUrlData() { return urlData; } @Override public void onClick(ClickEvent event) { event.preventDefault(); event.stopPropagation(); select(); if (Gerrit.isSignedIn()) { // If the user is signed-in, remember this choice for future panels. // AccountGeneralPreferences pref = Gerrit.getUserAccount().getGeneralPreferences(); pref.setDownloadUrl(urlType); com.google.gerrit.client.account.Util.ACCOUNT_SVC.changePreferences(pref, new AsyncCallback<VoidResult>() { @Override public void onFailure(Throwable caught) { } @Override public void onSuccess(VoidResult result) { } }); } } void select() { DownloadUrlPanel parent = (DownloadUrlPanel) getParent(); for (Widget w : parent) { if (w != this && w instanceof DownloadUrlLink) { w.removeStyleName(Gerrit.RESOURCES.css().downloadLink_Active()); } } parent.setCurrentUrl(this); addStyleName(Gerrit.RESOURCES.css().downloadLink_Active()); } }