package com.dgex.offspring.application.dialogs; import java.util.List; import nxt.Account; import nxt.Token; import nxt.util.Convert; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.TitleAreaDialog; import org.eclipse.jface.resource.JFaceResources; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import com.dgex.offspring.application.utils.Layouts; import com.dgex.offspring.config.Formatter; import com.dgex.offspring.messages.Messages; import com.dgex.offspring.nxtCore.service.INxtService; import com.dgex.offspring.user.service.IUser; import com.dgex.offspring.user.service.IUserService; public class AuthTokenDialog extends TitleAreaDialog { private IUser activeUser = null; private final INxtService nxt; private final IUserService userService; private int defaultHeight; private Combo comboSender; private Text textWebsite; private Text textToken; private Text textMyToken; private Text textMyWebsite; private Label labelStatus; private Text textAccount; public AuthTokenDialog(Shell shell, INxtService nxt, IUserService userService) { super(shell); this.nxt = nxt; this.userService = userService; } @Override public void create() { super.create(); setTitle(Messages.AuthTokenDialog_title); setMessage(Messages.AuthTokenDialog_message_default); } @Override protected void createButtonsForButtonBar(Composite parent) { createButton(parent, IDialogConstants.OK_ID, IDialogConstants.CLOSE_LABEL, true); } @Override protected Control createDialogArea(Composite parent) { Composite container = (Composite) super.createDialogArea(parent); GridData data = Layouts.Grid.fill(false, false); data.widthHint = 300; Composite mainContainer = new Composite(container, SWT.NONE); mainContainer.setLayout(Layouts.Grid.create(1, 0, 0, 0, 0, 0, 3)); mainContainer.setLayoutData(data); Group createTokenGroup = new Group(mainContainer, SWT.NONE); createTokenGroup.setText(Messages.AuthTokenDialog_label_generate_tokens); createTokenGroup.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true, false)); createTokenGroup.setLayout(Layouts.Grid.create(1, 5, 5, 5, 5, 0, 3)); Group verifyTokenGroup = new Group(mainContainer, SWT.NONE); verifyTokenGroup.setText(Messages.AuthTokenDialog_label_decode_tokens); verifyTokenGroup.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, true, false)); verifyTokenGroup.setLayout(Layouts.Grid.create(1, 5, 5, 5, 5, 0, 3)); /* Create token group */ comboSender = new Combo(createTokenGroup, SWT.READ_ONLY); comboSender.setLayoutData(Layouts.Grid.fill(true, false)); textMyWebsite = new Text(createTokenGroup, SWT.BORDER); textMyWebsite.setLayoutData(Layouts.Grid.fill(true, false)); textMyWebsite.setMessage(Messages.AuthTokenDialog_label_website); defaultHeight = textMyWebsite.computeSize(SWT.DEFAULT, SWT.DEFAULT).y; data = Layouts.Grid.fill(true, false); data.heightHint = 3 * defaultHeight; textMyToken = new Text(createTokenGroup, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL); textMyToken.setLayoutData(data); textMyToken.setEditable(false); /* Verify token group */ // textExpectedAccount = new Text(verifyTokenGroup, SWT.BORDER); // textExpectedAccount.setLayoutData(Layouts.Grid.fill(true, false)); // textExpectedAccount.setMessage("expected account"); textWebsite = new Text(verifyTokenGroup, SWT.BORDER); textWebsite.setLayoutData(Layouts.Grid.fill(true, false)); textWebsite.setMessage(Messages.AuthTokenDialog_label_website); data = Layouts.Grid.fill(true, false); data.heightHint = 3 * defaultHeight; textToken = new Text(verifyTokenGroup, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL); textToken.setLayoutData(data); textToken.setMessage(Messages.AuthTokenDialog_label_token); textAccount = new Text(verifyTokenGroup, SWT.BORDER); textAccount.setLayoutData(Layouts.Grid.fill(true, false)); textAccount.setMessage(Messages.AuthTokenDialog_label_actual_account); textAccount.setEditable(false); /* Main status label */ labelStatus = new Label(mainContainer, SWT.NONE); labelStatus.setFont(JFaceResources.getFontRegistry().getBold("")); //$NON-NLS-1$ labelStatus.setLayoutData(Layouts.Grid.fill(true, false)); labelStatus.setText(" "); //$NON-NLS-1$ setupAccountCombo(); setupControls(); return container; } private void setStatus(String status) { if (labelStatus != null && !labelStatus.isDisposed()) labelStatus.setText(status); } /* Populate the sender combo box */ private void setupAccountCombo() { if (userService.getUsers().size() == 0) return; int selected_index = 0; List<IUser> users = userService.getUsers(); for (int i = 0; i < users.size(); i++) { IUser user = users.get(i); comboSender.add(user.getAccount().getStringId() + " " + Long.toString(user.getAccount().getBalance()) + " " + user.getName()); if (user.equals(userService.getActiveUser())) { selected_index = i; activeUser = user; } } // there are no logged in users if (comboSender.getItemCount() == 0) { comboSender.add(Messages.AuthTokenDialog_label_unlock_first); comboSender.select(comboSender.getItemCount() - 1); } // there is no activeUser (not sure if possible) else if (activeUser == null) { comboSender.add(""); //$NON-NLS-1$ comboSender.select(comboSender.getItemCount() - 1); } else { comboSender.select(selected_index); } if (comboSender.getItemCount() > 0) { comboSender.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { if (comboSender.getSelectionIndex() < userService.getUsers().size()) { activeUser = userService.getUsers().get( comboSender.getSelectionIndex()); } else { activeUser = null; } } }); } } private void setupControls() { textMyWebsite.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { textMyToken.setText(nxt.generateAuthorizationToken(activeUser .getAccount().getPrivateKey(), textMyWebsite.getText())); } }); ModifyListener listener = new ModifyListener() { @Override public void modifyText(ModifyEvent e) { Token token = nxt.getToken(textWebsite.getText(), textToken.getText()); String account = Convert.toUnsignedLong(Account.getId(token .getPublicKey())); textAccount.setText(account); if (token.isValid()) setStatus(Messages.AuthTokenDialog_status_token_valid + Formatter.formatTimestampLocale(Integer.valueOf( token.getTimestamp()).longValue())); else setStatus(Messages.AuthTokenDialog_status_token_not_valid); } }; textWebsite.addModifyListener(listener); textToken.addModifyListener(listener); } }