diff options
Diffstat (limited to 'gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ExternalIdPanel.java')
-rw-r--r-- | gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ExternalIdPanel.java | 243 |
1 files changed, 243 insertions, 0 deletions
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ExternalIdPanel.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ExternalIdPanel.java new file mode 100644 index 0000000000..fc3d9443ef --- /dev/null +++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/account/ExternalIdPanel.java @@ -0,0 +1,243 @@ +// Copyright (C) 2008 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.account; + +import com.google.gerrit.client.FormatUtil; +import com.google.gerrit.client.Gerrit; +import com.google.gerrit.client.auth.openid.OpenIdSignInDialog; +import com.google.gerrit.client.auth.openid.OpenIdUtil; +import com.google.gerrit.client.rpc.GerritCallback; +import com.google.gerrit.client.ui.FancyFlexTable; +import com.google.gerrit.common.auth.SignInMode; +import com.google.gerrit.common.auth.openid.OpenIdUrls; +import com.google.gerrit.reviewdb.AccountExternalId; +import com.google.gwt.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.user.client.ui.Button; +import com.google.gwt.user.client.ui.CheckBox; +import com.google.gwt.user.client.ui.Composite; +import com.google.gwt.user.client.ui.FlowPanel; +import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter; + +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +class ExternalIdPanel extends Composite { + private IdTable identites; + private Button deleteIdentity; + + ExternalIdPanel() { + final FlowPanel body = new FlowPanel(); + + identites = new IdTable(); + body.add(identites); + + deleteIdentity = new Button(Util.C.buttonDeleteIdentity()); + deleteIdentity.addClickHandler(new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + identites.deleteChecked(); + } + }); + body.add(deleteIdentity); + + switch (Gerrit.getConfig().getAuthType()) { + case OPENID: { + final Button linkIdentity = new Button(Util.C.buttonLinkIdentity()); + linkIdentity.addClickHandler(new ClickHandler() { + @Override + public void onClick(final ClickEvent event) { + new OpenIdSignInDialog(SignInMode.LINK_IDENTIY, null).center(); + } + }); + body.add(linkIdentity); + break; + } + } + + initWidget(body); + } + + @Override + protected void onLoad() { + super.onLoad(); + refresh(); + } + + private void refresh() { + Util.ACCOUNT_SEC + .myExternalIds(new GerritCallback<List<AccountExternalId>>() { + public void onSuccess(final List<AccountExternalId> result) { + identites.display(result); + } + }); + } + + private class IdTable extends FancyFlexTable<AccountExternalId> { + IdTable() { + table.setWidth(""); + table.setText(0, 2, Util.C.webIdLastUsed()); + table.setText(0, 3, Util.C.webIdStatus()); + table.setText(0, 4, Util.C.webIdEmail()); + table.setText(0, 5, Util.C.webIdIdentity()); + + final FlexCellFormatter fmt = table.getFlexCellFormatter(); + fmt.addStyleName(0, 1, S_ICON_HEADER); + fmt.addStyleName(0, 2, S_DATA_HEADER); + fmt.addStyleName(0, 3, S_DATA_HEADER); + fmt.addStyleName(0, 4, S_DATA_HEADER); + fmt.addStyleName(0, 5, S_DATA_HEADER); + } + + void deleteChecked() { + final HashSet<AccountExternalId.Key> keys = + new HashSet<AccountExternalId.Key>(); + for (int row = 1; row < table.getRowCount(); row++) { + final AccountExternalId k = getRowItem(row); + if (k == null) { + continue; + } + final CheckBox cb = (CheckBox) table.getWidget(row, 1); + if (cb == null) { + continue; + } + if (cb.getValue()) { + keys.add(k.getKey()); + } + } + if (!keys.isEmpty()) { + deleteIdentity.setEnabled(false); + Util.ACCOUNT_SEC.deleteExternalIds(keys, + new GerritCallback<Set<AccountExternalId.Key>>() { + public void onSuccess(final Set<AccountExternalId.Key> removed) { + deleteIdentity.setEnabled(true); + for (int row = 1; row < table.getRowCount();) { + final AccountExternalId k = getRowItem(row); + if (k != null && removed.contains(k.getKey())) { + table.removeRow(row); + } else { + row++; + } + } + } + + @Override + public void onFailure(Throwable caught) { + deleteIdentity.setEnabled(true); + super.onFailure(caught); + } + }); + } + } + + void display(final List<AccountExternalId> result) { + Collections.sort(result, new Comparator<AccountExternalId>() { + @Override + public int compare(AccountExternalId a, AccountExternalId b) { + return emailOf(a).compareTo(emailOf(b)); + } + + private String emailOf(final AccountExternalId a) { + return a.getEmailAddress() != null ? a.getEmailAddress() : ""; + } + }); + + while (1 < table.getRowCount()) + table.removeRow(table.getRowCount() - 1); + + for (final AccountExternalId k : result) { + addOneId(k); + } + + final AccountExternalId mostRecent = AccountExternalId.mostRecent(result); + if (mostRecent != null) { + for (int row = 1; row < table.getRowCount(); row++) { + if (getRowItem(row) == mostRecent) { + // Remove the box from the most recent row, this prevents + // the user from trying to delete the identity they last used + // to login, possibly locking themselves out of the account. + // + table.setHTML(row, 1, " "); + break; + } + } + } + } + + void addOneId(final AccountExternalId k) { + final FlexCellFormatter fmt = table.getFlexCellFormatter(); + final int row = table.getRowCount(); + table.insertRow(row); + applyDataRowStyle(row); + + table.setWidget(row, 1, new CheckBox()); + if (k.getLastUsedOn() != null) { + table.setText(row, 2, FormatUtil.mediumFormat(k.getLastUsedOn())); + } else { + table.setText(row, 2, ""); + } + if (k.isTrusted()) { + table.setText(row, 3, ""); + } else { + table.setText(row, 3, Util.C.untrustedProvider()); + fmt.addStyleName(row, 3, "gerrit-Identity-UntrustedExternalId"); + } + if (k.getEmailAddress() != null && k.getEmailAddress().length() > 0) { + table.setText(row, 4, k.getEmailAddress()); + } else { + table.setText(row, 4, ""); + } + table.setText(row, 5, describe(k)); + + fmt.addStyleName(row, 1, S_ICON_CELL); + fmt.addStyleName(row, 2, S_DATA_CELL); + fmt.addStyleName(row, 3, S_DATA_CELL); + fmt.addStyleName(row, 3, "C_LAST_UPDATE"); + fmt.addStyleName(row, 4, S_DATA_CELL); + fmt.addStyleName(row, 5, S_DATA_CELL); + + setRowItem(row, k); + } + + private String describe(final AccountExternalId k) { + if (k.isScheme(AccountExternalId.SCHEME_GERRIT)) { + // A local user identity should just be itself. + // + return k.getSchemeRest(AccountExternalId.SCHEME_GERRIT); + + } else if (k.isScheme(AccountExternalId.SCHEME_MAILTO)) { + // Describe a mailto address as just its email address, which + // is already shown in the email address field. + // + return ""; + + } else if (k.isScheme(OpenIdUrls.URL_GOOGLE)) { + return OpenIdUtil.C.nameGoogle(); + + } else if (k.isScheme(OpenIdUrls.URL_YAHOO)) { + return OpenIdUtil.C.nameYahoo(); + + } else if (k.isScheme(AccountExternalId.LEGACY_GAE)) { + return OpenIdUtil.C.nameGoogle() + " (Imported from Google AppEngine)"; + + } else { + return k.getExternalId(); + } + } + } +} |