diff options
author | Shawn O. Pearce <sop@google.com> | 2009-02-16 14:17:00 -0800 |
---|---|---|
committer | Shawn O. Pearce <sop@google.com> | 2009-02-16 14:17:00 -0800 |
commit | dc894c71b256e44f7c8e9fd1115646f0ccfa156f (patch) | |
tree | ec27c207932c335a82f2d53984473fb484601ca8 | |
parent | ffb4201fead519a6925d634c5e94021ac8dff682 (diff) |
Use gerrit-keyapplet to help users load their SSH public keys
This utility applet helps users navigate ~/.ssh and load an
SSH 2 style public key file into the text box, so they can
submit the key to Gerrit.
Signed-off-by: Shawn O. Pearce <sop@google.com>
4 files changed, 132 insertions, 0 deletions
@@ -338,6 +338,13 @@ limitations under the License. <outputDirectory>${project.build.directory}/executablewar</outputDirectory> <includes>**/*.class</includes> </artifactItem> + <artifactItem> + <groupId>gerrit</groupId> + <artifactId>gerrit-keyapplet</artifactId> + <overWrite>true</overWrite> + <outputDirectory>${project.build.directory}/gerrit-keyapplet</outputDirectory> + <includes>**/*</includes> + </artifactItem> </artifactItems> </configuration> </execution> @@ -371,6 +378,7 @@ limitations under the License. <configuration> <tasks> <property name="d" location="${basedir}/target/${project.name}-${project.version}"/> + <property name="keyapplet" location="${basedir}/target/gerrit-keyapplet"/> <copy todir="${d}"> <fileset dir="${basedir}/target/executablewar" includes="**/*"/> @@ -399,6 +407,12 @@ limitations under the License. <outputmapper type="glob" from="*" to="${d}/*.gz"/> </redirector> </apply> + + <zip + destfile="${d}/gerrit-keyapplet.cache.jar" + compress="true"> + <fileset dir="${keyapplet}" includes="**/*"/> + </zip> </tasks> </configuration> <goals> @@ -433,6 +447,13 @@ limitations under the License. </dependency> <dependency> + <groupId>gerrit</groupId> + <artifactId>gerrit-keyapplet</artifactId> + <version>1.0</version> + <scope>test</scope> + </dependency> + + <dependency> <groupId>com.dyuproject</groupId> <artifactId>dyuproject-openid</artifactId> <version>1.1.1</version> diff --git a/src/main/java/com/google/gerrit/client/account/AccountConstants.java b/src/main/java/com/google/gerrit/client/account/AccountConstants.java index 70300b89c7..49a5318b85 100644 --- a/src/main/java/com/google/gerrit/client/account/AccountConstants.java +++ b/src/main/java/com/google/gerrit/client/account/AccountConstants.java @@ -35,6 +35,7 @@ public interface AccountConstants extends Constants { String buttonDeleteSshKey(); String buttonClearSshKeyInput(); + String buttonOpenSshKey(); String buttonAddSshKey(); String sshKeyInvalid(); @@ -46,6 +47,7 @@ public interface AccountConstants extends Constants { String addSshKeyPanelHeader(); String addSshKeyHelp(); + String sshJavaAppletNotAvailable(); String invalidSshKeyError(); String webIdLastUsed(); diff --git a/src/main/java/com/google/gerrit/client/account/AccountConstants.properties b/src/main/java/com/google/gerrit/client/account/AccountConstants.properties index b3d8bde954..663e326f31 100644 --- a/src/main/java/com/google/gerrit/client/account/AccountConstants.properties +++ b/src/main/java/com/google/gerrit/client/account/AccountConstants.properties @@ -16,6 +16,7 @@ tabAgreements = Agreements buttonDeleteSshKey = Delete buttonClearSshKeyInput = Clear +buttonOpenSshKey = Open Key ... buttonAddSshKey = Add sshKeyInvalid = Invalid Key @@ -33,6 +34,7 @@ buttonLinkIdentity = Link Another Identity addSshKeyPanelHeader = Add SSH Public Key addSshKeyHelp = (<a href="http://github.com/guides/providing-your-ssh-key" target="_blank">GitHub's Guide to SSH Keys</a>) invalidSshKeyError = Invalid SSH Key +sshJavaAppletNotAvailable = Open Key Unavailable: Java not enabled watchedProjects = Watched Projects buttonWatchProject = Watch diff --git a/src/main/java/com/google/gerrit/client/account/SshKeyPanel.java b/src/main/java/com/google/gerrit/client/account/SshKeyPanel.java index ae520a2baa..1aacd241fc 100644 --- a/src/main/java/com/google/gerrit/client/account/SshKeyPanel.java +++ b/src/main/java/com/google/gerrit/client/account/SshKeyPanel.java @@ -16,17 +16,24 @@ package com.google.gerrit.client.account; import com.google.gerrit.client.ErrorDialog; import com.google.gerrit.client.FormatUtil; +import com.google.gerrit.client.Gerrit; import com.google.gerrit.client.reviewdb.AccountSshKey; import com.google.gerrit.client.rpc.GerritCallback; import com.google.gerrit.client.rpc.InvalidSshKeyException; import com.google.gerrit.client.ui.FancyFlexTable; import com.google.gerrit.client.ui.SmallHeading; +import com.google.gwt.core.client.GWT; +import com.google.gwt.dom.client.Element; +import com.google.gwt.user.client.Command; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.DeferredCommand; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.CheckBox; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.HTML; +import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.SourcesTableEvents; import com.google.gwt.user.client.ui.TableListener; import com.google.gwt.user.client.ui.TextArea; @@ -40,10 +47,16 @@ import java.util.HashSet; import java.util.List; class SshKeyPanel extends Composite { + private static boolean loadedApplet; + private static Element applet; + private static String appletErrorInvalidKey; + private static String appletErrorSecurity; + private SshKeyTable keys; private Button clearNew; private Button addNew; + private Button browse; private TextArea addTxt; private Button delSel; @@ -87,6 +100,15 @@ class SshKeyPanel extends Composite { }); buttons.add(clearNew); + browse = new Button(Util.C.buttonOpenSshKey()); + browse.addClickListener(new ClickListener() { + public void onClick(final Widget sender) { + doBrowse(); + } + }); + browse.setVisible(GWT.isScript() && (!loadedApplet || applet != null)); + buttons.add(browse); + addNew = new Button(Util.C.buttonAddSshKey()); addNew.addClickListener(new ClickListener() { public void onClick(final Widget sender) { @@ -100,6 +122,91 @@ class SshKeyPanel extends Composite { initWidget(body); } + void doBrowse() { + browse.setEnabled(false); + if (!loadedApplet) { + applet = DOM.createElement("applet"); + applet.setAttribute("code", + "com.google.gerrit.keyapplet.ReadPublicKey.class"); + applet.setAttribute("archive", GWT.getModuleBaseURL() + + "gerrit-keyapplet.cache.jar?v=" + Gerrit.getVersion()); + applet.setAttribute("mayscript", "true"); + applet.setAttribute("width", "0"); + applet.setAttribute("height", "0"); + RootPanel.getBodyElement().appendChild(applet); + loadedApplet = true; + + // We have to defer to allow the event loop time to setup that + // new applet tag we just created above, and actually load the + // applet into the runtime. + // + DeferredCommand.addCommand(new Command() { + public void execute() { + doBrowse(); + } + }); + return; + } + if (applet == null) { + // If the applet element is null, the applet was determined + // to have failed to load, and we are dead. Hide the button. + // + noBrowse(); + return; + } + + String txt; + try { + txt = openPublicKey(applet); + } catch (RuntimeException re) { + // If this call fails, the applet is dead. It is most likely + // not loading due to Java support being disabled. + // + noBrowse(); + return; + } + if (txt == null) { + txt = ""; + } + + browse.setEnabled(true); + + if (appletErrorInvalidKey == null) { + appletErrorInvalidKey = getErrorInvalidKey(applet); + appletErrorSecurity = getErrorSecurity(applet); + } + + if (appletErrorInvalidKey.equals(txt)) { + new ErrorDialog(Util.C.invalidSshKeyError()).center(); + return; + } + if (appletErrorSecurity.equals(txt)) { + new ErrorDialog(Util.C.invalidSshKeyError()).center(); + return; + } + + addTxt.setText(txt); + addNew.setFocus(true); + } + + private void noBrowse() { + if (applet != null) { + applet.getParentElement().removeChild(applet); + applet = null; + } + browse.setVisible(false); + new ErrorDialog(Util.C.sshJavaAppletNotAvailable()).center(); + } + + private static native String openPublicKey(Element keyapp) + /*-{ var r = keyapp.openPublicKey(); return r == null ? null : ''+r; }-*/; + + private static native String getErrorInvalidKey(Element keyapp) + /*-{ return ''+keyapp.getErrorInvalidKey(); }-*/; + + private static native String getErrorSecurity(Element keyapp) + /*-{ return ''+keyapp.getErrorSecurity(); }-*/; + void doAddNew() { final String txt = addTxt.getText(); if (txt != null && txt.length() > 0) { |