blob: 5836763ee4074b5caf90d68ab7263c617a26180a [file] [log] [blame]
// Copyright (C) 2016 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.Gerrit;
import com.google.gerrit.client.info.GeneralPreferences;
import com.google.gerrit.client.info.OAuthTokenInfo;
import com.google.gerrit.client.rpc.GerritCallback;
import com.google.gerrit.client.rpc.ScreenLoadCallback;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.LocaleInfo;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwtexpui.clippy.client.CopyableLabel;
import java.util.Date;
public class MyOAuthTokenScreen extends SettingsScreen {
private CopyableLabel tokenLabel;
private Label expiresLabel;
private Label expiredNote;
private CopyableLabel netrcValue;
private CopyableLabel cookieValue;
private FlowPanel flow;
private Grid grid;
@Override
protected void onInitUI() {
super.onInitUI();
tokenLabel = new CopyableLabel("");
tokenLabel.addStyleName(Gerrit.RESOURCES.css().oauthToken());
expiresLabel = new Label("");
expiresLabel.addStyleName(Gerrit.RESOURCES.css().oauthExpires());
grid = new Grid(2, 2);
grid.setStyleName(Gerrit.RESOURCES.css().infoBlock());
grid.addStyleName(Gerrit.RESOURCES.css().oauthInfoBlock());
add(grid);
expiredNote = new Label(Util.C.labelOAuthExpired());
expiredNote.setVisible(false);
add(expiredNote);
row(grid, 0, Util.C.labelOAuthToken(), tokenLabel);
row(grid, 1, Util.C.labelOAuthExpires(), expiresLabel);
CellFormatter fmt = grid.getCellFormatter();
fmt.addStyleName(0, 0, Gerrit.RESOURCES.css().topmost());
fmt.addStyleName(0, 1, Gerrit.RESOURCES.css().topmost());
fmt.addStyleName(1, 0, Gerrit.RESOURCES.css().bottomheader());
flow = new FlowPanel();
flow.setStyleName(Gerrit.RESOURCES.css().oauthPanel());
add(flow);
Label netrcLabel = new Label(Util.C.labelOAuthNetRCEntry());
netrcLabel.setStyleName(Gerrit.RESOURCES.css().oauthPanelNetRCHeading());
flow.add(netrcLabel);
netrcValue = new CopyableLabel("");
netrcValue.setStyleName(Gerrit.RESOURCES.css().oauthPanelNetRCEntry());
flow.add(netrcValue);
Label cookieLabel = new Label(Util.C.labelOAuthGitCookie());
cookieLabel.setStyleName(Gerrit.RESOURCES.css().oauthPanelCookieHeading());
flow.add(cookieLabel);
cookieValue = new CopyableLabel("");
cookieValue.setStyleName(Gerrit.RESOURCES.css().oauthPanelCookieEntry());
flow.add(cookieValue);
}
private void row(Grid grid, int row, String name, Widget field) {
final CellFormatter fmt = grid.getCellFormatter();
if (LocaleInfo.getCurrentLocale().isRTL()) {
grid.setText(row, 1, name);
grid.setWidget(row, 0, field);
fmt.addStyleName(row, 1, Gerrit.RESOURCES.css().header());
} else {
grid.setText(row, 0, name);
grid.setWidget(row, 1, field);
fmt.addStyleName(row, 0, Gerrit.RESOURCES.css().header());
}
}
@Override
protected void onLoad() {
super.onLoad();
AccountApi.self()
.view("preferences")
.get(
new ScreenLoadCallback<GeneralPreferences>(this) {
@Override
protected void preDisplay(GeneralPreferences prefs) {
display(prefs);
}
});
}
private void display(final GeneralPreferences prefs) {
AccountApi.self()
.view("oauthtoken")
.get(
new GerritCallback<OAuthTokenInfo>() {
@Override
public void onSuccess(OAuthTokenInfo tokenInfo) {
tokenLabel.setText(tokenInfo.accessToken());
expiresLabel.setText(getExpiresAt(tokenInfo, prefs));
netrcValue.setText(getNetRC(tokenInfo));
cookieValue.setText(getCookie(tokenInfo));
flow.setVisible(true);
expiredNote.setVisible(false);
}
@Override
public void onFailure(Throwable caught) {
if (isNoSuchEntity(caught) || isSigninFailure(caught)) {
tokenLabel.setText("");
expiresLabel.setText("");
netrcValue.setText("");
cookieValue.setText("");
flow.setVisible(false);
expiredNote.setVisible(true);
} else {
showFailure(caught);
}
}
});
}
private static long getExpiresAt(OAuthTokenInfo tokenInfo) {
if (tokenInfo.expiresAt() == null) {
return Long.MAX_VALUE;
}
long expiresAt;
try {
expiresAt = Long.parseLong(tokenInfo.expiresAt());
} catch (NumberFormatException e) {
return Long.MAX_VALUE;
}
return expiresAt;
}
private static long getExpiresAtSeconds(OAuthTokenInfo tokenInfo) {
return getExpiresAt(tokenInfo) / 1000L;
}
private static String getExpiresAt(OAuthTokenInfo tokenInfo, GeneralPreferences prefs) {
long expiresAt = getExpiresAt(tokenInfo);
if (expiresAt == Long.MAX_VALUE) {
return "";
}
String dateFormat = prefs.dateFormat().getLongFormat();
String timeFormat = prefs.timeFormat().getFormat();
DateTimeFormat formatter = DateTimeFormat.getFormat(dateFormat + " " + timeFormat);
return formatter.format(new Date(expiresAt));
}
private static String getNetRC(OAuthTokenInfo accessTokenInfo) {
StringBuilder sb = new StringBuilder();
sb.append("machine ");
sb.append(accessTokenInfo.resourceHost());
sb.append(" login ");
sb.append(accessTokenInfo.username());
sb.append(" password ");
sb.append(accessTokenInfo.accessToken());
return sb.toString();
}
private static String getCookie(OAuthTokenInfo accessTokenInfo) {
StringBuilder sb = new StringBuilder();
sb.append(accessTokenInfo.resourceHost());
sb.append("\tFALSE\t/\tTRUE\t");
sb.append(getExpiresAtSeconds(accessTokenInfo));
sb.append("\tgit-");
sb.append(accessTokenInfo.username());
sb.append('\t');
sb.append(accessTokenInfo.accessToken());
if (accessTokenInfo.providerId() != null) {
sb.append('@').append(accessTokenInfo.providerId());
}
return sb.toString();
}
}