diff options
author | Jakob Heher <jakob.heher@iaik.tugraz.at> | 2022-11-24 14:14:37 +0100 |
---|---|---|
committer | Jakob Heher <jakob.heher@iaik.tugraz.at> | 2022-11-24 14:14:37 +0100 |
commit | f39ab43fc0120b7fa97028d40acd7851de8d4a99 (patch) | |
tree | 335caaa8b701395bae64fbf67ca9afb1776ae658 /pdf-over-gui/src/main/java/at/asit/pdfover/gui | |
parent | a4dd755534013449be5573102114d8dcfccba159 (diff) | |
download | pdf-over-master.tar.gz pdf-over-master.tar.bz2 pdf-over-master.zip |
Diffstat (limited to 'pdf-over-gui/src/main/java/at/asit/pdfover/gui')
102 files changed, 0 insertions, 16883 deletions
diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/Main.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/Main.java deleted file mode 100644 index 77e71581..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/Main.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui; - -//Imports -import java.io.File; -import java.io.IOException; - -import javax.swing.JOptionPane; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.gui.workflow.StateMachine; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import iaik.security.provider.IAIK; - -/** - * Main entry point for production - */ -public class Main { - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(Main.class); -// private static URL url=null; - - /** - * @param args - * @throws IOException - */ - public static void main(String[] args) throws IOException { - try { - log.info("This is " + Constants.APP_NAME_VERSION + ", " + - "running on " + System.getProperty("os.arch") + " " + System.getProperty("os.name") + ", " + - "powered by "+ System.getProperty("java.vendor") + " Java " + System.getProperty("java.version") + "."); - File configDir = new File(Constants.CONFIG_DIRECTORY); - - if (!configDir.exists()) { - configDir.mkdir(); - } - - // force loading the IAIK JCE (cf. #95) - IAIK.addAsProvider(); - - // force keystore type (Adoptium JRE 17 still ships with JKS, cf. #95) - System.setProperty("javax.net.ssl.trustStoreType", "jks"); - - // disable display scaling for AWT components embedded in SWT (cf. #106) - System.setProperty("sun.java2d.uiScale", "1"); - - log.debug("Starting stateMachine ..."); - (new StateMachine(args)).start(); - log.debug("Ended stateMachine ..."); - } - catch (Throwable e) { - - log.error("Unhandled error", e); - - JOptionPane.showMessageDialog(null, - "Error occured " + e.getMessage(), - null, JOptionPane.ERROR_MESSAGE); - } - - // Workaround for remaining AWT-Shutdown thread on OSX - System.exit(0); - } - - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/MainWindow.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/MainWindow.java deleted file mode 100644 index a382bf4d..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/MainWindow.java +++ /dev/null @@ -1,408 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui; - -// Imports -import java.io.IOException; -import java.io.InputStream; -import java.util.EnumMap; -import java.util.Map; - -import at.asit.pdfover.commons.Constants; -import org.eclipse.swt.SWT; -import org.eclipse.swt.SWTError; -import org.eclipse.swt.custom.StackLayout; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.ShellAdapter; -import org.eclipse.swt.events.ShellEvent; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.FormAttachment; -import org.eclipse.swt.layout.FormData; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Monitor; -import org.eclipse.swt.widgets.Shell; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.composites.StateComposite; -import at.asit.pdfover.gui.controls.Dialog; -import at.asit.pdfover.gui.controls.Dialog.BUTTONS; -import at.asit.pdfover.gui.controls.Dialog.ICON; -import at.asit.pdfover.gui.controls.MainBarButton; -import at.asit.pdfover.gui.controls.MainBarEndButton; -import at.asit.pdfover.gui.controls.MainBarMiddleButton; -import at.asit.pdfover.gui.controls.MainBarRectangleButton; -import at.asit.pdfover.gui.controls.MainBarStartButton; -import at.asit.pdfover.gui.osx.CocoaUIEnhancer; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.workflow.StateMachine; -import at.asit.pdfover.gui.workflow.states.BKUSelectionState; -import at.asit.pdfover.gui.workflow.states.ConfigurationUIState; -import at.asit.pdfover.gui.workflow.states.OpenState; -import at.asit.pdfover.gui.workflow.states.PositioningState; - -/** - * The Main Window of PDF-Over 4 - */ -public class MainWindow { - - /** - * SLF4J Logger instance - **/ - static final Logger log = LoggerFactory.getLogger(MainWindow.class); - - private Shell shell; - private Composite mainbar; - private FormData mainBarFormData; - private Composite container; - private FormData containerFormData; - private StackLayout stack; - StateMachine stateMachine; - private MainBarButton btn_sign; - private MainBarButton btn_position; - private MainBarButton btn_open; - private MainBarButton btn_config; - - /** - * Main bar Buttons - */ - public enum Buttons { - /** the configuration button */ - CONFIG, - - /** the open button */ - OPEN, - - /** the position button */ - POSITION, - - /** the signature button */ - SIGN, - - /** the final button */ - FINAL - } - - private Map<Buttons, MainBarButton> buttonMap; - - private MainBarEndButton btn_end; - - /** - * Default constructor - * - * @param stateMachine - * The main workflow - */ - public MainWindow(StateMachine stateMachine) { - super(); - - this.stateMachine = stateMachine; - - this.buttonMap = new EnumMap<MainWindow.Buttons, MainBarButton>( - Buttons.class); - } - - /** - * Sets top level composite for stack layout - * - * @param ctrl - */ - public void setTopControl(Control ctrl) { - if(ctrl != null) - log.debug("Top control: " + ctrl.toString()); - this.stack.topControl = ctrl; - this.doLayout(); - } - - /** - * Layout the Main Window - */ - public void doLayout() { - Control ctrl = this.stack.topControl; - if (this.container.isDisposed()) { - //Note: if the conainter is disposed, we are finished here - return; - } - this.container.layout(true, true); - getShell().layout(true, true); - // Note: SWT only layouts children! No grandchildren! - if (ctrl instanceof StateComposite) { - if (!ctrl.isDisposed()) { - ((StateComposite) ctrl).reloadResources(); - ((StateComposite) ctrl).doLayout(); - } - } - } - - /** - * Gets the container composite - * - * @return the container composite - */ - public Composite getContainer() { - return this.container; - } - - /** - * Open the window. - * - */ - public void open() { - createContents(); - } - - /** - * Reload the localization - */ - public void reloadLocalization() { - SWTUtils.setLocalizedText(btn_config, "main.configuration"); - SWTUtils.setLocalizedToolTipText(btn_config, "main.configuration"); - SWTUtils.setLocalizedText(btn_open, "common.open"); - SWTUtils.setLocalizedToolTipText(btn_open, "common.open"); - - SWTUtils.setLocalizedText(btn_position, "main.position"); - SWTUtils.setLocalizedToolTipText(btn_position, "main.position"); - - SWTUtils.setLocalizedText(btn_sign, "main.signature"); - SWTUtils.setLocalizedToolTipText(btn_sign, "main.signature"); - - SWTUtils.setLocalizedText(btn_end, "main.done"); - SWTUtils.setLocalizedToolTipText(btn_end, "main.done"); - - Control ctrl = this.stack.topControl; - if (ctrl instanceof StateComposite) { - if (!ctrl.isDisposed()) { - ((StateComposite) ctrl).reloadResources(); - ((StateComposite) ctrl).doLayout(); - } - } - } - - /** - * Create contents of the window. - */ - protected void createContents() { - this.shell = new Shell(); - getShell().setSize(this.stateMachine.configProvider.getMainWindowSize()); - if (System.getProperty("os.name").toLowerCase().contains("mac")) { - if (System.getProperty("os.name").contains("OS X")) { - hookupOSXMenu(); - } - } - try { - Display display = Display.getCurrent(); - Monitor primary = display.getPrimaryMonitor(); - Rectangle bounds = primary.getBounds(); - Rectangle main = getShell().getBounds(); - getShell().setLocation( - bounds.x + (bounds.width - main.width) / 2, - bounds.y + (bounds.height - main.height) / 2); - } - catch (SWTError e) { - log.debug("Cannot get display", e); - } - Display.setAppVersion(Constants.APP_VERSION); - getShell().setText(Constants.APP_NAME); - - getShell().addShellListener(new ShellAdapter() { - @Override - public void shellClosed(ShellEvent e) { - log.debug("Closing main window"); - MainWindow.this.stateMachine.configProvider.setMainWindowSizePersistent(Constants.ISNOTNULL(getShell().getSize())); - try { - MainWindow.this.stateMachine.configProvider.saveToDisk(); - } catch (IOException e1) { - log.error("Error saving configuration", e); - } - getShell().dispose(); - } - }); - - ImageData data = new ImageData(this.getClass().getResourceAsStream(Constants.RES_ICON)); - Image shellicon = new Image(getShell().getDisplay(), data); - - getShell().setImage(shellicon); - - getShell().setLayout(new FormLayout()); - - this.mainbar = new Composite(getShell(), SWT.NONE); - this.mainbar.setLayout(new FormLayout()); - this.mainBarFormData = new FormData(); - this.mainBarFormData.left = new FormAttachment(0, 10); - this.mainBarFormData.right = new FormAttachment(100, -10); - this.mainBarFormData.top = new FormAttachment(0, 10); - this.mainBarFormData.bottom = new FormAttachment(0, Constants.MAINBAR_HEIGHT); - this.mainbar.setLayoutData(this.mainBarFormData); - - this.btn_config = new MainBarRectangleButton(this.mainbar, SWT.NONE); - SWTUtils.anchor(btn_config).bottom(100).right(0,50).top(0).left(0); - SWTUtils.setLocalizedText(btn_config, "main.configuration"); - SWTUtils.setLocalizedToolTipText(btn_config, "main.configuration"); - this.btn_config.addMouseListener(new MouseAdapter() { - @Override - public void mouseUp(MouseEvent e) { - MainWindow.this.stateMachine - .jumpToState(new ConfigurationUIState( - MainWindow.this.stateMachine)); - } - }); - this.buttonMap.put(Buttons.CONFIG, this.btn_config); - - InputStream is = this.getClass().getResourceAsStream(Constants.RES_IMG_CONFIG); - ((MainBarRectangleButton) this.btn_config).setEnabledImage( - new Image(Display.getDefault(), new ImageData(is))); - is = this.getClass().getResourceAsStream(Constants.RES_IMG_CONFIG_DISABLED); - ((MainBarRectangleButton) this.btn_config).setDisabledImage( - new Image(Display.getDefault(), new ImageData(is))); - - Composite mainbarContainer = new Composite(this.mainbar, SWT.NONE); - mainbarContainer.setLayout(new FormLayout()); - SWTUtils.anchor(mainbarContainer).left(btn_config).right(100).top(0).bottom(100); - - this.btn_open = new MainBarStartButton(mainbarContainer, SWT.NONE); - SWTUtils.anchor(btn_open).left(0).right(27, (MainBarButton.SplitFactor / 2)).top(0).bottom(100); - SWTUtils.setLocalizedText(btn_open, "common.open"); - SWTUtils.setLocalizedToolTipText(btn_open, "common.open"); - this.btn_open.addMouseListener(new MouseAdapter() { - @Override - public void mouseUp(MouseEvent e) { - if (MainWindow.this.stateMachine.status.getCurrentState() instanceof OpenState) { - ((OpenState) MainWindow.this.stateMachine.status.getCurrentState()).openFileDialog(); - } else { - MainWindow.this.stateMachine.jumpToState(new OpenState( - MainWindow.this.stateMachine)); - } - } - }); - this.buttonMap.put(Buttons.OPEN, this.btn_open); - - this.btn_position = new MainBarMiddleButton(mainbarContainer, SWT.NONE); - SWTUtils.anchor(btn_position).left(27, -1 * (MainBarButton.SplitFactor / 2)).right(54, (MainBarButton.SplitFactor / 2)).top(0).bottom(100); - SWTUtils.setLocalizedText(btn_position, "main.position"); - SWTUtils.setLocalizedToolTipText(btn_position, "main.position"); - this.btn_position.addMouseListener(new MouseAdapter() { - @Override - public void mouseUp(MouseEvent e) { - MainWindow.this.stateMachine.jumpToState(new PositioningState( - MainWindow.this.stateMachine)); - } - }); - this.buttonMap.put(Buttons.POSITION, this.btn_position); - - this.btn_sign = new MainBarMiddleButton(mainbarContainer, SWT.NONE); - SWTUtils.anchor(btn_sign).left(54, -1 * (MainBarButton.SplitFactor / 2)).right(81, (MainBarButton.SplitFactor / 2)).top(0).bottom(100); - SWTUtils.setLocalizedText(btn_sign, "main.signature"); - SWTUtils.setLocalizedToolTipText(btn_sign, "main.signature"); - this.btn_sign.addMouseListener(new MouseAdapter() { - @Override - public void mouseUp(MouseEvent e) { - MainWindow.this.stateMachine.jumpToState(new BKUSelectionState( - MainWindow.this.stateMachine)); - } - }); - this.buttonMap.put(Buttons.SIGN, this.btn_sign); - - this.btn_end = new MainBarEndButton(mainbarContainer, SWT.NONE); - SWTUtils.anchor(btn_end).left(81, -1 * (MainBarButton.SplitFactor / 2)).right(100).top(0).bottom(100); - SWTUtils.setLocalizedText(btn_end, "main.done"); - SWTUtils.setLocalizedToolTipText(btn_end, "main.done"); - this.buttonMap.put(Buttons.FINAL, this.btn_end); - - this.container = new Composite(getShell(), SWT.RESIZE); - this.containerFormData = new FormData(); - this.containerFormData.bottom = new FormAttachment(100, -10); - this.containerFormData.right = new FormAttachment(100, -10); - this.containerFormData.top = new FormAttachment(0, Constants.MAINBAR_HEIGHT + 10); - this.containerFormData.left = new FormAttachment(0, 10); - this.container.setLayoutData(this.containerFormData); - this.stack = new StackLayout(); - this.container.setLayout(this.stack); - } - - /** - * Hook up SWT menu under OS X - */ - private void hookupOSXMenu() { - log.debug("Hooking up OS X menu"); - CocoaUIEnhancer.hookApplicationMenu( - getShell().getDisplay(), - /* quitListener */ - (Event arg0) -> { - MainWindow.this.stateMachine.exit(); - }, - /* aboutListener */ - (Event arg0) -> { - Dialog dialog = new Dialog(getShell(), - Messages.formatString("main.about", Constants.APP_NAME), - Constants.APP_NAME_VERSION, BUTTONS.OK, ICON.INFORMATION); - dialog.open(); - }, - /* preferencesListener */ - (Event arg0) -> { - if (MainWindow.this.stateMachine.status.behavior.getEnabled(Buttons.CONFIG)) - MainWindow.this.stateMachine.jumpToState(new ConfigurationUIState(MainWindow.this.stateMachine)); - } - ); - } - - /** - * Update MainWindow to fit new status - */ - public void applyBehavior() { - MainWindowBehavior behavior = this.stateMachine.status.behavior; - - log.debug("Updating MainWindow state for : " - + this.stateMachine.status.getCurrentState().toString()); - - for (Buttons button : Buttons.values()) { - boolean active = behavior.getActive(button); - boolean enabled = behavior.getEnabled(button); - - MainBarButton theButton = this.buttonMap.get(button); - if (theButton != null) { - theButton.setEnabled(enabled); - theButton.setActive(active); - } - } - - if (behavior.getMainBarVisible()) { - this.mainBarFormData.bottom = new FormAttachment(0, Constants.MAINBAR_HEIGHT); - this.containerFormData.top = new FormAttachment(0, Constants.MAINBAR_HEIGHT + 10); - } else { - this.mainBarFormData.bottom = new FormAttachment(0, 0); - this.containerFormData.top = new FormAttachment(0, 10); - } - - getShell().getDisplay().update(); - this.mainbar.layout(true, true); - this.mainbar.redraw(); - } - - /** - * @return the shell - */ - public Shell getShell() { - return this.shell; - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/MainWindowBehavior.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/MainWindowBehavior.java deleted file mode 100644 index ee78b628..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/MainWindowBehavior.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui; - -import java.util.EnumMap; -import java.util.Map; - -import at.asit.pdfover.gui.MainWindow.Buttons; - -/** - * Behavior manipulation for Main Window - */ -public class MainWindowBehavior { - /** - * Enabled buttons map - */ - protected Map<Buttons, Boolean> buttonsEnabled; - - /** - * active buttons map - */ - protected Map<Buttons, Boolean> buttonsActive; - - /** - * Main bar visible - */ - protected boolean mainBarVisible; - - /** - * - */ - public MainWindowBehavior() { - this.buttonsActive = new EnumMap<MainWindow.Buttons, Boolean>(MainWindow.Buttons.class); - this.buttonsEnabled = new EnumMap<MainWindow.Buttons, Boolean>(MainWindow.Buttons.class); - reset(); - } - - /** - * set active buttons - * @param button - * @param active - */ - public void setActive(Buttons button, boolean active) { - this.buttonsActive.put(button, active); - } - - /** - * Gets the active state of a button from main bar - * @param button the button - * @return the active state - */ - public boolean getActive(Buttons button) { - return this.buttonsActive.get(button); - } - - /** - * Sets the enabled buttons in the main bar - * @param button - * @param enabled - */ - public void setEnabled(Buttons button, boolean enabled) { - this.buttonsEnabled.put(button, enabled); - } - - /** - * Get the enabled state of a button in main bar - * @param button the button - * @return the enabled state - */ - public boolean getEnabled(Buttons button) { - return this.buttonsEnabled.get(button); - } - - /** - * Resets all behavior to a default state - * All buttons are inactive - * All buttons are disabled - * Main bar is visible - */ - public void reset() { - for (Buttons button : Buttons.values()) { - setActive(button, false); - setEnabled(button, false); - } - setMainBarVisible(true); - } - - /** - * Sets the main bar visible - * @param visible - */ - public void setMainBarVisible(boolean visible) { - this.mainBarVisible = visible; - } - - /** - * Gets wether the main bar is visible - * @return the visibility of the main bar - */ - public boolean getMainBarVisible() { - return this.mainBarVisible; - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/PlaceholderSelectionGui.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/PlaceholderSelectionGui.java deleted file mode 100644 index f06e9f92..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/PlaceholderSelectionGui.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui; - -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; - -import at.asit.pdfover.gui.utils.SWTUtils; - -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Dialog; - -import java.util.List; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.widgets.Label; - - -/** - * - */ -public class PlaceholderSelectionGui extends Dialog { - /** - * SLF4J Logger instance - **/ - protected Object result; - protected Shell shlInfo; - protected Combo placeholderNameDropDown; - protected String lblString; - protected List<String> placeholderList; - private Button btnCancel; - private Button btnOk; - protected int returnValue; - - - /** - * Create the dialog. - * @param parent - * @param style - * @param text - * @param lblString - * @param placeholderList - */ - public PlaceholderSelectionGui(Shell parent, int style, String text, String lblString, List<String> placeholderList) { - super(parent, style); - setText(text); - this.lblString = lblString; - this.placeholderList = placeholderList; - } - - /** - * Open the dialog. - * @return the result - */ - - public int open() { - createContents(); - this.shlInfo.open(); - this.shlInfo.layout(); - Display display = getParent().getDisplay(); - while (!this.shlInfo.isDisposed()) { - if (!display.readAndDispatch()) { - display.sleep(); - } - } - return this.returnValue; - } - - /** - * @return - */ - public int getUserSelection() { - return this.returnValue; - } - - /** - * Create contents of the dialog. - */ - private void createContents() { - this.shlInfo = new Shell(getParent(), getStyle()); - this.shlInfo.setSize(290, 195); - this.shlInfo.setText("Info"); - this.shlInfo.setLayout(null); - - this.placeholderNameDropDown = new Combo(this.shlInfo, SWT.NONE); - this.placeholderNameDropDown.setBounds(27, 77, 223, 23); - addDropDownEntries(this.placeholderList); - this.placeholderNameDropDown.select(0); - - this.btnCancel = new Button(this.shlInfo, SWT.NONE); - this.btnCancel.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - PlaceholderSelectionGui.this.returnValue = -1; - PlaceholderSelectionGui.this.shlInfo.dispose(); - } - }); - this.btnCancel.setBounds(175, 118, 75, 25); - this.btnCancel.setText("Cancel"); - - this.btnOk = new Button(this.shlInfo, SWT.NONE); - this.btnOk.setBounds(94, 118, 75, 25); - this.btnOk.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - PlaceholderSelectionGui.this.returnValue = PlaceholderSelectionGui.this.placeholderNameDropDown.getSelectionIndex(); - PlaceholderSelectionGui.this.shlInfo.dispose(); - } - }); - this.btnOk.setText("Ok"); - - Label lbLabel = new Label(this.shlInfo, SWT.WRAP); - lbLabel.setBounds(27, 10, 223, 41); - SWTUtils.setLocalizedText(lbLabel, "positioning.placeholder"); - - } - - /** - * @param list - * @param Filling up the placeholder drop down list - */ - public void addDropDownEntries(List<String> list) { - for (String name : list) { - this.placeholderNameDropDown.add(name); - } - } - - /** - * - */ - protected void close() { - this.close(); - } - - @Override - protected void checkSubclass() { - // allow subclass - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/bku/BKUHelper.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/bku/BKUHelper.java deleted file mode 100644 index 382a3d24..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/bku/BKUHelper.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.bku; - -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.UsernamePasswordCredentials; -// Imports -import org.apache.commons.httpclient.auth.AuthScope; -import org.apache.http.client.config.CookieSpecs; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; - -/** - * - */ -public class BKUHelper { - /** - * SLF4J Logger instance - **/ - @SuppressWarnings("unused") - private static final Logger log = LoggerFactory.getLogger(BKUHelper.class); - - /* public static HttpClient getHttpClient(boolean useProxy) { - HttpClient client = new HttpClient(); - client.getParams().setParameter("http.useragent", - Constants.APP_NAME_VERSION); - - if (useProxy) { - String host = System.getProperty("http.proxyHost"); - String port = System.getProperty("http.proxyPort"); - if (host != null && !host.isEmpty() && - port != null && !port.isEmpty()) { - int p = Integer.parseInt(port); - client.getHostConfiguration().setProxy(host, p); - String user = System.getProperty("http.proxyUser"); - String pass = System.getProperty("http.proxyPassword"); - if (user != null && !user.isEmpty() && pass != null) { - client.getState().setProxyCredentials(new AuthScope(host, p), - new UsernamePasswordCredentials(user, pass)); - } - } - } - - return client; - }*/ - - /** - * Get a HTTP Client instance - * - * @param useProxy - * whether to use a potentially set proxy - * @return the HttpClient - */ - @SuppressWarnings("deprecation") - public static HttpClient getHttpClient(boolean useProxy) { - HttpClient client = new HttpClient(); - client.getParams().setParameter("http.useragent", - Constants.APP_NAME_VERSION); - - - client.getParams().setParameter("http.protocol.cookie-policy", CookieSpecs.BROWSER_COMPATIBILITY); - - if (useProxy) { - String host = System.getProperty("http.proxyHost");// - String port = System.getProperty("http.proxyPort");// - if (host != null && !host.isEmpty() && port != null && !port.isEmpty()) { - int p = Integer.parseInt(port); - client.getHostConfiguration().setProxy(host, p); - String user = System.getProperty("http.proxyUser");// - String pass = System.getProperty("http.proxyPassword");// - if (user != null && !user.isEmpty() && pass != null) { - client.getState().setProxyCredentials(new AuthScope(host, p), - new UsernamePasswordCredentials(user, pass)); - } - } - } - - return client; - - } - - /** - * Get a HTTP Client instance - * - * @return the HttpClient - */ - public static HttpClient getHttpClient() { - return getHttpClient(false); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/bku/LocalBKUConnector.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/bku/LocalBKUConnector.java deleted file mode 100644 index 1f68a020..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/bku/LocalBKUConnector.java +++ /dev/null @@ -1,122 +0,0 @@ -/*
- * Copyright 2012 by A-SIT, Secure Information Technology Center Austria
- *
- * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "Licence");
- * You may not use this work except in compliance with the Licence.
- * You may obtain a copy of the Licence at:
- * http://joinup.ec.europa.eu/software/page/eupl
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the Licence is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the Licence for the specific language governing permissions and
- * limitations under the Licence.
- */
-package at.asit.pdfover.gui.bku;
-
-// Imports
-import java.io.IOException;
-import java.net.Socket;
-
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.HttpStatus;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.multipart.FilePart;
-import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
-import org.apache.commons.httpclient.methods.multipart.Part;
-import org.apache.commons.httpclient.methods.multipart.StringPart;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import at.asit.pdfover.commons.Constants;
-import at.asit.pdfover.gui.utils.FileUploadSource;
-import at.asit.pdfover.signer.BkuSlConnector;
-import at.asit.pdfover.signer.SignatureException;
-import at.asit.pdfover.signer.pdfas.PdfAs4SLRequest;
-
-/**
- *
- */
-public class LocalBKUConnector implements BkuSlConnector {
- /**
- * SLF4J Logger instance
- **/
- private static final Logger log = LoggerFactory.getLogger(LocalBKUConnector.class);
-
- private static boolean isAvailable = false;
- public static boolean IsAvailable() { return isAvailable; }
- private static Thread pollingThread = new Thread(() -> {
- while (true) {
- try { Thread.sleep(isAvailable ? 30000 : 5000); } catch (InterruptedException e) {}
- try (Socket socket = new Socket("127.0.0.1", 3495)) {
- isAvailable = true;
- } catch (IOException e) {
- isAvailable = false;
- }
- }
- }, "LocalBKUProbeThread");
- static {
- pollingThread.setDaemon(true);
- pollingThread.start();
- }
-
-
- /**
- * HTTP Response server HEADER
- */
- public final static String BKU_RESPONSE_HEADER_SERVER = "server";
-
- /**
- * HTTP Response user-agent HEADER
- */
- public final static String BKU_RESPONSE_HEADER_USERAGENT = "user-agent";
-
- /**
- * HTTP Response SignatureLayout HEADER
- */
- public final static String BKU_RESPONSE_HEADER_SIGNATURE_LAYOUT = "SignatureLayout";
-
- /* (non-Javadoc)
- * @see at.asit.pdfover.signator.BkuSlConnector#handleSLRequest(java.lang.String)
- */
- @Override
- public String handleSLRequest(PdfAs4SLRequest request) throws SignatureException {
- try {
- HttpClient client = BKUHelper.getHttpClient();
- PostMethod method = new PostMethod(Constants.LOCAL_BKU_URL);
-
- String sl_request = request.xmlRequest;
- if (request.signatureData == null) {
- method.addParameter("XMLRequest", sl_request);
- } else {
- StringPart xmlpart = new StringPart(
- "XMLRequest", sl_request, "UTF-8");
-
- FilePart filepart = new FilePart("fileupload", new FileUploadSource(request.signatureData));
-
- Part[] parts = { xmlpart, filepart };
-
- method.setRequestEntity(new MultipartRequestEntity(parts, method
- .getParams()));
- }
- log.trace("SL REQUEST: " + sl_request);
-
- int returnCode = client.executeMethod(method);
-
- if (returnCode != HttpStatus.SC_OK) {
- throw new HttpException(
- method.getResponseBodyAsString());
- }
-
- return method.getResponseBodyAsString();
- } catch (HttpException e) {
- log.error("LocalBKUConnector: ", e);
- throw new SignatureException(e);
- } catch (IOException e) {
- log.error("LocalBKUConnector: ", e);
- throw new SignatureException(e);
- }
- }
-}
diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/bku/MobileBKUConnector.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/bku/MobileBKUConnector.java deleted file mode 100644 index 779e24c6..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/bku/MobileBKUConnector.java +++ /dev/null @@ -1,439 +0,0 @@ -package at.asit.pdfover.gui.bku; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Base64; -import java.util.List; -import java.util.Optional; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.annotation.CheckForNull; -import javax.annotation.Nonnull; - -import org.apache.hc.client5.http.classic.methods.HttpGet; -import org.apache.hc.client5.http.classic.methods.HttpPost; -import org.apache.hc.client5.http.entity.UrlEncodedFormEntity; -import org.apache.hc.client5.http.entity.mime.MultipartEntityBuilder; -import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; -import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; -import org.apache.hc.client5.http.impl.classic.HttpClients; -import org.apache.hc.core5.http.ClassicHttpRequest; -import org.apache.hc.core5.http.ContentType; -import org.apache.hc.core5.http.Header; -import org.apache.hc.core5.http.HttpEntity; -import org.apache.hc.core5.http.HttpStatus; -import org.apache.hc.core5.http.NameValuePair; -import org.apache.hc.core5.http.NoHttpResponseException; -import org.apache.hc.core5.http.ParseException; -import org.apache.hc.core5.http.ProtocolException; -import org.apache.hc.core5.http.io.entity.EntityUtils; -import org.apache.hc.core5.http.message.BasicNameValuePair; -import org.json.JSONObject; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.bku.mobile.ATrustParser; -import at.asit.pdfover.gui.workflow.states.MobileBKUState; -import at.asit.pdfover.gui.workflow.states.MobileBKUState.UsernameAndPassword; -import at.asit.pdfover.signer.BkuSlConnector; -import at.asit.pdfover.signer.SignatureException; -import at.asit.pdfover.signer.UserCancelledException; -import at.asit.pdfover.signer.pdfas.PdfAs4SLRequest; -import at.asit.webauthn.WebAuthN; - -import static at.asit.pdfover.commons.Constants.ISNOTNULL; - -public class MobileBKUConnector implements BkuSlConnector { - private static final Logger log = LoggerFactory.getLogger(MobileBKUConnector.class); - - private final @Nonnull MobileBKUState state; - public MobileBKUConnector(@Nonnull MobileBKUState state) { - this.state = state; - this.wantsFido2Default = WebAuthN.isAvailable() && state.getConfig().getFido2ByDefault(); - state.storeRememberedCredentialsTo(this.credentials); - } - - private class UserDisplayedError extends Exception { - private final @Nonnull String msg; - @Override public @Nonnull String getMessage() { return this.msg; } - private UserDisplayedError(@Nonnull String s) { this.msg = s; } - } - - public @Nonnull UsernameAndPassword credentials = new UsernameAndPassword(); - - /** - * This method takes the SLRequest from PDF-AS, and blocks until it has obtained a response - */ - @Override - public String handleSLRequest(PdfAs4SLRequest slRequest) throws SignatureException, UserCancelledException { - log.debug("Got security layer request: (has file part: {})\n{}", (slRequest.signatureData != null), slRequest.xmlRequest); - try (final CloseableHttpClient httpClient = HttpClients.custom().disableRedirectHandling().build()) { - ClassicHttpRequest currentRequest = buildInitialRequest(slRequest); - ATrustParser.Result response; - while ((response = sendHTTPRequest(httpClient, currentRequest)).slResponse == null) - currentRequest = presentResponseToUserAndReturnNextRequest(ISNOTNULL(response.html)); - log.debug("Returning security layer response:\n{}", response.slResponse); - return response.slResponse; - } catch (UserDisplayedError e) { - state.showUnrecoverableError(e.getMessage()); - throw new IllegalStateException("unreachable", e); /* showUnrecoverableError always throws */ - } catch (UserCancelledException e) { - throw e; - } catch (Exception e) { - throw new SignatureException(e); - } - } - - /* some anti-infinite-loop safeguards so we don't murder the atrust servers by accident */ - private int loopHTTPRequestCounter = 0; - private Long lastHTTPRequestTime = null; - /** - * Sends the specified request, following redirects (including meta-tag redirects) recursively - * @return The JSOUP document retrieved - * @throws IOException on HTTP error codes - * @throws ProtocolException - * @throws URISyntaxException - * @throws InterruptedException - */ - private @Nonnull ATrustParser.Result sendHTTPRequest(CloseableHttpClient httpClient, ClassicHttpRequest request) throws IOException, ProtocolException, URISyntaxException, UserDisplayedError { - long now = System.nanoTime(); - if ((lastHTTPRequestTime != null) && ((now - lastHTTPRequestTime) < 2e+9)) { /* less than 2s since last request */ - ++loopHTTPRequestCounter; - if (loopHTTPRequestCounter > 250) - throw new IOException("Infinite loop protection triggered"); - } else { - loopHTTPRequestCounter = 0; - } - lastHTTPRequestTime = now; - - log.debug("Sending {} request to '{}'...", request.getMethod(), request.getUri().toString()); - try (final CloseableHttpResponse response = httpClient.execute(request)) { - int httpStatus = response.getCode(); - if ((httpStatus == HttpStatus.SC_MOVED_PERMANENTLY) || (httpStatus == HttpStatus.SC_MOVED_TEMPORARILY)) { - Header redirectPath = response.getHeader("location"); - if (redirectPath == null) - throw new IOException("Received HTTP redirect, but no Location header."); - return sendHTTPRequest(httpClient, buildRedirectedRequest(request.getUri(), redirectPath.getValue())); - } - - if (httpStatus != HttpStatus.SC_OK) { - switch (httpStatus) { - case HttpStatus.SC_REQUEST_TOO_LONG: throw new UserDisplayedError(Messages.getString("atrusterror.http_413")); - default: throw new UserDisplayedError(Messages.formatString("atrusterror.http_generic", httpStatus, Optional.ofNullable(response.getReasonPhrase()).orElse("(null)"))); - } - } - - Header refreshHeader = response.getHeader("refresh"); - if (refreshHeader != null) - return sendHTTPRequest(httpClient, buildRefreshHeaderRequest(request.getUri(), refreshHeader.getValue())); - - HttpEntity responseEntity = response.getEntity(); - if (responseEntity == null) - throw new IOException("Did not get a HTTP body (entity == null)"); - - ContentType contentType = ContentType.parse(responseEntity.getContentType()); - String entityBody = EntityUtils.toString(response.getEntity(),contentType.getCharset()); - if (entityBody == null) - throw new IOException("Did not get a HTTP body (entity content == null)"); - - if ("text/html".equals(contentType.getMimeType())) { - Document resultDocument = Jsoup.parse(entityBody, request.getUri().toASCIIString()); - if (resultDocument == null) - { - log.error("Failed to parse A-Trust server response as HTML:\n{}", entityBody); - throw new IOException("Failed to parse HTML"); - } - - Element metaRefresh = resultDocument.selectFirst("meta[http-equiv=\"refresh\"i]"); - if (metaRefresh != null) { - String refreshContent = metaRefresh.attr("content"); - if (!refreshContent.isEmpty()) - return sendHTTPRequest(httpClient, buildRefreshHeaderRequest(request.getUri(), refreshContent)); - } - return ATrustParser.Parse(resultDocument); - } else { - return ATrustParser.Parse(request.getUri(), contentType.getMimeType(), entityBody); - } - } - } - - /** - * Builds a HttpRequest for the given base URI and (potentially relative) redirect path - */ - private static @Nonnull ClassicHttpRequest buildRedirectedRequest(URI baseURI, String redirectLocation) { - log.debug("following redirect: {}", redirectLocation); - return new HttpGet(baseURI.resolve(redirectLocation)); - } - - /** - * Builds a HttpRequest for redirection to a given Refresh header value - */ - private static @Nonnull ClassicHttpRequest buildRefreshHeaderRequest(URI baseURI, String refreshHeader) throws IOException { - // refresh value is delay in seconds, semicolon, URL=, url - Pattern pattern = Pattern.compile("^\\s*[0-9\\.]+\\s*;\\s*(?:[uU][rR][lL]\s*=\s*)(.+)$"); - Matcher matcher = pattern.matcher(refreshHeader); - if (!matcher.matches()) - throw new IOException("Got invalid Refresh header with value \"" + refreshHeader + "\"."); - String redirectURL = matcher.group(1); - return buildRedirectedRequest(baseURI, redirectURL); - } - - /** - * Builds the initial request to A-Trust based on the specified SL request - */ - private static @Nonnull ClassicHttpRequest buildInitialRequest(PdfAs4SLRequest slRequest) { - HttpPost post = new HttpPost(Constants.MOBILE_BKU_URL); - if (slRequest.signatureData != null) { - post.setEntity(MultipartEntityBuilder.create() - .addBinaryBody("fileupload", slRequest.signatureData.getByteArray(), ContentType.APPLICATION_PDF, "sign.pdf") - .addTextBody("XMLRequest", slRequest.xmlRequest) - .build()); - } else { - post.setEntity(UrlEncodedFormEntityBuilder.create() - .add("XMLRequest", slRequest.xmlRequest) - .build()); - } - return post; - } - - private static @Nonnull ClassicHttpRequest buildFormSubmit(@Nonnull ATrustParser.HTMLResult html, @CheckForNull String submitButton) { - HttpPost post = new HttpPost(html.formTarget); - - var builder = MultipartEntityBuilder.create(); - for (var pair : html.iterateFormOptions()) - builder.addTextBody(pair.getKey(), pair.getValue()); - - if (submitButton != null) { - var submitButtonElm = html.htmlDocument.selectFirst(submitButton); - if (submitButtonElm != null) { - if ("input".equalsIgnoreCase(submitButtonElm.tagName())) { - if ("submit".equalsIgnoreCase(submitButtonElm.attr("type"))) { - String name = submitButtonElm.attr("name"); - if (!name.isEmpty()) - builder.addTextBody(name, submitButtonElm.attr("value")); - } else { - log.warn("Skipped specified submitButton {}, type is {} (not submit)", submitButton, submitButtonElm.attr("type")); - } - } else { - log.warn("Skipped specified submitButton {}, tag name is {} (not input)", submitButton, submitButtonElm.tagName()); - } - } else { - log.warn("Skipped specified submitButton {}, element not found", submitButton); - } - } - - post.setEntity(builder.build()); - return post; - } - - private static class LongPollThread extends Thread implements AutoCloseable { - - private final CloseableHttpClient httpClient = HttpClients.createDefault(); - private final HttpGet request; - private final Runnable signal; - private boolean done = false; - - @Override - public void run() { - long timeout = System.nanoTime() + (300l * 1000l * 1000l * 1000l); /* a-trust timeout is 5 minutes */ - log.debug("longPollThread hello"); - while (!done) { - try (final CloseableHttpResponse response = httpClient.execute(request)) { - JSONObject jsonResponse = new JSONObject(EntityUtils.toString(response.getEntity())); - if (jsonResponse.getBoolean("Fin")) - signal.run(); - else if (jsonResponse.getBoolean("Wait")) - { - log.debug("longPollThread continue..."); - continue; - } - else if (jsonResponse.getBoolean("Error")) - signal.run(); /* will trigger reload and find error; this is the same thing a-trust does */ - else { - log.warn("Unknown long poll response:\n{}", jsonResponse.toString(2)); - break; - } - } catch (NoHttpResponseException e) { - if (timeout <= System.nanoTime()) - signal.run(); /* reload to find the timeout error */ - continue; /* httpclient timeout */ - } catch (IOException | ParseException | IllegalStateException e) { - if (done) break; - log.warn("QR code long polling exception", e); - /* sleep so we don't hammer a-trust too hard in case this goes wrong */ - try { Thread.sleep(5000); } catch (InterruptedException e2) {} - } - } - log.debug("longPollThread goodbye"); - } - - public LongPollThread(URI uri, Runnable signal) { - this.request = new HttpGet(uri); - this.signal = signal; - } - - @Override - public void close() { - done = true; - if (this.request != null) - this.request.abort(); - - if (this.isAlive()) - try { this.join(1000); } catch (InterruptedException e) {} - - if (this.httpClient != null) - try { this.httpClient.close(); } catch (IOException e) { log.warn("Auto-close of long-poll HTTP client threw exception", e); } - } - - } - - private boolean wantsFido2Default; - /** - * Main lifting function for MobileBKU UX - * @return the next request to make - */ - private @Nonnull ClassicHttpRequest presentResponseToUserAndReturnNextRequest(@Nonnull ATrustParser.HTMLResult html) throws UserCancelledException { - if ((html.errorBlock == null) && (html.usernamePasswordBlock == null)) { /* successful username/password auth */ - if ((this.credentials.username != null) && (this.credentials.password != null)) - state.rememberCredentialsIfNecessary(this.credentials); - } - - if (wantsFido2Default && (html.fido2Link != null)) { - wantsFido2Default = false; - return new HttpGet(html.fido2Link); - } - - if (html.autoSkipBlock != null) { - return buildFormSubmit(html, html.autoSkipBlock.submitButton); - } - if (html.interstitialBlock != null) { - this.state.showInformationMessage(html.interstitialBlock.interstitialMessage); - return buildFormSubmit(html, html.interstitialBlock.submitButton); - } - if (html.errorBlock != null) { - try { - this.credentials.password = null; - this.state.clearRememberedPassword(); - - if (html.errorBlock.isRecoverable) - this.state.showRecoverableError(html.errorBlock.errorText); - else - this.state.showUnrecoverableError(html.errorBlock.errorText); - return buildFormSubmit(html, "#Button_Back"); - } catch (UserCancelledException e) { - return buildFormSubmit(html, "#Button_Cancel"); - } - } - if (html.usernamePasswordBlock != null) { - try { - while ((this.credentials.username == null) || (this.credentials.password == null)) { - this.state.getCredentialsFromUserTo(this.credentials, html.usernamePasswordBlock.errorMessage); - } - html.usernamePasswordBlock.setUsernamePassword(this.credentials.username, this.credentials.password); - return buildFormSubmit(html, "#Button_Identification"); - } catch (UserCancelledException e) { - return buildFormSubmit(html, "#Button_Cancel"); - } - } - if (html.smsTanBlock != null) { - MobileBKUState.SMSTanResult result = this.state.getSMSTanFromUser( - html.smsTanBlock.referenceValue, html.signatureDataLink, - html.fido2Link != null, html.smsTanBlock.errorMessage); - - switch (result.type) { - case TO_FIDO2: if (html.fido2Link != null) return new HttpGet(html.fido2Link); - case SMSTAN: html.smsTanBlock.setTAN(result.smsTan); return buildFormSubmit(html, "#SignButton"); - } - return new HttpGet(html.htmlDocument.baseUri()); - } - if (html.qrCodeBlock != null) { - try (LongPollThread longPollThread = new LongPollThread(html.qrCodeBlock.pollingURI, () -> { this.state.signalQRScanned(); })) { - this.state.showQRCode(html.qrCodeBlock.referenceValue, html.qrCodeBlock.qrCodeURI, html.signatureDataLink, html.smsTanLink != null, html.fido2Link != null, html.qrCodeBlock.errorMessage); - longPollThread.start(); - var result = this.state.waitForQRCodeResult(); - switch (result) { - case UPDATE: break; - case TO_FIDO2: if (html.fido2Link != null) return new HttpGet(html.fido2Link); break; - case TO_SMS: if (html.smsTanLink != null) return new HttpGet(html.smsTanLink); break; - } - return new HttpGet(html.htmlDocument.baseUri()); - } - } - if (html.waitingForAppBlock != null) { - try (LongPollThread longPollThread = new LongPollThread(html.waitingForAppBlock.pollingURI, () -> { this.state.signalAppOpened(); })) { - this.state.showWaitingForAppOpen(html.waitingForAppBlock.referenceValue, html.signatureDataLink, html.smsTanLink != null, html.fido2Link != null); - longPollThread.start(); - var result = this.state.waitForAppOpen(); - switch (result) { - case UPDATE: break; - case TO_FIDO2: if (html.fido2Link != null) return new HttpGet(html.fido2Link); break; - case TO_SMS: if (html.smsTanLink != null) return new HttpGet(html.smsTanLink); break; - } - return new HttpGet(html.htmlDocument.baseUri()); - } - } - if (html.waitingForBiometryBlock != null) { - try (LongPollThread longPollThread = new LongPollThread(html.waitingForBiometryBlock.pollingURI, () -> { this.state.signalAppBiometryDone(); })) { - this.state.showWaitingForAppBiometry(html.waitingForBiometryBlock.referenceValue, html.signatureDataLink, html.smsTanLink != null, html.fido2Link != null); - longPollThread.start(); - var result = this.state.waitForAppBiometry(); - switch (result) { - case UPDATE: break; - case TO_FIDO2: if (html.fido2Link != null) return new HttpGet(html.fido2Link); break; - case TO_SMS: if (html.smsTanLink != null) return new HttpGet(html.smsTanLink); break; - } - return new HttpGet(html.htmlDocument.baseUri()); - } - } - if (html.fido2Block != null) { - - var fido2Result = this.state.promptUserForFIDO2Auth(html.fido2Block.fidoOptions, html.signatureDataLink, html.smsTanLink != null); - - switch (fido2Result.type) { - case TO_SMS: return new HttpGet(html.smsTanLink); - case CREDENTIAL: break; - } - - var fido2Assertion = ISNOTNULL(fido2Result.credential); - - Base64.Encoder base64 = Base64.getEncoder(); - - JSONObject aTrustAssertion = new JSONObject(); - aTrustAssertion.put("id", fido2Assertion.id); - aTrustAssertion.put("rawId", base64.encodeToString(fido2Assertion.rawId)); - aTrustAssertion.put("type", fido2Assertion.type); - aTrustAssertion.put("extensions", new JSONObject()); // TODO fix extensions in library - - JSONObject aTrustAssertionResponse = new JSONObject(); - aTrustAssertion.put("response", aTrustAssertionResponse); - aTrustAssertionResponse.put("authenticatorData", base64.encodeToString(fido2Assertion.response.authenticatorData)); - aTrustAssertionResponse.put("clientDataJson", base64.encodeToString(fido2Assertion.response.clientDataJSON)); - aTrustAssertionResponse.put("signature", base64.encodeToString(fido2Assertion.response.signature)); - if (fido2Assertion.response.userHandle != null) - aTrustAssertionResponse.put("userHandle", base64.encodeToString(fido2Assertion.response.userHandle)); - else - aTrustAssertionResponse.put("userHandle", JSONObject.NULL); - - html.fido2Block.setFIDOResult(aTrustAssertion.toString()); - return buildFormSubmit(html, "#FidoContinue"); - } - throw new IllegalStateException("No top-level block is set? Something has gone terribly wrong."); - } - - private static class UrlEncodedFormEntityBuilder { - private UrlEncodedFormEntityBuilder() {} - private List<NameValuePair> values = new ArrayList<>(); - public static @Nonnull UrlEncodedFormEntityBuilder create() { return new UrlEncodedFormEntityBuilder(); } - public @Nonnull UrlEncodedFormEntityBuilder add(String key, String value) { values.add(new BasicNameValuePair(key, value)); return this; } - public @Nonnull UrlEncodedFormEntity build() { return new UrlEncodedFormEntity(values, Charset.forName("utf-8")); } - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/bku/mobile/ATrustParser.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/bku/mobile/ATrustParser.java deleted file mode 100644 index 89f53629..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/bku/mobile/ATrustParser.java +++ /dev/null @@ -1,379 +0,0 @@ -package at.asit.pdfover.gui.bku.mobile; - -import java.lang.reflect.InvocationTargetException; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import javax.annotation.CheckForNull; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import org.jsoup.Jsoup; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static at.asit.pdfover.commons.Constants.ISNOTNULL; - -public class ATrustParser { - private static final Logger log = LoggerFactory.getLogger(ATrustParser.class); - - private static class ComponentParseFailed extends Exception {} - - private static class TopLevelFormBlock { - protected final @Nonnull org.jsoup.nodes.Document htmlDocument; - protected final @Nonnull Map<String, String> formOptions; - protected TopLevelFormBlock(@Nonnull org.jsoup.nodes.Document d, @Nonnull Map<String,String> fO) { this.htmlDocument = d; this.formOptions = fO; } - - protected void abortIfElementMissing(@Nonnull String selector) throws ComponentParseFailed { - if (this.htmlDocument.selectFirst(selector) != null) return; - log.debug("Tested for element {} -- not found.", selector); - throw new ComponentParseFailed(); - } - protected @Nonnull org.jsoup.nodes.Element getElementEnsureNotNull(@Nonnull String selector) throws ComponentParseFailed { - var elm = this.htmlDocument.selectFirst(selector); - if (elm == null) { log.warn("Expected element not found in response: {}", selector); throw new ComponentParseFailed(); } - return elm; - } - protected @Nonnull String getAttributeEnsureNotNull(@Nonnull String selector, @Nonnull String attribute) throws ComponentParseFailed { - var elm = getElementEnsureNotNull(selector); - if (!elm.hasAttr(attribute)) { log.warn("Element {} is missing expected attribute '{}'.", selector, attribute); throw new ComponentParseFailed(); } - return ISNOTNULL(elm.attr(attribute)); - } - protected @Nonnull URI getURIAttributeEnsureNotNull(@Nonnull String selector, @Nonnull String attribute) throws ComponentParseFailed { - String value = getAttributeEnsureNotNull(selector, attribute); - try { - return new URI(value); - } catch (URISyntaxException e) { - if (attribute.startsWith("abs:")) - attribute = ISNOTNULL(attribute.substring(4)); - log.warn("Element {} attribute {} is '{}', could not be parsed as URI", selector, attribute, getAttributeEnsureNotNull(selector, attribute)); - throw new ComponentParseFailed(); - } - } - protected @Nonnull URI getLongPollURI() throws ComponentParseFailed { - var pollingScriptElm = getElementEnsureNotNull("#jsLongPoll script"); - String pollingScript = pollingScriptElm.data(); - int startIdx = pollingScript.indexOf("qrpoll(\""); - if (startIdx < 0) { log.warn("Failed to find 'qrpoll(\"' in jsLongPoll script:\n{}", pollingScript); throw new ComponentParseFailed(); } - startIdx += 8; - - int endIdx = pollingScript.indexOf("\");", startIdx); - if (endIdx < 0) { log.warn("Failed to find qrpoll terminator '\");' in jsLongPoll script:\n{}", pollingScript); throw new ComponentParseFailed(); } - - String pollingUriString = pollingScript.substring(startIdx, endIdx); - try { - return ISNOTNULL(new URI(pollingScriptElm.baseUri()).resolve(pollingUriString)); - } catch (URISyntaxException e) { - log.warn("Long-poll URI '{}' could not be parsed", pollingUriString); - throw new ComponentParseFailed(); - } - } - } - - public static class AutoSkipBlock extends TopLevelFormBlock { - public final @Nonnull String submitButton; - - private AutoSkipBlock(@Nonnull org.jsoup.nodes.Document htmlDocument, @Nonnull Map<String, String> formOptions) throws ComponentParseFailed { - super(htmlDocument, formOptions); - if (htmlDocument.baseUri().contains("/tanAppInfo.aspx")) { - this.submitButton = "#NextBtn"; - } else { throw new ComponentParseFailed(); } - } - } - - public static class InterstitialBlock extends TopLevelFormBlock { - public final @Nonnull String submitButton; - public final @Nonnull String interstitialMessage; - - private InterstitialBlock(@Nonnull org.jsoup.nodes.Document htmlDocument, @Nonnull Map<String, String> formOptions) throws ComponentParseFailed { - super(htmlDocument, formOptions); - if (htmlDocument.baseUri().contains("/ExpiresInfo.aspx")) { - this.interstitialMessage = ISNOTNULL(getElementEnsureNotNull("#Label2").ownText()); - this.submitButton = "#Button_Next"; - } else { throw new ComponentParseFailed(); } - } - } - - public static class ErrorBlock extends TopLevelFormBlock { - public final boolean isRecoverable; - public final @Nonnull String errorText; - - private ErrorBlock(@Nonnull org.jsoup.nodes.Document htmlDocument, @Nonnull Map<String, String> formOptions) throws ComponentParseFailed { - super(htmlDocument, formOptions); - - try { - String documentPath = new URI(htmlDocument.baseUri()).getPath(); - String aspxFile = documentPath.substring(documentPath.lastIndexOf('/')); - - // gods this is such a hack, why can't they have a proper error element or something - if (!(aspxFile.startsWith("/error") && aspxFile.endsWith(".aspx"))) - throw new ComponentParseFailed(); - } catch (URISyntaxException ex) { - log.warn("Failed to parse document base URI as URI? ({})", htmlDocument.baseUri()); - throw new ComponentParseFailed(); - } - - this.isRecoverable = (htmlDocument.selectFirst("#Button_Back") != null); - - StringBuilder errorText = new StringBuilder(getElementEnsureNotNull("#Label1").ownText().trim()); - var detailLabel = this.htmlDocument.selectFirst("#LabelDetail"); - if (detailLabel != null) - errorText.append("\n").append(detailLabel.ownText().trim()); - this.errorText = ISNOTNULL(errorText.toString()); - } - } - - public static class UsernamePasswordBlock extends TopLevelFormBlock { - private final @Nonnull String usernameKey; - private final @Nonnull String passwordKey; - public final @CheckForNull String errorMessage; - - public void setUsernamePassword(String username, String password) { - formOptions.put(usernameKey, username); formOptions.put(passwordKey, password); - } - - private UsernamePasswordBlock(@Nonnull org.jsoup.nodes.Document htmlDocument, @Nonnull Map<String, String> formOptions) throws ComponentParseFailed { - super(htmlDocument, formOptions); - abortIfElementMissing("#handynummer"); - this.usernameKey = getAttributeEnsureNotNull("#handynummer", "name"); - this.passwordKey = getAttributeEnsureNotNull("#signaturpasswort", "name"); - this.errorMessage = null; - } - } - - public static class SMSTanBlock extends TopLevelFormBlock { - private final @Nonnull String tanKey; - public final @Nonnull String referenceValue; - public final @CheckForNull String errorMessage; - - public void setTAN(String tan) { - formOptions.put(tanKey, tan); - } - - private SMSTanBlock(@Nonnull org.jsoup.nodes.Document htmlDocument, @Nonnull Map<String, String> formOptions) throws ComponentParseFailed { - super(htmlDocument, formOptions); - abortIfElementMissing("#input_tan"); - this.tanKey = getAttributeEnsureNotNull("#input_tan", "name"); - this.referenceValue = ISNOTNULL(getElementEnsureNotNull("#vergleichswert").ownText()); - this.errorMessage = null; - } - } - - public static class QRCodeBlock extends TopLevelFormBlock { - public final @Nonnull String referenceValue; - public final @Nonnull URI qrCodeURI; - public final @Nonnull URI pollingURI; - public final @Nullable String errorMessage; - - private QRCodeBlock(@Nonnull org.jsoup.nodes.Document htmlDocument, @Nonnull Map<String, String> formOptions) throws ComponentParseFailed { - super(htmlDocument, formOptions); - abortIfElementMissing("#qrimage"); - - this.referenceValue = ISNOTNULL(getElementEnsureNotNull("#vergleichswert").ownText()); - this.qrCodeURI = getURIAttributeEnsureNotNull("#qrimage", "abs:src"); - this.pollingURI = getLongPollURI(); - - this.errorMessage = null; - } - } - - public static class WaitingForAppBlock extends TopLevelFormBlock { - public final @Nonnull String referenceValue; - public final @Nonnull URI pollingURI; - - private WaitingForAppBlock(@Nonnull org.jsoup.nodes.Document htmlDocument, @Nonnull Map<String, String> formOptions) throws ComponentParseFailed { - super(htmlDocument, formOptions); - abortIfElementMissing("#smartphoneAnimation"); - - this.referenceValue = ISNOTNULL(getElementEnsureNotNull("#vergleichswert").ownText()); - this.pollingURI = getLongPollURI(); - } - } - - public static class WaitingForBiometryBlock extends TopLevelFormBlock { - public final @Nonnull String referenceValue; - public final @Nonnull URI pollingURI; - - private WaitingForBiometryBlock(@Nonnull org.jsoup.nodes.Document htmlDocument, @Nonnull Map<String, String> formOptions) throws ComponentParseFailed { - super(htmlDocument, formOptions); - abortIfElementMissing("#biometricimage"); - - this.referenceValue = ISNOTNULL(getElementEnsureNotNull("#vergleichswert").ownText()); - this.pollingURI = getLongPollURI(); - } - } - - public static class Fido2Block extends TopLevelFormBlock { - public final @Nonnull String fidoOptions; - private final @Nonnull String credentialResultKey; - - public void setFIDOResult(String result) { formOptions.put(credentialResultKey, result); } - - private Fido2Block(@Nonnull org.jsoup.nodes.Document htmlDocument, @Nonnull Map<String, String> formOptions) throws ComponentParseFailed { - super(htmlDocument, formOptions); - abortIfElementMissing("#fidoBlock"); - this.fidoOptions = getAttributeEnsureNotNull("#credentialOptions", "value"); - this.credentialResultKey = getAttributeEnsureNotNull("#credentialResult", "name"); - } - } - - public static class HTMLResult { - public final @Nonnull org.jsoup.nodes.Document htmlDocument; - public final @Nonnull URI formTarget; - public final @Nonnull Map<String, String> formOptions = new HashMap<>(); - - public @Nonnull Iterable<Map.Entry<String, String>> iterateFormOptions() { return ISNOTNULL(formOptions.entrySet()); } - - /* optional links (any number may or may not be null) */ - public final @CheckForNull URI signatureDataLink; - public final @CheckForNull URI smsTanLink; - public final @CheckForNull URI fido2Link; - - /* top-level blocks (exactly one is not null) */ - public final @CheckForNull AutoSkipBlock autoSkipBlock; - public final @CheckForNull InterstitialBlock interstitialBlock; - public final @CheckForNull ErrorBlock errorBlock; - public final @CheckForNull UsernamePasswordBlock usernamePasswordBlock; - public final @CheckForNull SMSTanBlock smsTanBlock; - public final @CheckForNull QRCodeBlock qrCodeBlock; - public final @CheckForNull WaitingForAppBlock waitingForAppBlock; - public final @CheckForNull WaitingForBiometryBlock waitingForBiometryBlock; - public final @CheckForNull Fido2Block fido2Block; - - private void validate() { - Set<String> populated = new HashSet<>(); - - if (autoSkipBlock != null) populated.add("autoSkipBlock"); - if (interstitialBlock != null) populated.add("interstitialBlock"); - if (errorBlock != null) populated.add("errorBlock"); - if (usernamePasswordBlock != null) populated.add("usernamePasswordBlock"); - if (smsTanBlock != null) populated.add("smsTanBlock"); - if (qrCodeBlock != null) populated.add("qrCodeBlock"); - if (waitingForAppBlock != null) populated.add("waitingForAppBlock"); - if (waitingForBiometryBlock != null) populated.add("waitingForBiometryBlock"); - if (fido2Block != null) populated.add("fido2Block"); - - switch (populated.size()) { - case 0: log.error("Did not find any top-level blocks.\n{}", this.htmlDocument.toString()); break; - case 1: /* passed */ return; - default: log.error("Found too many top-level blocks: {}\n", String.join(", ", populated), this.htmlDocument.toString()); break; - } - throw new IllegalArgumentException("Unknown A-Trust page reached?"); - } - - private @Nullable URI getHrefIfExists(String selector) { - var elm = htmlDocument.selectFirst(selector); - if (elm == null) return null; - - String url = elm.absUrl("href"); - try { - return new URI(url); - } catch (Exception e) { - log.warn("Invalid {} href attribute: {} ({})", selector, elm.attr("href"), url); - return null; - } - } - - /** - * tries to parse T using its constructor; if ComponentParseFailed is thrown, swallows it - */ - private <T extends TopLevelFormBlock> @Nullable T TryParseMainBlock(Class<T> clazz) { - try { - return clazz.getDeclaredConstructor(org.jsoup.nodes.Document.class, Map.class).newInstance(this.htmlDocument, this.formOptions); - } catch (NoSuchMethodException | InstantiationException | IllegalAccessException | IllegalArgumentException | SecurityException e) { - log.error("Internal parser error; check your method signatures?", e); - return null; - } catch (InvocationTargetException wrappedE) { - Throwable e = wrappedE.getCause(); - if (!(e instanceof ComponentParseFailed)) { - if (e instanceof RuntimeException) - throw (RuntimeException)e; - log.warn("Unexpected parser failure.", e); - } - return null; - } - } - - private HTMLResult(@Nonnull org.jsoup.nodes.Document htmlDocument) { - log.trace("Now parsing:\n{}", htmlDocument.toString()); - this.htmlDocument = htmlDocument; - - var forms = htmlDocument.getElementsByTag("form"); - if (forms.size() != 1) { - log.error("Found {} forms in A-Trust response document, expected 1. Document:\n{}", forms.size(), htmlDocument.toString()); - throw new IllegalArgumentException("Failed to parse A-Trust response page"); - } - - var mainForm = ISNOTNULL(forms.first()); /* size check above */ - String formAction = mainForm.absUrl("action"); - try { - this.formTarget = new URI(formAction); - } catch (URISyntaxException e) { - log.error("Invalid form target in page: {} ({})", mainForm.attr("action"), formAction, e); - throw new IllegalArgumentException("Failed to parse A-Trust response page"); - } - - for (var input : mainForm.select("input")) { - String name = input.attr("name"); - - if (name.isEmpty()) - continue; - - /* submit inputs omitted here, they only get sent if they are "clicked", cf. MobileBKUConnector::buildFormSubmit */ - if ("submit".equalsIgnoreCase(input.attr("type"))) - continue; - - this.formOptions.put(name, input.attr("value")); - } - - this.signatureDataLink = getHrefIfExists("#LinkList a[href*=\"ShowSigobj.aspx\"]"); /* grr, they didn't give it an ID */ - this.smsTanLink = getHrefIfExists("#SmsButton"); - this.fido2Link = getHrefIfExists("#FidoButton"); // TODO hide the button if unsupported? - - this.autoSkipBlock = TryParseMainBlock(AutoSkipBlock.class); - this.interstitialBlock = TryParseMainBlock(InterstitialBlock.class); - this.errorBlock = TryParseMainBlock(ErrorBlock.class); - this.usernamePasswordBlock = TryParseMainBlock(UsernamePasswordBlock.class); - this.smsTanBlock = TryParseMainBlock(SMSTanBlock.class); - this.qrCodeBlock = TryParseMainBlock(QRCodeBlock.class); - this.waitingForAppBlock = TryParseMainBlock(WaitingForAppBlock.class); - this.waitingForBiometryBlock = TryParseMainBlock(WaitingForBiometryBlock.class); - this.fido2Block = TryParseMainBlock(Fido2Block.class); - - validate(); - } - } - - public static class Result { - public final @CheckForNull String slResponse; - public final @CheckForNull HTMLResult html; - - private Result(@Nonnull String slResponse) { this.slResponse = slResponse; this.html = null; } - private Result(@Nonnull org.jsoup.nodes.Document htmlDocument) { this.slResponse = null; this.html = new HTMLResult(htmlDocument); } - } - - public static @Nonnull Result Parse(@Nonnull org.jsoup.nodes.Document htmlDocument) { return new Result(htmlDocument); } - - public static @Nonnull Result Parse(URI baseURI, String contentType, @Nonnull String content) { - if (contentType.equals("text/html")) - { - var document = Jsoup.parse(content, baseURI.toASCIIString()); - if (document == null) - { - log.error("Failed to parse HTML (document == null):\n{}", content); - throw new IllegalArgumentException("A-Trust parsing failed"); - } - return Parse(document); - } - - if (contentType.endsWith("/xml")) - return new Result(content); - - log.error("Unknown content-type \"{}\" from URI {}", contentType, baseURI.toString()); - throw new IllegalArgumentException("Unknown A-Trust page reached?"); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/bku/mobile/MobileBKUValidator.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/bku/mobile/MobileBKUValidator.java deleted file mode 100644 index 89dbdf4f..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/bku/mobile/MobileBKUValidator.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.bku.mobile; - -// Imports -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import at.asit.pdfover.gui.exceptions.InvalidPasswordException; -import at.asit.pdfover.gui.exceptions.PasswordTooLongException; -import at.asit.pdfover.gui.exceptions.PasswordTooShortException; - -/** - * - */ -public class MobileBKUValidator { - - /** - * Regular expression for mobile phone numbers: this allows the entry of - * mobile numbers in the following formats: - * - * +(countryCode)99999999999 00(countryCode)99999999999 099999999999 - * 1030199999999999 (A-Trust Test bku) - */ - private static final String NUMBER_REGEX = "^((\\+[\\d]{2})|(00[\\d]{2})|(0)|(10301))([1-9][\\d]+)$"; - - /** - * Validates the Mobile phone number - * - * @param number - * @return the normalized Phone number - */ - public static String normalizeMobileNumber(String number) { - // Verify number and normalize - - number = number.trim(); - - String numberWithoutWhitespace = number.replaceAll("\\s",""); - // Compile and use regular expression - Pattern pattern = Pattern.compile(NUMBER_REGEX); - Matcher matcher = pattern.matcher(numberWithoutWhitespace); - - if (!matcher.find()) - return number; /* might be an idA username, return unchanged */ - - if (matcher.groupCount() != 6) { - return number; - } - - String countryCode = matcher.group(1); - - String normalNumber = matcher.group(6); - - if (countryCode.equals("10301")) { - // A-Trust Testnumber! Don't change - return numberWithoutWhitespace; - } - - countryCode = countryCode.replace("00", "+"); - - if (countryCode.equals("0")) { - countryCode = "+43"; - } - - return countryCode + normalNumber; - } - - /** - * Validate given Password for Mobile BKU - * - * @param password - * @throws InvalidPasswordException - */ - public static void validatePassword(String password) - throws InvalidPasswordException { - if (password.length() < 5) - throw new PasswordTooShortException(); - if (password.length() > 200) - throw new PasswordTooLongException(); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/Argument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/Argument.java deleted file mode 100644 index 16a47a42..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/Argument.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.workflow.StateMachine; -import at.asit.pdfover.gui.workflow.Status; -import at.asit.pdfover.gui.workflow.config.ConfigurationManager; - -/** - * CLI Argument base class - * - * Implementing arguments have to be registered in PrepareConfigurationState - */ -public abstract class Argument { - - private String helpTextKey = null; - - private String[] commandOptions = null; - - private StateMachine stateMachine; - - /** - * @param commandOptions - * @param helpTextKey - */ - protected Argument(String[] commandOptions, String helpTextKey) { - this.helpTextKey = helpTextKey; - this.commandOptions = commandOptions; - } - - /** - * Set the state machine - * Used for configuration overlay manipulator and status - * @param stateMachine the state machine - */ - protected void setStateMachine(StateMachine stateMachine) { - this.stateMachine = stateMachine; - } - - protected ConfigurationManager getConfiguration() { - return this.stateMachine.configProvider; - } - - /** - * Get the status - * @return the status - */ - protected Status getStatus() { - return this.stateMachine.status; - } - - /** - * Set help text key - * @param key - */ - protected void setHelpTextKey(String key) { - this.helpTextKey = key; - } - - /** - * Gets help text - * @return help text - */ - public String getHelpText() { - return Messages.getString(this.helpTextKey); - } - - /** - * Set the command option in format: -... - * - * Examples: -h - * - * @param value - */ - protected void setCommandOptions(String[] value) { - this.commandOptions = value; - } - - /** - * Get the command option - * - * Examples: -h - * @return the command option - */ - public String[] getCommandOptions() { - return this.commandOptions; - } - - /** - * Invokes the argument to set stuff within the stateMachine - * - * It should return the offset within the args array where the last used argument of this Argument was used. - * - * Example: - * args[] = { "-h", "-b", "LOCAL" } - * - * Help Argument call: - * offset = 0 - * returns 0 - * - * BKU Argument call: - * offset = 1 - * returns 2 - * - * @param args - * @param argOffset - * @param handler - * @return returns the argumentOffset ending the section of this Argument - * @throws InitializationException - */ - public abstract int handleArgument(String[] args, int argOffset, ArgumentHandler handler) throws InitializationException; -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ArgumentHandler.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ArgumentHandler.java deleted file mode 100644 index 108ccb47..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ArgumentHandler.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.gui.workflow.StateMachine; - -/** - * Handler to process CLI Arguments - */ -public class ArgumentHandler { - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(ArgumentHandler.class); - - private Map<String, Argument> cliArguments = new LinkedHashMap<String, Argument>(); - - private StateMachine stateMachine = null; - - private boolean requiredExit = false; - - /** - * Constructor - * - * @param stateMachine - */ - public ArgumentHandler(StateMachine stateMachine) { - this.stateMachine = stateMachine; - } - - /** - * Gets available Arguments - * - * @return the list of available arguments - */ - public Set<Argument> getArguments() { - return new LinkedHashSet<Argument>(this.cliArguments.values()); - } - - /** - * Adds a CLIArgument to the handler - * - * @param cliArgument the CLIArgument subclass to add - */ - public void addCLIArgument(Class<? extends Argument> cliArgument) { - - Argument arg; - try { - arg = cliArgument.getDeclaredConstructor().newInstance(); - - arg.setStateMachine(this.stateMachine); - - String[] commandOptions = arg.getCommandOptions(); - - if (commandOptions == null) { - return; - } - - for (int i = 0; i < commandOptions.length; i++) { - this.cliArguments.put(commandOptions[i], arg); - } - } catch (Exception e) { - log.error("Error instantiating CLI argument" , e); - } - } - - /** - * Handle CLI Arguments - * - * @param args - * @throws InitializationException - */ - public void handleArguments(String[] args) throws InitializationException { - - for (int i = 0; i < args.length; i++) { - if (this.cliArguments.containsKey(args[i])) { - i = this.cliArguments.get(args[i]).handleArgument(args, i, this); - } else { - // Assume we got the document we want to sign - if (this.cliArguments.containsKey("-i")) { - i = this.cliArguments.get("-i").handleArgument(args, i-1, this); - } - } - } - } - - /** - * Set by a cli argument if it wants the program to exit - * - * @param requireExit - */ - public void setRequireExit(boolean requireExit) { - this.requiredExit = requireExit; - } - - /** - * Checks if one argument required the program to exit immediately - * - * @return true or false - */ - public boolean doesRequireExit() { - return this.requiredExit; - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/AutomaticPositioningArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/AutomaticPositioningArgument.java deleted file mode 100644 index 23d00c06..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/AutomaticPositioningArgument.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -import at.asit.pdfover.gui.exceptions.InitializationException; - -/** - * CLI Argument to set the BKU to use - */ -public class AutomaticPositioningArgument extends Argument { - /** - * Constructor - */ - public AutomaticPositioningArgument() { - super(new String[] { "-a" }, "argument.help.autopos"); - } - - /* - * (non-Javadoc) - * - * @see - * at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang - * .String[], int, at.asit.pdfover.gui.workflow.StateMachine, - * at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - getConfiguration().setAutoPositionSignatureOverlay(); - return argOffset; - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/BKUArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/BKUArgument.java deleted file mode 100644 index e69383f7..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/BKUArgument.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.BKUs; -import at.asit.pdfover.commons.Messages; - -/** - * CLI Argument to set the BKU to use - */ -public class BKUArgument extends Argument { - /** - * Constructor - */ - public BKUArgument() { - super( - new String[] { "-b" }, "argument.help.bku"); - } - - /* - * (non-Javadoc) - * - * @see - * at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang - * .String[], int, at.asit.pdfover.gui.workflow.StateMachine, - * at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - try { - if (args.length > argOffset + 1) { - - BKUs argumentValue = BKUs.valueOf(args[argOffset + 1]); - - getConfiguration().setDefaultBKUOverlay(argumentValue); - - return argOffset + 1; - } - } catch (Exception ex) { - throw new InitializationException( - Messages.getString("argument.invalid.bku") + this.getHelpText(), ex); - } - - throw new InitializationException( - Messages.getString("argument.invalid.bku") + this.getHelpText(), null); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ConfigFileArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ConfigFileArgument.java deleted file mode 100644 index 725a28f9..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ConfigFileArgument.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.Messages; - -/** - * CLI Argument to set the configuration file - */ -public class ConfigFileArgument extends Argument { - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(ConfigFileArgument.class); - - /** - * Constructor - */ - public ConfigFileArgument() { - super(new String[] {"-c"}, "argument.help.config"); - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang.String[], int, at.asit.pdfover.gui.workflow.StateMachine, at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - try { - if (args.length > argOffset + 1) { - - String configFile = args[argOffset + 1]; - - getConfiguration().setConfigurationFileName(configFile); - - return argOffset + 1; - } - } catch (Exception ex) { - log.error("Configuration File Argument invalid!", ex); - throw new InitializationException( - Messages.getString("argument.invalid.config") + this.getHelpText(), ex); - } - - throw new InitializationException( - Messages.getString("argument.invalid.config") + this.getHelpText(), null); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/EmblemArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/EmblemArgument.java deleted file mode 100644 index fe88d37e..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/EmblemArgument.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports -import java.io.File; -import java.io.FileNotFoundException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.Messages; - -/** - * CLI Argument to set the emblem file to use for signature - */ -public class EmblemArgument extends Argument { - /** - * Constructor - */ - public EmblemArgument() { - super(new String[] {"-e"}, "argument.help.emblem"); - } - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(EmblemArgument.class); - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang.String[], int, at.asit.pdfover.gui.workflow.StateMachine, at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - try { - if (args.length > argOffset + 1) { - - String emblem = args[argOffset + 1]; - - File emblemFile = new File(emblem); - - if(!emblemFile.exists()) { - throw new FileNotFoundException(emblem); - } - - getConfiguration().setDefaultEmblemOverlay(emblem); - - return argOffset + 1; - } - } catch (Exception ex) { - log.error("Emblem argument invalid!", ex); - throw new InitializationException( - Messages.getString("argument.invalid.emblem") + this.getHelpText(), ex); - } - - throw new InitializationException( - Messages.getString("argument.invalid.emblem") + this.getHelpText(), null); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/HelpArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/HelpArgument.java deleted file mode 100644 index 0bcdaba6..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/HelpArgument.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports -import java.util.Iterator; -import java.util.Set; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.commons.Messages; - -/** - * CLI Argument to show the useage message - */ -public class HelpArgument extends Argument { - - /** - * Constructor - */ - public HelpArgument() { - super(new String[] {"-h", "-?", "--help" }, - "argument.help.help"); - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang.String[], int, at.asit.pdfover.gui.workflow.StateMachine, at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - Set<Argument> arguments = handler.getArguments(); - - Iterator<Argument> argumentIterator = arguments.iterator(); - - StringBuilder message = new StringBuilder(Messages.getString("argument.info.help")); - message.append("\n"); - - while(argumentIterator.hasNext()) { - Argument argument = argumentIterator.next(); - - for (int i = 0; i < argument.getCommandOptions().length; i++) { - message.append(argument.getCommandOptions()[i]); - - if(i < argument.getCommandOptions().length -1) { - message.append(", "); - } - } - - message.append(":\n"); - boolean first = true; - for (String line : argument.getHelpText().split("\\.\\s+")) { - message.append(" "); - if (first) first = false; else message.append(" "); - message.append(line); - message.append("\n"); - } - } - - String msg = message.toString(); - System.out.println(msg); - - Display display = Display.getCurrent(); - if (display != null) { - MessageBox box = new MessageBox(new Shell(display), SWT.ICON_INFORMATION | SWT.OK); - box.setText(Constants.APP_NAME_VERSION); - box.setMessage(msg); - box.open(); - } - - handler.setRequireExit(true); - - return argOffset; - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/InputDocumentArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/InputDocumentArgument.java deleted file mode 100644 index b636b825..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/InputDocumentArgument.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports -import java.io.File; -import java.io.FileNotFoundException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.Messages; - -/** - * CLI Argument to set the input document to sign - */ -public class InputDocumentArgument extends Argument { - /** - * Constructor - */ - public InputDocumentArgument() { - super(new String[] {"-i"}, "argument.help.input"); - } - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(InputDocumentArgument.class); - - /* (non-Javadoc) - * @see at.asit.pdfovewr.gui.cliarguments.CLIArgument#handleArgument(java.lang.String[], int, at.asit.pdfover.gui.workflow.StateMachine, at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - try { - if (args.length > argOffset + 1) { - - String signatureDocument = args[argOffset + 1]; - - File signatureDocumentFile = new File(signatureDocument); - - if(!signatureDocumentFile.exists()) { - throw new FileNotFoundException(signatureDocument); - } - - getStatus().document = signatureDocumentFile; - - return argOffset + 1; - } - } catch (Exception ex) { - log.error("Document to sign argument invalid!", ex); - throw new InitializationException( - Messages.getString("argument.invalid.input") + this.getHelpText(), ex); - } - - throw new InitializationException( - Messages.getString("argument.invalid.input") + this.getHelpText(), null); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/InvisibleProfile.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/InvisibleProfile.java deleted file mode 100644 index f3e7c1e2..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/InvisibleProfile.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.signer.pdfas.PdfAs4SignatureParameter; - -/** - * CLI Argument to set the visibility of signature - */ -public class InvisibleProfile extends Argument { - /** - * Constructor - */ - public InvisibleProfile() { - super(new String[] {"-v"}, "argument.help.vis"); - } - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(InvisibleProfile.class); - - /* (non-Javadoc) - * @see at.asit.pdfovewr.gui.cliarguments.CLIArgument#handleArgument(java.lang.String[], int, at.asit.pdfover.gui.workflow.StateMachine, at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - try { - log.info("Set Profile Invisible"); - - if (args.length > argOffset + 1) { - // TODO: this is a colossal monumental terrible hack - PdfAs4SignatureParameter.PROFILE_VISIBILITY=false; - log.debug("We are setting the profile visibility to false"); - return argOffset + 1; - } - - } catch (Exception ex) { - log.error("Signature Profile Visibilty Error", ex); - throw new InitializationException( - Messages.getString("argument.invalid.vis") + this.getHelpText(), ex); - } - - throw new InitializationException( - Messages.getString("argument.invalid.vis") + this.getHelpText(), null); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/KeystoreAliasArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/KeystoreAliasArgument.java deleted file mode 100644 index 1ef7531e..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/KeystoreAliasArgument.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.Messages; - -/** - * CLI Argument to provide the keystore alias - */ -public class KeystoreAliasArgument extends Argument { - /** - * Constructor - */ - public KeystoreAliasArgument() { - super(new String[] {"-ksalias"}, "argument.help.keystorealias"); - } - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(KeystoreAliasArgument.class); - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang.String[], int, at.asit.pdfover.gui.workflow.StateMachine, at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - try { - if (args.length > argOffset + 1) { - - String ksAlias = args[argOffset + 1]; - - getConfiguration().setKeyStoreAliasOverlay(ksAlias); - - return argOffset + 1; - } - } catch (Exception ex) { - log.error("Keystore alias argument invalid!", ex); - throw new InitializationException( - Messages.getString("argument.invalid.keystorealias") + this.getHelpText(), ex); - } - - throw new InitializationException( - Messages.getString("argument.invalid.keystorealias") + this.getHelpText(), null); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/KeystoreFileArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/KeystoreFileArgument.java deleted file mode 100644 index adc40dae..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/KeystoreFileArgument.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports -import java.io.File; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.gui.exceptions.KeystoreDoesntExistException; -import at.asit.pdfover.commons.Messages; - -/** - * CLI Argument to provide the keystore file - */ -public class KeystoreFileArgument extends Argument { - /** - * Constructor - */ - public KeystoreFileArgument() { - super(new String[] {"-ks"}, "argument.help.keystorefile"); - } - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(KeystoreFileArgument.class); - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang.String[], int, at.asit.pdfover.gui.workflow.StateMachine, at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - try { - if (args.length > argOffset + 1) { - - String ksFile = args[argOffset + 1]; - - File ks = new File(ksFile); - if(!ks.exists() || !ks.isFile()) - throw new KeystoreDoesntExistException(ks, 0); - - getConfiguration().setKeyStoreFileOverlay(ksFile); - getConfiguration().setKeyStoreEnabledOverlay(true); - - return argOffset + 1; - } - } catch (Exception ex) { - log.error("Keystore file argument invalid!", ex); - throw new InitializationException( - Messages.getString("argument.invalid.keystorefile") + this.getHelpText(), ex); - } - - throw new InitializationException( - Messages.getString("argument.invalid.keystorefile") + this.getHelpText(), null); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/KeystoreKeyPassArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/KeystoreKeyPassArgument.java deleted file mode 100644 index f41bbeaa..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/KeystoreKeyPassArgument.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.Messages; - -/** - * CLI Argument to provide the keystore key password - */ -public class KeystoreKeyPassArgument extends Argument { - /** - * Constructor - */ - public KeystoreKeyPassArgument() { - super(new String[] {"-kskeypass"}, "argument.help.keystorekeypass"); - } - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(KeystoreKeyPassArgument.class); - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang.String[], int, at.asit.pdfover.gui.workflow.StateMachine, at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - try { - if (args.length > argOffset + 1) { - - String ksKeyPass = args[argOffset + 1]; - - getConfiguration().setKeyStoreKeyPassOverlay(ksKeyPass); - - return argOffset + 1; - } - } catch (Exception ex) { - log.error("Keystore key password argument invalid!", ex); - throw new InitializationException( - Messages.getString("argument.invalid.keystorekeypass") + this.getHelpText(), ex); - } - - throw new InitializationException( - Messages.getString("argument.invalid.keystorekeypass") + this.getHelpText(), null); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/KeystoreStorePassArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/KeystoreStorePassArgument.java deleted file mode 100644 index 3c759743..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/KeystoreStorePassArgument.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.Messages; - -/** - * CLI Argument to provide the keystore password - */ -public class KeystoreStorePassArgument extends Argument { - /** - * Constructor - */ - public KeystoreStorePassArgument() { - super(new String[] {"-kspass"}, "argument.help.keystorestorepass"); - } - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(KeystoreStorePassArgument.class); - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang.String[], int, at.asit.pdfover.gui.workflow.StateMachine, at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - try { - if (args.length > argOffset + 1) { - - String ksStorePass = args[argOffset + 1]; - - getConfiguration().setKeyStoreStorePassOverlay(ksStorePass); - - return argOffset + 1; - } - } catch (Exception ex) { - log.error("Keystore password argument invalid!", ex); - throw new InitializationException( - Messages.getString("argument.invalid.keystorestorepass") + this.getHelpText(), ex); - } - - throw new InitializationException( - Messages.getString("argument.invalid.keystorestorepass") + this.getHelpText(), null); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/KeystoreTypeArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/KeystoreTypeArgument.java deleted file mode 100644 index fa29ba5d..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/KeystoreTypeArgument.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.Messages; - -/** - * CLI Argument to provide the keystore type - */ -public class KeystoreTypeArgument extends Argument { - /** - * Constructor - */ - public KeystoreTypeArgument() { - super(new String[] {"-kstype"}, "argument.help.keystoretype"); - } - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(KeystoreTypeArgument.class); - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang.String[], int, at.asit.pdfover.gui.workflow.StateMachine, at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - try { - if (args.length > argOffset + 1) { - - String ksType = args[argOffset + 1]; - - getConfiguration().setKeyStoreTypeOverlay(ksType); - - return argOffset + 1; - } - } catch (Exception ex) { - log.error("Keystore type argument invalid!", ex); - throw new InitializationException( - Messages.getString("argument.invalid.keystoretype") + this.getHelpText(), ex); - } - - throw new InitializationException( - Messages.getString("argument.invalid.keystoretype") + this.getHelpText(), null); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/OutputFolderArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/OutputFolderArgument.java deleted file mode 100644 index 047bf79c..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/OutputFolderArgument.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.Messages; - -/** - * CLI Argument to show the usage message - */ -public class OutputFolderArgument extends Argument { - /** - * Constructor - */ - public OutputFolderArgument() { - super(new String[] {"-o"}, "argument.help.output"); - } - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(OutputFolderArgument.class); - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang.String[], int, at.asit.pdfover.gui.workflow.StateMachine, at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - try { - if (args.length > argOffset + 1) { - String outputFolder = args[argOffset + 1]; - -// File outputFolderDir = new File(outputFolder); -// if(!outputFolderDir.exists()) { -// throw new FileNotFoundException(outputFolder); -// } -// if(!outputFolderDir.isDirectory()) { -// throw new IOException(outputFolderDir + Messages.getString("argument.error.output")); -// } - - getConfiguration().setDefaultOutputFolderOverlay(outputFolder); - - return argOffset + 1; - } - } catch (Exception ex) { - log.error("Output folder argument invalid!", ex); - throw new InitializationException( - Messages.getString("argument.invalid.output") + this.getHelpText(), ex); - } - - throw new InitializationException( - Messages.getString("argument.invalid.output") + this.getHelpText(), null); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/PasswordArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/PasswordArgument.java deleted file mode 100644 index cbfb1925..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/PasswordArgument.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.bku.mobile.MobileBKUValidator; -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.Messages; - -/** - * CLI Argument to provide Mobile BKU password - */ -public class PasswordArgument extends Argument { - /** - * Constructor - */ - public PasswordArgument() { - super(new String[] {"-p"}, "argument.help.password"); - } - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(PasswordArgument.class); - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang.String[], int, at.asit.pdfover.gui.workflow.StateMachine, at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - try { - if (args.length > argOffset + 1) { - - String password = args[argOffset + 1]; - - MobileBKUValidator.validatePassword(password); - - getConfiguration().setDefaultMobilePasswordOverlay(password); - - return argOffset + 1; - } - } catch (Exception ex) { - log.error("Mobile BKU password argument invalid!", ex); - throw new InitializationException( - Messages.getString("argument.invalid.password") + this.getHelpText(), ex); - } - - throw new InitializationException( - Messages.getString("argument.invalid.password") + this.getHelpText(), null); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/PhoneNumberArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/PhoneNumberArgument.java deleted file mode 100644 index cc43d7e3..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/PhoneNumberArgument.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.bku.mobile.MobileBKUValidator; -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.Messages; - -/** - * CLI Argument to provide Mobile BKU phone number to use - */ -public class PhoneNumberArgument extends Argument { - /** - * Constructor - */ - public PhoneNumberArgument() { - super(new String[] {"-n" }, "argument.help.number"); - } - - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(PhoneNumberArgument.class); - - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang.String[], int, at.asit.pdfover.gui.workflow.StateMachine, at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - - try { - if (args.length > argOffset + 1) { - - String number = args[argOffset + 1]; - - number = MobileBKUValidator.normalizeMobileNumber(number); - - getConfiguration().setDefaultMobileNumberOverlay(number); - - return argOffset + 1; - } - } catch (Exception ex) { - log.error("Phone Number Argument invalid!", ex); - throw new InitializationException( - Messages.getString("argument.invalid.number") + this.getHelpText(), ex); - } - - throw new InitializationException( - Messages.getString("argument.invalid.number") + this.getHelpText(), null); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ProxyHostArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ProxyHostArgument.java deleted file mode 100644 index a77872e5..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ProxyHostArgument.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.Messages; - -/** - * CLI Argument to provide the proxy host - */ -public class ProxyHostArgument extends Argument { - /** - * Constructor - */ - public ProxyHostArgument() { - super(new String[] {"-proxy"}, "argument.help.proxyhost"); - } - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(ProxyHostArgument.class); - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang.String[], int, at.asit.pdfover.gui.workflow.StateMachine, at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - try { - if (args.length > argOffset + 1) { - - String proxyHost = args[argOffset + 1]; - - getConfiguration().setProxyHostOverlay(proxyHost); - - return argOffset + 1; - } - } catch (Exception ex) { - log.error("Proxy host argument invalid!", ex); - throw new InitializationException( - Messages.getString("argument.invalid.proxyhost") + this.getHelpText(), ex); - } - - throw new InitializationException( - Messages.getString("argument.invalid.proxyhost") + this.getHelpText(), null); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ProxyPassArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ProxyPassArgument.java deleted file mode 100644 index f9c4e533..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ProxyPassArgument.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.Messages; - -/** - * CLI Argument to provide the proxy password - */ -public class ProxyPassArgument extends Argument { - /** - * Constructor - */ - public ProxyPassArgument() { - super(new String[] {"-proxypass"}, "argument.help.proxypass"); - } - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(ProxyPassArgument.class); - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang.String[], int, at.asit.pdfover.gui.workflow.StateMachine, at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - try { - if (args.length > argOffset + 1) { - - String proxyPass = args[argOffset + 1]; - - getConfiguration().setProxyPassOverlay(proxyPass); - - return argOffset + 1; - } - } catch (Exception ex) { - log.error("Proxy password argument invalid!", ex); - throw new InitializationException( - Messages.getString("argument.invalid.proxypass") + this.getHelpText(), ex); - } - - throw new InitializationException( - Messages.getString("argument.invalid.proxypass") + this.getHelpText(), null); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ProxyPortArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ProxyPortArgument.java deleted file mode 100644 index ff9e84df..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ProxyPortArgument.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.gui.exceptions.InvalidPortException; -import at.asit.pdfover.commons.Messages; - -/** - * CLI Argument to provide the proxy port - */ -public class ProxyPortArgument extends Argument { - /** - * Constructor - */ - public ProxyPortArgument() { - super(new String[] {"-proxyport"}, "argument.help.proxyport"); - } - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(ProxyPortArgument.class); - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang.String[], int, at.asit.pdfover.gui.workflow.StateMachine, at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - try { - if (args.length > argOffset + 1) { - - String proxyPortString = args[argOffset + 1]; - - int port = Integer.parseInt(proxyPortString); - - if(port <= 0 || port > 0xFFFF) { - throw new InvalidPortException(port); - } - - getConfiguration().setProxyPortOverlay(port); - - return argOffset + 1; - } - } catch (Exception ex) { - log.error("Proxy port argument invalid!", ex); - throw new InitializationException( - Messages.getString("argument.invalid.proxyport") + this.getHelpText(), ex); - } - - throw new InitializationException( - Messages.getString("argument.invalid.proxyport") + this.getHelpText(), null); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ProxyUserArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ProxyUserArgument.java deleted file mode 100644 index 82944f9b..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/ProxyUserArgument.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -// Imports -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.Messages; - -/** - * CLI Argument to provide the proxy username - */ -public class ProxyUserArgument extends Argument { - /** - * Constructor - */ - public ProxyUserArgument() { - super(new String[] {"-proxyuser"}, "argument.help.proxyuser"); - } - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(ProxyUserArgument.class); - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang.String[], int, at.asit.pdfover.gui.workflow.StateMachine, at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - try { - if (args.length > argOffset + 1) { - - String proxyUser = args[argOffset + 1]; - - getConfiguration().setProxyUserOverlay(proxyUser); - - return argOffset + 1; - } - } catch (Exception ex) { - log.error("Proxy username argument invalid!", ex); - throw new InitializationException( - Messages.getString("argument.invalid.proxyuser") + this.getHelpText(), ex); - } - - throw new InitializationException( - Messages.getString("argument.invalid.proxyuser") + this.getHelpText(), null); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/SkipFinishArgument.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/SkipFinishArgument.java deleted file mode 100644 index 0c4247fd..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/cliarguments/SkipFinishArgument.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.cliarguments; - -import at.asit.pdfover.gui.exceptions.InitializationException; - -/** - * CLI Argument to set the BKU to use - */ -public class SkipFinishArgument extends Argument { - /** - * Constructor - */ - public SkipFinishArgument() { - super(new String[] { "-s" }, "argument.help.skipfinish"); - } - - /* - * (non-Javadoc) - * - * @see - * at.asit.pdfover.gui.cliarguments.CLIArgument#handleArgument(java.lang - * .String[], int, at.asit.pdfover.gui.workflow.StateMachine, - * at.asit.pdfover.gui.cliarguments.ArgumentHandler) - */ - @Override - public int handleArgument(String[] args, int argOffset, - ArgumentHandler handler) - throws InitializationException { - getConfiguration().setSkipFinishOverlay(true); - return argOffset; - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/BKUSelectionComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/BKUSelectionComposite.java deleted file mode 100644 index 9c73c2e5..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/BKUSelectionComposite.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.composites; - -// Imports -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.BKUs; -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.gui.controls.ClickableCanvas; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.gui.workflow.states.State; - -/** - * Composite for BKU selection - */ -public class BKUSelectionComposite extends StateComposite { - - static final Logger log = LoggerFactory.getLogger(BKUSelectionComposite.class); - - private BKUs selected = BKUs.NONE; - - private ClickableCanvas cc_mobile; - private ClickableCanvas cc_karte; - private Button btnMobile; - private Button btnCard; - private Button btnKS = null; - - public BKUs getSelected() { return this.selected; } - - public void setSelected(final BKUs selected) { - this.selected = selected; - this.state.updateStateMachine(); - } - - public void setLocalBKUEnabled(boolean state) { - this.btnCard.setEnabled(state); - this.cc_karte.setEnabled(false); - } - - /** - * Sets whether keystore option is enabled - * @param enabled - */ - public void setKeystoreEnabled(boolean enabled) { - if (enabled) { - this.btnKS = new Button(this, SWT.NONE); - SWTUtils.anchor(this.btnKS).top(this.btnCard, 10).left(this.btnMobile, 0, SWT.LEFT).right(this.btnCard, 0, SWT.RIGHT); - SWTUtils.addSelectionListener(btnKS, () -> { setSelected(BKUs.KS); }); - - reloadResources(); - } else if (this.btnKS != null) { - this.btnKS.dispose(); - this.btnKS = null; - } - } - - /** - * Create the composite. - * @param parent - * @param style - * @param state - */ - public BKUSelectionComposite(Composite parent, int style, State state) { - super(parent, style, state); - - this.setLayout(new FormLayout()); - - this.cc_mobile = new ClickableCanvas(this, SWT.NATIVE | SWT.RESIZE); - SWTUtils.anchor(cc_mobile).right(50, -5).top(40, -20); - Image mobile = new Image(getDisplay(), new ImageData(this.getClass().getResourceAsStream(Constants.RES_IMG_MOBILE))); - cc_mobile.setImage(mobile); - SWTUtils.setFontHeight(cc_mobile, Constants.TEXT_SIZE_BUTTON); - SWTUtils.addMouseDownListener(cc_mobile, () -> { setSelected(BKUs.MOBILE); }); - - this.cc_karte = new ClickableCanvas(this, SWT.NATIVE | SWT.RESIZE); - SWTUtils.anchor(cc_karte).left(50, 5).top(40, -20); - Image karte = new Image(getDisplay(), this.getClass().getResourceAsStream(Constants.RES_IMG_CARD)); - cc_karte.setImage(karte); - SWTUtils.setFontHeight(cc_karte, Constants.TEXT_SIZE_BUTTON); - SWTUtils.addMouseDownListener(cc_karte, () -> { setSelected(BKUs.LOCAL); }); - - - this.btnMobile = new Button(this, SWT.NONE); - SWTUtils.anchor(btnMobile).top(cc_mobile, 10).right(50,-5); - int mobilesize = cc_mobile.computeSize(SWT.DEFAULT, SWT.DEFAULT).x; - int btnmsize = this.btnMobile.computeSize(SWT.DEFAULT, SWT.DEFAULT).x; - SWTUtils.reanchor(btnMobile).width(Math.max(btnmsize, mobilesize)); - SWTUtils.addSelectionListener(btnMobile, () -> { setSelected(BKUs.MOBILE); }); - - this.btnCard = new Button(this, SWT.NONE); - SWTUtils.anchor(btnCard).top(cc_karte, 10).left(50,5); - int cardsize = cc_karte.computeSize(SWT.DEFAULT, SWT.DEFAULT).x; - int btncsize = this.btnCard.computeSize(SWT.DEFAULT, SWT.DEFAULT).x; - SWTUtils.reanchor(btnCard).width(Math.max(btncsize, cardsize)); - SWTUtils.addSelectionListener(btnCard, () -> { setSelected(BKUs.LOCAL); }); - - reloadResources(); - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.composites.StateComposite#reloadResources() - */ - @Override - public void reloadResources() { - SWTUtils.setLocalizedText(btnMobile, "bku_selection.mobile"); - SWTUtils.setLocalizedText(btnCard, "bku_selection.card"); - if (this.btnKS != null) - SWTUtils.setLocalizedText(btnKS, "bku_selection.ks"); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/ConfigurationComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/ConfigurationComposite.java deleted file mode 100644 index aa757305..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/ConfigurationComposite.java +++ /dev/null @@ -1,404 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.composites; - -import java.io.IOException; -import java.util.Iterator; -import java.util.NoSuchElementException; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.ScrolledComposite; -import org.eclipse.swt.custom.StackLayout; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.widgets.*; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.gui.controls.Dialog.BUTTONS; -import at.asit.pdfover.gui.composites.configuration.AboutComposite; -import at.asit.pdfover.gui.composites.configuration.AdvancedConfigurationComposite; -import at.asit.pdfover.gui.composites.configuration.ConfigurationCompositeBase; -import at.asit.pdfover.gui.composites.configuration.Fido2ConfigurationComposite; -import at.asit.pdfover.gui.composites.configuration.KeystoreConfigurationComposite; -import at.asit.pdfover.gui.composites.configuration.SimpleConfigurationComposite; -import at.asit.pdfover.gui.controls.ErrorDialog; -import at.asit.pdfover.gui.exceptions.ResumableException; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.workflow.config.ConfigurationManager; -import at.asit.pdfover.gui.workflow.config.ConfigurationDataInMemory; -import at.asit.pdfover.gui.workflow.states.State; - -/** - * Composite for hosting configuration composites - */ -public class ConfigurationComposite extends StateComposite { - - /** - * SLF4J Logger instance - **/ - static final Logger log = LoggerFactory.getLogger(ConfigurationComposite.class); - - /** - * configuration provider - */ - ConfigurationManager configProvider = null; - - /** - * simple configuration composite - */ - ConfigurationCompositeBase simpleConfigComposite; - - /** - * advanced configuration composite - */ - ConfigurationCompositeBase advancedConfigComposite; - - /** - * advanced configuration composite - */ - ConfigurationCompositeBase keystoreConfigComposite = null; - - ConfigurationCompositeBase fido2ConfigComposite; - - /** - * about page composite - */ - ConfigurationCompositeBase aboutConfigComposite; - - private final Iterable<ConfigurationCompositeBase> _compositeIterable = new Iterable<>() { - @Override - public Iterator<ConfigurationCompositeBase> iterator() { - return new Iterator<>() { - int i = 0; - @Override - public boolean hasNext() { - return i < 5; - } - - @Override - public ConfigurationCompositeBase next() { - if ((i == 2) && (keystoreConfigComposite == null)) ++i; - switch (++i) { - case 1: return simpleConfigComposite; - case 2: return advancedConfigComposite; - case 3: return keystoreConfigComposite; - case 4: return fido2ConfigComposite; - case 5: return aboutConfigComposite; - } - throw new NoSuchElementException(); - } - }; - } - }; - private Iterable<ConfigurationCompositeBase> composites() { return _compositeIterable; } - - /** - * The TabFolder - */ - TabFolder tabFolder; - - /** - * configuration container Keeps state for current configuration changes - */ - ConfigurationDataInMemory configurationContainer = new ConfigurationDataInMemory(); - - /** - * The stack layout - */ - StackLayout compositeStack = new StackLayout(); - - /** - * SWT style - */ - int style; - - /** - * base configuration container - */ - Composite containerComposite; - - /** - * checks whether the user is done - */ - boolean userDone = false; - - private TabItem simpleTabItem; - - private TabItem advancedTabItem; - - private TabItem keystoreTabItem; - - private TabItem fido2TabItem; - - private TabItem aboutTabItem; - - private Button btnSpeichern; - - private Button btnAbbrechen; - - /** - * Create the composite. - * - * @param parent - * @param style - * @param state - */ - public ConfigurationComposite(Composite parent, int style, State state) { - super(parent, SWT.FILL | style, state); - this.style = SWT.FILL | style; - - this.setLayout(new FormLayout()); - - this.containerComposite = new Composite(this, SWT.FILL | SWT.RESIZE); - - this.tabFolder = new TabFolder(this.containerComposite, SWT.NONE); - SWTUtils.anchor(tabFolder).bottom(100, -5).right(100, -5).top(0, 5).left(0, 5); - SWTUtils.setFontHeight(tabFolder, Constants.TEXT_SIZE_NORMAL); - - this.simpleTabItem = new TabItem(this.tabFolder, SWT.NONE); - ScrolledComposite simpleCompositeScr = new ScrolledComposite(this.tabFolder, (SWT.H_SCROLL | SWT.V_SCROLL)); - this.simpleTabItem.setControl(simpleCompositeScr); - this.simpleConfigComposite = new SimpleConfigurationComposite(simpleCompositeScr, SWT.NONE, state, configurationContainer); - simpleCompositeScr.setContent(simpleConfigComposite); - simpleCompositeScr.setExpandHorizontal(true); - simpleCompositeScr.setExpandVertical(true); - simpleCompositeScr.setMinSize(simpleConfigComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); - - this.advancedTabItem = new TabItem(this.tabFolder, SWT.NONE); - ScrolledComposite advancedCompositeScr = new ScrolledComposite(this.tabFolder, (SWT.H_SCROLL | SWT.V_SCROLL)); - this.advancedTabItem.setControl(advancedCompositeScr); - this.advancedConfigComposite = new AdvancedConfigurationComposite(advancedCompositeScr, SWT.NONE, state, configurationContainer, this); - advancedCompositeScr.setContent(advancedConfigComposite); - advancedCompositeScr.setExpandHorizontal(true); - advancedCompositeScr.setExpandVertical(true); - advancedCompositeScr.setMinSize(advancedConfigComposite.computeSize(SWT.DEFAULT, SWT.DEFAULT)); - - this.fido2TabItem = new TabItem(this.tabFolder, SWT.NONE); - ScrolledComposite fido2CompositeScr = new ScrolledComposite(this.tabFolder, (SWT.H_SCROLL | SWT.V_SCROLL)); - this.fido2TabItem.setControl(fido2CompositeScr); - this.fido2ConfigComposite = new Fido2ConfigurationComposite(fido2CompositeScr, SWT.NONE, state, configurationContainer); - fido2CompositeScr.setContent(fido2ConfigComposite); - fido2CompositeScr.setExpandHorizontal(true); - fido2CompositeScr.setExpandVertical(true); - fido2CompositeScr.addListener(SWT.Resize, (e) -> { - int widthHint = fido2CompositeScr.getClientArea().width - 50; /* offset for scroll bar */ - fido2CompositeScr.setMinSize(null); - fido2CompositeScr.setMinSize(fido2CompositeScr.computeSize(widthHint, SWT.DEFAULT)); - }); - - this.aboutTabItem = new TabItem(this.tabFolder, SWT.NONE); - ScrolledComposite aboutCompositeScr = new ScrolledComposite(this.tabFolder, (SWT.H_SCROLL | SWT.V_SCROLL)); - this.aboutTabItem.setControl(aboutCompositeScr); - this.aboutConfigComposite = new AboutComposite(aboutCompositeScr, SWT.NONE, state, configurationContainer); - aboutCompositeScr.setContent(aboutConfigComposite); - aboutCompositeScr.setExpandHorizontal(true); - aboutCompositeScr.setExpandVertical(true); - aboutCompositeScr.addListener(SWT.Resize, (event) -> { - int widthHint = aboutCompositeScr.getClientArea().width - 50; /* offset for scroll bar */ - aboutCompositeScr.setMinSize(null); - aboutCompositeScr.setMinSize(aboutCompositeScr.computeSize(widthHint, SWT.DEFAULT)); - }); - - this.tabFolder.setSelection(this.simpleTabItem); - - this.btnSpeichern = new Button(this, SWT.NONE); - SWTUtils.anchor(btnSpeichern).right(100, -5).bottom(100); - SWTUtils.setFontHeight(btnSpeichern, Constants.TEXT_SIZE_BUTTON); - this.btnSpeichern.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - getShell().setText(Constants.APP_NAME); - if (ConfigurationComposite.this.storeConfiguration()) { - ConfigurationComposite.this.userDone = true; - ConfigurationComposite.this.state.updateStateMachine(); - } - } - }); - - this.btnAbbrechen = new Button(this, SWT.NONE); - SWTUtils.anchor(btnAbbrechen).right(btnSpeichern, -10).bottom(btnSpeichern, 0, SWT.BOTTOM); - SWTUtils.setFontHeight(btnAbbrechen, Constants.TEXT_SIZE_BUTTON); - this.btnAbbrechen.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - getShell().setText(Constants.APP_NAME); - ConfigurationComposite.this.userDone = true; - ConfigurationComposite.this.state.updateStateMachine(); - } - }); - - SWTUtils.anchor(containerComposite).top(0, 5).bottom(btnSpeichern, -10).left(0, 5).right(100, -5); - this.containerComposite.setLayout(this.compositeStack); - this.compositeStack.topControl = this.tabFolder; - - getShell().setText(Constants.APP_NAME_VERSION + " [" + System.getProperty("java.vendor") + " Java " + System.getProperty("java.version") + "]"); - - reloadResources(); - this.doLayout(); - } - - private boolean keystoreInitialized = false; - - /** - * Set whether keystore tab is enabled - * @param enabled whether keystore tab is enabled - */ - public void keystoreEnabled(boolean enabled) { - if (enabled && this.keystoreConfigComposite == null) { - this.keystoreTabItem = new TabItem(this.tabFolder, SWT.NONE, 2); - SWTUtils.setLocalizedText(keystoreTabItem, "config.Keystore"); - - ScrolledComposite keystoreCompositeScr = new ScrolledComposite( - this.tabFolder, SWT.H_SCROLL | SWT.V_SCROLL); - this.keystoreTabItem.setControl(keystoreCompositeScr); - this.keystoreConfigComposite = new KeystoreConfigurationComposite( - keystoreCompositeScr, SWT.NONE, this.state, - this.configurationContainer); - keystoreCompositeScr.setContent(this.keystoreConfigComposite); - keystoreCompositeScr.setExpandHorizontal(true); - keystoreCompositeScr.setExpandVertical(true); - keystoreCompositeScr.setMinSize(this.keystoreConfigComposite - .computeSize(SWT.DEFAULT, SWT.DEFAULT)); - if (!this.keystoreInitialized) { - this.keystoreConfigComposite.initConfiguration(this.configProvider); - this.keystoreInitialized = true; - } - this.keystoreConfigComposite.loadConfiguration(); - - reloadResources(); - } else if (!enabled && this.keystoreConfigComposite != null){ - this.keystoreTabItem.dispose(); - this.keystoreConfigComposite = null; - } - } - - /** - * Sets the configuration provider - * - * @param provider - */ - public void setConfigProvider(ConfigurationManager provider) { - if (provider.crashOnConfig) /* for testing initialization error handlers */ - throw new RuntimeException("A robot must protect its own existence as long as such protection does not conflict with the First or Second Law.\n(CRASH=config is set.)"); - - this.configProvider = provider; - if (this.configProvider != null) { - for (ConfigurationCompositeBase c : composites()) - c.initConfiguration(this.configProvider); - - for (ConfigurationCompositeBase c : composites()) - c.loadConfiguration(); - } - } - - boolean storeConfiguration() { - try { - for (ConfigurationCompositeBase c : composites()) { - int resumeIndex = 0; - while (true) { - try { - c.validateSettings(resumeIndex); - break; - } catch (ResumableException e) { - log.info("Settings validation failed!", e); - ErrorDialog dialog = new ErrorDialog(getShell(), - e.getMessage(), BUTTONS.ABORT_RETRY_IGNORE); - int rc = dialog.open(); - - if (rc == SWT.ABORT) - return false; - if (rc == SWT.IGNORE) - resumeIndex = e.getResumeIndex(); - } - } - } - } catch (Exception e) { - log.error("Settings validation failed!", e); - String message = e.getMessage(); - if (message == null) - message = Messages.getString("error.Unexpected"); - ErrorDialog dialog = new ErrorDialog(getShell(), message, - BUTTONS.OK); - dialog.open(); - return false; - } - - // Write current Configuration - for (ConfigurationCompositeBase c : composites()) - c.storeConfiguration(this.configProvider); - - while (true) { - // Save current config to file - try { - this.configProvider.saveToDisk(); - return true; - } catch (IOException e) { - log.error("Failed to save configuration to file!", e); - ErrorDialog dialog = new ErrorDialog(getShell(), - Messages.getString("error.FailedToSaveSettings"), BUTTONS.RETRY_CANCEL); - int rc = dialog.open(); - if (rc == SWT.CANCEL) - return false; - } - } - } - - /** - * Checks if the user has finished working with the configuration composite - * - * @return if the user is done - */ - public boolean isUserDone() { - return this.userDone; - } - - /* - * (non-Javadoc) - * - * @see at.asit.pdfover.gui.composites.StateComposite#doLayout() - */ - @Override - public void onDisplay() { - Control ctrl = this.compositeStack.topControl; - this.containerComposite.layout(true, true); - getShell().layout(true, true); - // Note: SWT only layouts children! No grandchildren! - if (ctrl instanceof StateComposite) { - ((StateComposite) ctrl).doLayout(); - } - setFocus(); - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.composites.StateComposite#reloadResources() - */ - @Override - public void reloadResources() { - SWTUtils.setLocalizedText(simpleTabItem, "config.Simple"); - SWTUtils.setLocalizedText(advancedTabItem, "config.Advanced"); - SWTUtils.setLocalizedText(fido2TabItem, "config.FIDO2"); - SWTUtils.setLocalizedText(aboutTabItem, "config.About", Constants.APP_NAME); - if (this.keystoreConfigComposite != null) - SWTUtils.setLocalizedText(keystoreTabItem, "config.Keystore"); - - SWTUtils.setLocalizedText(btnSpeichern, "common.Save"); - SWTUtils.setLocalizedText(btnAbbrechen, "common.Cancel"); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/DataSourceSelectComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/DataSourceSelectComposite.java deleted file mode 100644 index 852afecc..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/DataSourceSelectComposite.java +++ /dev/null @@ -1,287 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.composites; - -// Imports -import java.io.File; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.dnd.DND; -import org.eclipse.swt.dnd.DropTarget; -import org.eclipse.swt.dnd.DropTargetAdapter; -import org.eclipse.swt.dnd.DropTargetEvent; -import org.eclipse.swt.dnd.FileTransfer; -import org.eclipse.swt.dnd.Transfer; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Label; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.gui.workflow.states.State; - -/** - * Composite for input document selection - */ -public class DataSourceSelectComposite extends StateComposite { - - /** - * Open the input document selection dialog - */ - public void openFileDialog() { - FileDialog dialog = new FileDialog( - DataSourceSelectComposite.this.getShell(), SWT.OPEN); - dialog.setFilterExtensions(new String[] { "*.pdf", "*" }); - dialog.setFilterNames(new String[] { - Messages.getString("common.PDFExtension_Description"), - Messages.getString("common.AllExtension_Description") }); - String fileName = dialog.open(); - File file = null; - if (fileName != null) { - file = new File(fileName); - if (file.exists()) { - DataSourceSelectComposite.this.setSelected(file); - } - } - } - - /** - * Selection adapter for file browsing - */ - private final class FileBrowseDialogListener extends SelectionAdapter { - /** - * Empty constructor - */ - public FileBrowseDialogListener() { - } - - @Override - public void widgetSelected(SelectionEvent e) { - openFileDialog(); - } - } - - /** - * SLF4J Logger instance - **/ - static final Logger log = LoggerFactory.getLogger(DataSourceSelectComposite.class); - - /** - * Set this value through the setter method!! - */ - private File selected = null; - - /** - * Sets the selected file and calls update to the workflow - * - * @param selected - */ - protected void setSelected(File selected) { - this.selected = selected; - this.state.updateStateMachine(); - } - - /** - * Gets the selected file - * - * @return the selected file - */ - public File getSelected() { - return this.selected; - } - - void MarkDragEnter() { - this.backgroundColor = this.activeBackground; - this.borderColor = this.activeBorder; - this.redrawDrop(); - } - - void MarkDragLeave() { - this.backgroundColor = this.inactiveBackground; - this.borderColor = this.inactiveBorder; - this.redrawDrop(); - } - - void redrawDrop() { - this.lbl_drag.setBackground(this.backgroundColor); - this.lbl_drag2.setBackground(this.backgroundColor); - this.btn_open.setBackground(this.backgroundColor); - this.drop_area.redraw(); - this.drop_area.layout(true, true); - } - - Color activeBackground; - Color inactiveBackground; - Color inactiveBorder; - Color activeBorder; - Color borderColor; - Color backgroundColor; - - /** - * Create the composite. - * - * @param parent - * @param style - * @param state - */ - public DataSourceSelectComposite(Composite parent, int style, State state) { - super(parent, style, state); - - this.activeBackground = Constants.MAINBAR_ACTIVE_BACK_LIGHT; - this.inactiveBackground = this.getBackground();//Constants.MAINBAR_INACTIVE_BACK; - this.inactiveBorder = Constants.MAINBAR_ACTIVE_BACK_LIGHT; - this.activeBorder = Constants.MAINBAR_ACTIVE_BACK_DARK; - this.backgroundColor = this.inactiveBackground; - this.borderColor = Constants.DROP_BORDER_COLOR; - - this.setLayout(new FormLayout()); - - // Color back = new Color(Display.getCurrent(), 77, 190, 250); - - this.drop_area = new Composite(this, SWT.RESIZE); - SWTUtils.anchor(drop_area).left(0, 30).right(100, -30).top(0, 30).bottom(100, -30); - this.drop_area.setLayout(new FormLayout()); - - this.drop_area.addPaintListener(new PaintListener() { - - @Override - public void paintControl(PaintEvent e) { - Rectangle clientArea = DataSourceSelectComposite.this - .drop_area.getClientArea(); - - //e.gc.setForeground(new Color(getDisplay(),0x6B, 0xA5, 0xD9)); - e.gc.setForeground(DataSourceSelectComposite.this.borderColor); - e.gc.setLineWidth(3); - e.gc.setLineStyle(SWT.LINE_DASH); - e.gc.setBackground(DataSourceSelectComposite.this.backgroundColor); - e.gc.fillRoundRectangle(clientArea.x, - clientArea.y, clientArea.width - 2, clientArea.height - 2, - 10, 10); - e.gc.drawRoundRectangle(clientArea.x, - clientArea.y, clientArea.width - 2, clientArea.height - 2, - 10, 10); - } - }); - - DropTarget dnd_target = new DropTarget(this.drop_area, DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK); - final FileTransfer fileTransfer = FileTransfer.getInstance(); - Transfer[] types = new Transfer[] { fileTransfer }; - dnd_target.setTransfer(types); - - dnd_target.addDropListener(new DropTargetAdapter() { - @Override - public void drop(DropTargetEvent event) { - if (fileTransfer.isSupportedType(event.currentDataType)) { - if (event.data == null) { - log.error("Dropped file name was null"); - return; - } - String[] files = (String[]) event.data; - if (files.length > 0) { - // Only taking first file ... - File file = new File(files[0]); - if (!file.exists()) { - log.error(Messages.formatString("error.FileNotExist", files[0])); - return; - } - DataSourceSelectComposite.this.setSelected(file); - } - } - } - - @Override - public void dragOperationChanged(DropTargetEvent event) { - event.detail = DND.DROP_COPY; - } - - @Override - public void dragEnter(DropTargetEvent event) { - // only accept transferable files - for (int i = 0; i < event.dataTypes.length; i++) { - if (fileTransfer.isSupportedType(event.dataTypes[i])) { - event.currentDataType = event.dataTypes[i]; - event.detail = DND.DROP_COPY; - MarkDragEnter(); - return; - } - } - event.detail = DND.DROP_NONE; - } - - /* (non-Javadoc) - * @see org.eclipse.swt.dnd.DropTargetAdapter#dragLeave(org.eclipse.swt.dnd.DropTargetEvent) - */ - @Override - public void dragLeave(DropTargetEvent event) { - MarkDragLeave(); - super.dragLeave(event); - } - }); - - this.lbl_drag = new Label(this.drop_area, SWT.NONE | SWT.RESIZE ); - this.lbl_drag2 = new Label(this.drop_area, SWT.NONE | SWT.RESIZE ); - SWTUtils.anchor(lbl_drag).left(0, 10).right(100, -10).bottom(lbl_drag2, -10); - SWTUtils.anchor(lbl_drag2).left(0, 10).right(100, -10).top(50, -10); - SWTUtils.setFontHeight(lbl_drag, Constants.TEXT_SIZE_BIG); - SWTUtils.setFontHeight(lbl_drag2, Constants.TEXT_SIZE_NORMAL); - this.lbl_drag.setAlignment(SWT.CENTER); - this.lbl_drag2.setAlignment(SWT.CENTER); - - this.btn_open = new Button(this.drop_area, SWT.NATIVE | SWT.RESIZE); - SWTUtils.anchor(btn_open).left(lbl_drag2, 0, SWT.CENTER).top(lbl_drag2, 10); - SWTUtils.setFontHeight(btn_open, Constants.TEXT_SIZE_BUTTON); - - reloadResources(); - - this.btn_open.addSelectionListener(new FileBrowseDialogListener()); - this.drop_area.pack(); - this.redrawDrop(); - } - - Composite drop_area; - - private Label lbl_drag2; - - private Label lbl_drag; - - private Button btn_open; - - @Override - public void onDisplay() { - this.drop_area.layout(true, true); - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.composites.StateComposite#reloadResources() - */ - @Override - public void reloadResources() { - SWTUtils.setLocalizedText(lbl_drag, "dataSourceSelection.DropLabel"); - SWTUtils.setLocalizedText(lbl_drag2, "dataSourceSelection.DropLabel2"); - SWTUtils.setLocalizedText(btn_open, "dataSourceSelection.browse"); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/OutputComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/OutputComposite.java deleted file mode 100644 index 96dc3982..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/OutputComposite.java +++ /dev/null @@ -1,480 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.composites; - -// Imports -import java.awt.Desktop; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; - -import org.apache.commons.io.FilenameUtils; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.FontData; -import org.eclipse.swt.layout.FormAttachment; -import org.eclipse.swt.layout.FormData; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.program.Program; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Link; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.gui.controls.Dialog; -import at.asit.pdfover.gui.controls.Dialog.BUTTONS; -import at.asit.pdfover.gui.controls.Dialog.ICON; -import at.asit.pdfover.gui.controls.ErrorDialog; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.workflow.states.State; -import at.asit.pdfover.signer.DocumentSource; - -/** - * GUI component for Output State - */ -public class OutputComposite extends StateComposite { - - /** - * SLF4J Logger instance - **/ - static final Logger log = LoggerFactory.getLogger(OutputComposite.class); - - private Link lnk_saved_file; - - private Button btn_save; - - private Label lbl_success_message; - - private DocumentSource signedDocument; - - private File inputFile; - - String outputDir = null; - - String tempDirectory = null; - - File outputFile = null; - - private boolean saveFailed = false; - - private String postFix = null; - - /** - * Create the composite. - * - * @param parent - * The parent composite - * @param style - * The swt style - * @param state - * The owning state - */ - public OutputComposite(Composite parent, int style, State state) { - super(parent, style, state); - - this.setLayout(new FormLayout()); - - this.lbl_success_message = new Label(this, SWT.NATIVE | SWT.RESIZE); - FormData fd_lbl_success_message = new FormData(); - fd_lbl_success_message.top = new FormAttachment(40, 0); - fd_lbl_success_message.left = new FormAttachment(0); - fd_lbl_success_message.right = new FormAttachment(100); - this.lbl_success_message.setLayoutData(fd_lbl_success_message); - this.lbl_success_message.setAlignment(SWT.CENTER); - - FontData[] fD1 = this.lbl_success_message.getFont().getFontData(); - fD1[0].setHeight(Constants.TEXT_SIZE_BIG); - this.lbl_success_message.setFont(new Font(Display.getCurrent(), fD1[0])); - - this.lnk_saved_file = new Link(this, SWT.NATIVE | SWT.RESIZE); - FormData fd_lnk_saved_file = new FormData(); - fd_lnk_saved_file.top = new FormAttachment(this.lbl_success_message, 10); - fd_lnk_saved_file.left = new FormAttachment(this.lbl_success_message, 0, - SWT.CENTER); - // fd_lnk_saved_file.right = new FormAttachment(100); - this.lnk_saved_file.setLayoutData(fd_lnk_saved_file); - - this.lnk_saved_file.addSelectionListener(new OpenSelectionListener()); - - FontData[] fD2 = this.lnk_saved_file.getFont().getFontData(); - fD2[0].setHeight(Constants.TEXT_SIZE_NORMAL); - this.lnk_saved_file.setFont(new Font(Display.getCurrent(), fD2[0])); - - this.btn_save = new Button(this, SWT.NATIVE | SWT.RESIZE); - - FontData[] fD_btn_save = this.btn_save.getFont().getFontData(); - fD_btn_save[0].setHeight(Constants.TEXT_SIZE_BUTTON); - this.btn_save.setFont(new Font(Display.getCurrent(), fD_btn_save[0])); - - FormData fd_btn_save = new FormData(); - fd_btn_save.top = new FormAttachment(this.lnk_saved_file, 10); - fd_btn_save.left = new FormAttachment(this.lnk_saved_file, 0, - SWT.CENTER); - this.btn_save.setLayoutData(fd_btn_save); - - this.btn_save.addSelectionListener(new SaveSelectionListener()); - enableSaveButton(false); - - reloadResources(); - } - - /** - * @param outputDir - * the outputDir to set - */ - public void setOutputDir(String outputDir) { - this.outputDir = outputDir; - } - - /** - * @return the outputDir - */ - public String getOutputDir() { - return this.outputDir; - } - - /** - * Sets the input file - * - * @param inputFile - * the input file - */ - public void setInputFile(File inputFile) { - this.inputFile = inputFile; - } - - /** - * Gets the input file - * - * @return the input file - */ - public File getInputFile() { - return this.inputFile; - } - - /** - * @param tempDirectory - */ - public void setTempDir(String tempDirectory) { - this.tempDirectory = tempDirectory; - } - - /** - * Gets the signed document - * - * @return the signed document - */ - public DocumentSource getSignedDocument() { - return this.signedDocument; - } - - /** - * Sets the signed document - * - * @param signedDocument - * the signed document - */ - public void setSignedDocument(final DocumentSource signedDocument) { - this.signedDocument = signedDocument; - } - - /** - * Return whether the last save was successful - * @return whether the last save was successful - */ - public boolean getSaveSuccessful() { - return !this.saveFailed; - } - - private void enableSaveButton(boolean doEnable) - { - this.btn_save.setEnabled(doEnable); - this.btn_save.setVisible(doEnable); - } - - public void setSaveFilePostFix(String postFix){ - this.postFix = postFix; - } - - public String getSaveFilePostFix(){ - if (this.postFix == null){ - this.postFix = Constants.DEFAULT_POSTFIX; - } - return this.postFix; - } - - /** - * Saves the signed document. - * - * If user has a default output directory set, try to save there. - * If not (or if directory unavailable), ask user for location. - */ - public void saveDocument() { - File inputFolder = getInputFile().getAbsoluteFile().getParentFile(); - String fileName = getInputFile().getName(); - String proposedName = getSignedFileName(fileName); - String outputFileName; - - String outputFolder = getOutputDir(); - if (!this.saveFailed && outputFolder != null && !outputFolder.trim().isEmpty()) { - // Output folder configured, try to save there - - File f = new File(outputFolder); - if (f.isDirectory()) { - if (!outputFolder.endsWith(File.separator)) { - outputFolder += File.separator; - } - outputFileName = outputFolder + proposedName; - } else { - outputFileName = outputFolder; - } - } else { - // Ask user where to save - - FileDialog save = new FileDialog(this.getShell(), - SWT.SAVE | SWT.NATIVE); - save.setFilterExtensions(new String[] { "*.pdf", "*" }); - save.setFilterNames(new String[] { - Messages.getString("common.PDFExtension_Description"), - Messages.getString("common.AllExtension_Description")}); - save.setFilterPath(inputFolder.getAbsolutePath()); - save.setFileName(proposedName); - - outputFileName = save.open(); - inputFolder = null; - } - log.debug("Trying to save to '" + outputFileName + "'"); - - this.outputFile = saveResultAsFile(inputFolder, outputFileName); - this.saveFailed = (this.outputFile == null); - - // If saving failed, enable save button - enableSaveButton(this.saveFailed); - reloadResources(); - layout(true); - } - - /** - * Save the signed document under the given filename - * @param inputFolder the Folder the original document is located at - * @param target the filename to save the document as - * - * @return saved File (or null if unsuccessful) - * @throws FileNotFoundException - * @throws IOException - */ - private File saveResultAsFile(File inputFolder, String target) { - if (target == null) - return null; - - File targetFile = new File(target); - if (!targetFile.isAbsolute()) - targetFile = new File(inputFolder, target); - - if (targetFile.exists()) { - Dialog dialog = new Dialog(getShell(), Messages.getString("common.warning"), - Messages.formatString("output.file_ask_overwrite", targetFile.getName()), - BUTTONS.OK_CANCEL, ICON.QUESTION); - if (dialog.open() == SWT.CANCEL) - { - return null; - } - } - - DocumentSource source = this.getSignedDocument(); - boolean retry; - - do { - retry = false; - try { - FileOutputStream outstream = new FileOutputStream(targetFile); - outstream.write(source.getByteArray(), 0, - source.getByteArray().length); - outstream.close(); - } catch (FileNotFoundException e) { - log.warn("Failed to open output file", e); - ErrorDialog dialog = new ErrorDialog(getShell(), - Messages.formatString("output.save_failed", - targetFile.getName(), e.getLocalizedMessage()), - BUTTONS.RETRY_CANCEL); - if (dialog.open() == SWT.CANCEL) - return null; - retry = true; - } catch (IOException e) { - log.error("I/O Error", e); - ErrorDialog dialog = new ErrorDialog(getShell(), - Messages.formatString("output.save_failed", - targetFile.getName(), e.getLocalizedMessage()), - BUTTONS.RETRY_CANCEL); - if (dialog.open() == SWT.CANCEL) - return null; - retry = true; - } - } while (retry); - - if (!targetFile.exists()) - { - log.error("Tried to save file " + targetFile.getName() + - ", but it doesn't exist"); - return null; - } - return targetFile; - } - - /** - * Get the proposed filename of a signed document for a given input filename - * @param name input filename - * @return proposed output filename - */ - private String getSignedFileName(String name) { - name = FilenameUtils.getName(name); - String extension = FilenameUtils.getExtension(name); - name = FilenameUtils.removeExtension(name); - return name + getSaveFilePostFix() + FilenameUtils.EXTENSION_SEPARATOR + extension; - } - - /** - * SelectionListener for save button - */ - private final class SaveSelectionListener extends SelectionAdapter { - /** - * Empty constructor - */ - public SaveSelectionListener() { - } - - @Override - public void widgetSelected(SelectionEvent e) { - try { - OutputComposite.this.saveDocument(); - } catch (Exception ex) { - log.error("SaveSelectionListener: ", ex); - } - } - } - - /** - * Selection Listener for open button - */ - private final class OpenSelectionListener extends SelectionAdapter { - /** - * Empty constructor - */ - public OpenSelectionListener() { - } - - @Override - public void widgetSelected(SelectionEvent e) { - try { - if (OutputComposite.this.outputFile == null) - return; - - if (!OutputComposite.this.outputFile.exists()) - return; - - // Normalize filename - File f = new File(FilenameUtils.normalize( - OutputComposite.this.outputFile.getAbsolutePath())); - log.debug("Trying to open " + f.toString()); - // work around for the case of Linux and Java version 8 - if (isSpecialCase()) { - reReloadResources(f.toString()); - return; - } - else if (Desktop.isDesktopSupported()) { - Desktop.getDesktop().open(f); - } else { - log.info("AWT Desktop is not supported on this platform"); - Program.launch(f.getAbsolutePath()); - } - } catch (IOException ex) { - log.error("OpenSelectionListener: ", ex); - ErrorDialog error = new ErrorDialog(getShell(), - Messages.formatString("error.FailedToOpenDocument", - ex.getLocalizedMessage()), BUTTONS.RETRY_CANCEL); - if (error.open() == SWT.RETRY) - widgetSelected(e); - } - } - } - - /** - * @return true when linux and java version <= 8 - * - */ - public boolean isSpecialCase() { - - boolean isSCase = false; - try { - String os = System.getProperty("os.name").toLowerCase(); - if (os.contains("linux")) { - String version = System.getProperty("java.version"); - if (version.contains(".")) { - String[] parts = version.split("\\."); - isSCase = Integer.valueOf(parts[0]) <= 8 ? true : false; - } else { - isSCase = Integer.valueOf(version) <= 8 ? true : false; - } - } - } catch (Exception e) { - log.debug("Error: " + e.getMessage()); - isSCase = false; - } - return isSCase; - } - - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.composites.StateComposite#reloadResources() - */ - @Override - public void reloadResources() { - SWTUtils.setLocalizedText(lbl_success_message, "output.success_message"); - if (this.outputFile == null) { - SWTUtils.setLocalizedText(lnk_saved_file, "output.link_save_message"); - } else { - SWTUtils.setLocalizedText(lnk_saved_file, "output.link_open_message"); - } - SWTUtils.setLocalizedText(btn_save, "common.Save"); - } - - /** - * @param str - */ - public void reReloadResources(String str) { - SWTUtils.setLocalizedText(lbl_success_message, "output.success_message"); - if (this.outputFile == null) { - SWTUtils.setLocalizedText(lnk_saved_file, "output.link_save_message"); - } else { - String str2 = "File location: " + str; - this.lbl_success_message.setText(str2); - this.lnk_saved_file.setText(""); - } - SWTUtils.setLocalizedText(btn_save, "common.Save"); - } - - - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/PositioningComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/PositioningComposite.java deleted file mode 100644 index b4d06546..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/PositioningComposite.java +++ /dev/null @@ -1,371 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.composites; - -// Imports -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.EventQueue; -import java.awt.Frame; -import java.awt.Image; -import java.awt.event.KeyAdapter; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseWheelEvent; -import java.awt.event.MouseWheelListener; -import java.awt.geom.Point2D; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.eclipse.swt.SWT; -import org.eclipse.swt.awt.SWT_AWT; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.ScrollBar; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.gui.workflow.states.State; -import at.asit.pdfover.signer.SignaturePosition; - -/** - * Composite which allows to position the signature on a preview of the document - */ -public class PositioningComposite extends StateComposite { - /** - * SLF4J Logger instance - **/ - static final Logger log = LoggerFactory.getLogger(PositioningComposite.class); - - SignaturePanel viewer = null; - Frame frame = null; - Composite mainArea = null; - Composite bottomBar = null; - Button btnNewPage = null; - Label lblPage = null; - ScrollBar scrollbar = null; - - private SignaturePosition position = null; - int currentPage = 0; - int numPages = 0; - - /** - * Create the composite. - * - * @param parent - * @param style - * @param state - */ - public PositioningComposite(Composite parent, int style, State state) { - super(parent, style, state); - this.setLayout(new FormLayout()); - - this.bottomBar = new Composite(this, SWT.NONE); - SWTUtils.anchor(bottomBar).left(0).right(100).bottom(100); - this.bottomBar.setLayout(new FormLayout()); - - this.btnSign = new Button(this.bottomBar, SWT.PUSH); - SWTUtils.anchor(btnSign).right(100).top(0); - this.getShell().setDefaultButton(this.btnSign); - - this.btnNewPage = new Button(this.bottomBar, SWT.TOGGLE); - SWTUtils.anchor(btnNewPage).right(btnSign).top(0); - - this.lblPage = new Label(this.bottomBar, SWT.CENTER); - SWTUtils.anchor(lblPage).left(0).right(btnNewPage, 5).bottom(100); - - this.mainArea = new Composite(this, SWT.EMBEDDED | SWT.V_SCROLL); - SWTUtils.anchor(mainArea).left(0).right(100).top(0).bottom(bottomBar, -5); - this.scrollbar = this.mainArea.getVerticalBar(); - - this.frame = SWT_AWT.new_Frame(this.mainArea); - this.frame.addKeyListener(this.keyListener); - this.frame.addMouseWheelListener(this.mouseListener); - - this.viewer = new SignaturePanel(); - this.viewer.setSignaturePlaceholderBorderColor(new Color( - Constants.MAINBAR_ACTIVE_BACK_DARK.getRed(), - Constants.MAINBAR_ACTIVE_BACK_DARK.getGreen(), - Constants.MAINBAR_ACTIVE_BACK_DARK.getBlue())); - this.frame.add(this.viewer, BorderLayout.CENTER); - - SWTUtils.addSelectionListener(btnNewPage, () -> { - if (this.currentPage > this.numPages) - showPage(this.numPages); - else - showPage(this.numPages + 1); - requestFocus(); - }); - - SWTUtils.addSelectionListener(btnSign, this::setFinalPosition); - - SWTUtils.addSelectionListener(scrollbar, () -> { this.showPage(this.scrollbar.getSelection()); }); - - reloadResources(); - requestFocus(); - } - - @Override public void onDisplay() { if (this.viewer.getSigPagePos() == null) this.btnSign.setEnabled(false); } - - /** - * Set the PDF Document to display - * - * @param document - * document to display - */ - public void displayDocument(final PDDocument document) { - EventQueue.invokeLater(() -> { - this.viewer.setDocument(document); - getDisplay().asyncExec(() -> this.btnSign.setEnabled(true)); - }); - - if (document != null) - { - this.numPages = document.getNumberOfPages(); - this.scrollbar.setValues(1, 1, this.numPages + 1, 1, 1, 1); - showPage(this.numPages); - } - } - - @Override - public void dispose() { - this.viewer.setDocument(null); - super.dispose(); - } - - /** - * Request focus (to enable keyboard input) - */ - public void requestFocus() { - getDisplay().asyncExec(() -> { - if (!this.isDisposed() && !this.mainArea.isDisposed()) { - this.mainArea.setFocus(); - EventQueue.invokeLater(() -> { - if (!this.isDisposed()) { - if (!this.frame.hasFocus()) { - this.frame.requestFocus(); - } - } - }); - } - }); - } - - /** - * Set the signature placeholder image Must be called _after_ - * displayDocument - * - * @param placeholder - * signature placeholder - * @param width - * width of the placeholder in page space - * @param height - * height of the placeholder in page space - */ - public void setPlaceholder(final Image placeholder) { - EventQueue.invokeLater(() -> { - if (this.viewer == null) - return; - this.viewer.setSignaturePlaceholder(placeholder); - }); - } - - KeyListener keyListener = new KeyAdapter() { - @Override - public void keyPressed(KeyEvent e) { - int newPage = PositioningComposite.this.currentPage; - int sigXOffset = 0; - int sigYOffset = 0; - - switch (e.getKeyCode()) { - case KeyEvent.VK_PAGE_DOWN: - if (PositioningComposite.this.currentPage < PositioningComposite.this.numPages) - ++newPage; - break; - - case KeyEvent.VK_PAGE_UP: - if (PositioningComposite.this.currentPage > 1) - --newPage; - break; - - case KeyEvent.VK_END: - newPage = PositioningComposite.this.numPages; - break; - - case KeyEvent.VK_HOME: - newPage = 1; - break; - - case KeyEvent.VK_ENTER: - setFinalPosition(); - break; - - case KeyEvent.VK_LEFT: - case KeyEvent.VK_KP_LEFT: - sigXOffset -= Constants.SIGNATURE_KEYBOARD_POSITIONING_OFFSET; - break; - - case KeyEvent.VK_RIGHT: - case KeyEvent.VK_KP_RIGHT: - sigXOffset += Constants.SIGNATURE_KEYBOARD_POSITIONING_OFFSET; - break; - - case KeyEvent.VK_UP: - case KeyEvent.VK_KP_UP: - sigYOffset += Constants.SIGNATURE_KEYBOARD_POSITIONING_OFFSET; - break; - - case KeyEvent.VK_DOWN: - case KeyEvent.VK_KP_DOWN: - sigYOffset -= Constants.SIGNATURE_KEYBOARD_POSITIONING_OFFSET; - break; - } - - if (newPage != PositioningComposite.this.currentPage) - showPage(newPage); - - if (sigXOffset != 0 || sigYOffset != 0) - translateSignaturePosition(sigXOffset, sigYOffset); - } - }; - - MouseWheelListener mouseListener = new MouseWheelListener() { - private long lastEventTime = 0; - - @Override - public void mouseWheelMoved(MouseWheelEvent e) { - e.consume(); - // Workaround for Linux: Events fire twice - if (e.getWhen() == this.lastEventTime) - return; - this.lastEventTime = e.getWhen(); - - int change = e.isShiftDown() ? 5 : 1; - int newPage = PositioningComposite.this.currentPage; - - if (e.getWheelRotation() < 0) { - newPage = Math.max(1, newPage - change); - } else if (e.getWheelRotation() > 0) { - newPage = Math.min(newPage + change, PositioningComposite.this.numPages); - } - - if (newPage != PositioningComposite.this.currentPage) - showPage(newPage); - } - }; - - private Button btnSign; - - void showPage(final int page) { - final int previousPage = this.currentPage; - this.currentPage = page; - getDisplay().asyncExec(() -> { - int currentPage = this.currentPage; - int numPages = this.numPages; - if ((previousPage > numPages) && (currentPage <= numPages)) { - // Was on new page - SWTUtils.setLocalizedText(btnNewPage, "positioning.newPage"); - this.btnNewPage.setSelection(false); - this.bottomBar.layout(); - this.scrollbar.setMaximum(numPages + 1); - } else if ((previousPage <= numPages) && (currentPage > numPages)) { - // Go to new page - SWTUtils.setLocalizedText(btnNewPage, "positioning.removeNewPage"); - this.btnNewPage.setSelection(true); - this.bottomBar.layout(); - this.scrollbar.setMaximum(numPages + 2); - } - this.scrollbar.setSelection(currentPage); - SWTUtils.setLocalizedText(lblPage, "positioning.page", currentPage, numPages); - }); - EventQueue.invokeLater(() -> { - PositioningComposite.this.viewer.showPage(page); - }); - } - - /** - * Translate the signature placeholder position - * - * @param sigXOffset - * signature placeholder horizontal position offset - * @param sigYOffset - * signature placeholder vertical position offset (negative is down) - */ - public void translateSignaturePosition(final int sigXOffset, final int sigYOffset) { - EventQueue.invokeLater(() -> { - this.viewer.translateSignaturePagePosition(sigXOffset, sigYOffset); - }); - } - - /** - * Set the signature position and continue to the next state - * - * @param position - * the signature position - */ - void setFinalPosition() { - if (this.currentPage == 0) { - this.position = new SignaturePosition(); - } else { - Point2D pos = this.viewer.getSigPagePos(); - if (pos == null) return; - - this.position = new SignaturePosition( - pos.getX(), - pos.getY(), - this.currentPage); - } - PositioningComposite.this.state.updateStateMachine(); - } - - /** - * Set the signature position - * - * @param x - * the horizontal signature position - * @param y - * the vertical signature position - * @param page - * the page the signature is on - */ - public void setPosition(double x, double y, int page) { - showPage(page); - if (this.viewer != null) - this.viewer.setSignaturePosition(x, y); - } - - /** - * Get the signature position - * - * @return the signature position - */ - public SignaturePosition getPosition() { - return this.position; - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.composites.StateComposite#reloadResources() - */ - @Override - public void reloadResources() { - SWTUtils.setLocalizedText(btnNewPage, (this.currentPage <= this.numPages) ? "positioning.newPage" : "positioning.removeNewPage"); - SWTUtils.setLocalizedText(btnSign, "positioning.sign"); - SWTUtils.setLocalizedText(lblPage, "positioning.page", this.currentPage, this.numPages); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/SignaturePanel.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/SignaturePanel.java deleted file mode 100644 index df880459..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/SignaturePanel.java +++ /dev/null @@ -1,483 +0,0 @@ -/*
- * Copyright 2012 by A-SIT, Secure Information Technology Center Austria
- *
- * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "Licence");
- * You may not use this work except in compliance with the Licence.
- * You may obtain a copy of the Licence at:
- * http://joinup.ec.europa.eu/software/page/eupl
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the Licence is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the Licence for the specific language governing permissions and
- * limitations under the Licence.
- */
-package at.asit.pdfover.gui.composites;
-
-// Imports
-import java.awt.BorderLayout;
-import java.awt.Color;
-import java.awt.Cursor;
-import java.awt.Dimension;
-import java.awt.Graphics;
-import java.awt.Image;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.geom.Point2D;
-import java.awt.geom.Rectangle2D;
-import java.awt.image.BufferedImage;
-import java.io.IOException;
-
-import javax.annotation.CheckForNull;
-import javax.swing.JPanel;
-
-import org.apache.pdfbox.pdmodel.PDDocument;
-import org.apache.pdfbox.pdmodel.PDPage;
-import org.apache.pdfbox.pdmodel.common.PDRectangle;
-import org.apache.pdfbox.rendering.PDFRenderer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import at.asit.pdfover.commons.Messages;
-
-/**
- *
- */
-public class SignaturePanel extends JPanel {
- /**
- * SLF4J Logger instance
- **/
- private static final Logger log = LoggerFactory.getLogger(SignaturePanel.class);
-
- /** Default serial version ID */
- private static final long serialVersionUID = 1L;
-
- /** The PDF file being displayed */
- private PDDocument pdf = null;
- private PDFRenderer renderer = null;
-
- /** The image of the rendered PDF page being displayed */
- Image currentImage = null;
-
- /** The current scale for rendering pdf to image */
- private float pageToImageScale;
- /** The current scale for rendering image to screen */
- private double imageToScreenScale;
- /* scaling */
- private enum U {
- /* (0,0) is bottom-left of page */
- PAGE_ABS,
- /* (0,0) is top-left of page */
- PAGE_REL,
- /* pixels, (0,0) is top-left of image */
- IMAGE,
- /* pixels, (0,0) is top-left of image */
- SCREEN_REL,
- /* pixels, (0,0) is top-left of canvas */
- SCREEN_ABS };
- private enum Dim { X, Y };
- private double scale(double v, U from, U to, Dim d)
- {
- if (from == to) return v;
-
- if (from == U.PAGE_ABS) {
- return scale((d == Dim.X) ? v : (this.pageHeight - v), U.PAGE_REL, to, d);
- } else if (from == U.PAGE_REL) {
- if (to == U.PAGE_ABS)
- return ((d == Dim.X) ? v : (this.pageHeight - v));
- else
- return scale(v * this.pageToImageScale, U.IMAGE, to, d);
- } else if (from == U.IMAGE) {
- if ((to == U.PAGE_ABS) || (to == U.PAGE_REL))
- return scale(v / this.pageToImageScale, U.PAGE_REL, to, d);
- else
- return scale(v * this.imageToScreenScale, U.SCREEN_REL, to, d);
- } else if (from == U.SCREEN_REL) {
- if (to == U.SCREEN_ABS)
- return (v + ((d == Dim.X) ? this.offX : this.offY));
- else
- return scale(v / this.imageToScreenScale, U.IMAGE, to, d);
- } else if (from == U.SCREEN_ABS) {
- return scale(v - ((d == Dim.X) ? this.offX : this.offY), U.SCREEN_REL, to, d);
- } else throw new RuntimeException("unreachable");
- }
-
- private float pageWidth = 0;
- private float pageHeight = 0;
- /** The horizontal offset of the image from the left edge of the panel */
- private int offX = 0;
- /** The vertical offset of the image from the top of the panel */
- private int offY = 0;
- /** The position of the top-left corner of the signature, in absolute page space */
- private Point2D sigPagePos = null;
- public @CheckForNull Point2D getSigPagePos() { return this.sigPagePos; }
- /** The signature placeholder image */
- private Image sigPlaceholder = null;
- /** Width of the signature placeholder in page space */
- private int sigPageWidth = 0;
- /** Height of the signature placeholder in page space */
- private int sigPageHeight = 0;
- /** Color of the signature placeholder border */
- private Color sigPlaceholderBorderColor = Color.BLUE;
- /** Current page */
- private int currentPageNo = 0;
- /** Number of pages in the document */
- private int numPages = 0;
- /** Cursor types */
- private static enum Cursors {DEFAULT, HAND, MOVE};
- /** Default arrow cursor */
- private final Cursor defaultCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR);
- /** Hand cursor */
- private final Cursor handCursor = Cursor.getPredefinedCursor(Cursor.HAND_CURSOR);
- /** Move cursor */
- private final Cursor moveCursor = Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR);
- /** Current cursor */
- private Cursors currentCursor = Cursors.DEFAULT;
-
- /**
- * Create a new PagePanel.
- */
- public SignaturePanel() {
- super(new BorderLayout());
- setDocument(null);
- setFocusable(true);
- addMouseListener(this.mouseListener);
- addMouseMotionListener(this.mouseListener);
- }
-
- /**
- * Set a new document to be displayed
- * @param pdf the PDFFile to be displayed
- */
- public void setDocument(PDDocument pdf) {
- this.pdf = pdf;
- this.sigPagePos = null;
- if (pdf != null)
- {
- this.renderer = new PDFRenderer(pdf);
- this.numPages = pdf.getNumberOfPages();
- this.currentPageNo = -1;
- showPage(this.numPages);
- }
- else
- {
- this.renderer = null;
- this.currentPageNo = 0;
- this.numPages = 0;
- renderPageToImage();
- repaint();
- }
- }
-
- /**
- * Set the signature placeholder image
- * @param placeholder signature placeholder
- * @param width width of the placeholder in page space
- * @param height height of the placeholder in page space
- */
- public void setSignaturePlaceholder(Image placeholder) {
- this.sigPlaceholder = placeholder;
- // TODO figure out why this is divided by 4 (factor ported from old code)
- this.sigPageWidth = placeholder.getWidth(null) / 4;
- this.sigPageHeight = placeholder.getHeight(null) / 4;
- renderPageToImage();
- if (this.sigPagePos != null)
- setSignaturePosition(this.sigPagePos.getX(), this.sigPagePos.getY());
- repaint();
- }
-
- /**
- * Set the color of the signature placeholder border
- * @param color new signature placeholder border color
- */
- public void setSignaturePlaceholderBorderColor(Color color) {
- this.sigPlaceholderBorderColor = color;
- }
-
- /**
- * Change the currently displayed page
- * @param page the number of the page to display
- */
- public void showPage(int page) {
- if (this.currentPageNo == page) return;
- this.currentPageNo = page;
- renderPageToImage();
- repaint();
- }
-
- /**
- * Add and display a new page at the end of the document
- *
- * This page has the same dimensions as the old last page
- */
- public void addNewLastPage() {
- showPage(this.numPages + 1);
- }
-
- /**
- * Set the signature placeholder position
- * @param x the horizontal signature position
- * @param y the vertical signature position
- */
- public void setSignaturePosition(double x, double y)
- {
- this.sigPagePos = new Point2D.Double(
- clamp(x, 0, this.pageWidth - this.sigPageWidth),
- clamp(y, this.sigPageHeight, this.pageHeight)
- );
- repaint();
- }
-
- public void translateSignaturePagePosition(float dX, float dY) {
- setSignaturePosition(this.sigPagePos.getX() + dX, this.sigPagePos.getY() + dY);
- }
-
- /**
- * Stop the generation of any previous page, and draw the new one.
- *
- * @param page the PDFPage to draw.
- */
- private synchronized void renderPageToImage() {
- if (this.pdf == null)
- {
- this.currentImage = null;
- return;
- }
-
- boolean newPage = false;
- PDPage currentPage;
- // set up the new page
- if (this.currentPageNo > this.numPages)
- {
- // New last page - use old last page as template
- currentPage = this.pdf.getPage(this.numPages-1);
- newPage = true;
- }
- else
- currentPage = this.pdf.getPage(this.currentPageNo-1);
-
-
- if (currentPage == null) {
- // no page
- this.currentImage = null;
- return;
- }
-
- boolean isRotated = ((currentPage.getRotation()%180) == 90);
- PDRectangle actualPageSize = currentPage.getBBox();
- this.pageWidth = isRotated ? actualPageSize.getHeight() : actualPageSize.getWidth();
- this.pageHeight = isRotated ? actualPageSize.getWidth() : actualPageSize.getHeight();
- this.pageToImageScale = getToolkit().getScreenSize().height / this.pageHeight;
-
- // get the new image
- if (newPage)
- {
- int renderHeight = (int)(0.5 + this.scale(this.pageHeight, U.PAGE_REL, U.IMAGE, Dim.X));
- int renderWidth = (int)(0.5 + this.scale(this.pageWidth, U.PAGE_REL, U.IMAGE, Dim.Y));
- this.currentImage = new BufferedImage(renderWidth, renderHeight, BufferedImage.TYPE_INT_RGB);
- Graphics g = this.currentImage.getGraphics();
- g.setColor(Color.WHITE);
- g.fillRect(0, 0, renderWidth, renderHeight);
- }
- else
- {
- int whichPage = Math.min(this.currentPageNo, this.numPages);
-
- try {
- this.currentImage = renderer.renderImage(whichPage-1, this.pageToImageScale);
- } catch (IOException e) {
- log.error(String.format("Failed to render image for page %d of %d", whichPage, this.numPages), e);
- this.currentImage = null;
- }
- }
-
- if (this.sigPagePos == null)
- {
- setSignaturePosition(
- this.pageWidth * .5,
- this.pageHeight * .75
- );
- }
- }
-
- /**
- * Draw the image.
- */
- @Override
- public void paint(Graphics g) {
- Dimension renderPanelSize = getSize();
- g.setColor(getBackground());
- g.fillRect(0, 0, getWidth(), getHeight());
- if (this.currentImage == null) {
- g.setColor(Color.black);
- g.drawString(Messages.getString("common.working"), getWidth() / 2 - 30, getHeight() / 2);
- } else {
- this.imageToScreenScale = Math.min(
- renderPanelSize.getWidth() / this.currentImage.getWidth(null),
- renderPanelSize.getHeight() / this.currentImage.getHeight(null));
- // draw the image
- int actualRenderWidth = (int)(this.currentImage.getWidth(null) * this.imageToScreenScale);
- int actualRenderHeight = (int)(this.currentImage.getHeight(null) * this.imageToScreenScale);
-
- // draw it centered within the panel
- this.offX = (renderPanelSize.width - actualRenderWidth) / 2;
- this.offY = (renderPanelSize.height - actualRenderHeight) / 2;
-
- // draw document
- g.drawImage(this.currentImage, this.offX, this.offY, actualRenderWidth, actualRenderHeight, null);
-
-
- // draw signature
- int sigX = (int) this.scale(this.sigPagePos.getX(), U.PAGE_ABS, U.SCREEN_ABS, Dim.X);
- int sigY = (int) this.scale(this.sigPagePos.getY(), U.PAGE_ABS, U.SCREEN_ABS, Dim.Y);
- if (this.sigPlaceholder == null) {
- g.setColor(Color.red);
- g.drawRect(sigX, sigY, 100, 40);
- }
- else {
- int sigScreenWidth = (int)this.scale(this.sigPageWidth, U.PAGE_REL, U.SCREEN_REL, Dim.X);
- int sigScreenHeight = (int)this.scale(this.sigPageHeight, U.PAGE_REL, U.SCREEN_REL, Dim.Y);
- g.drawImage(this.sigPlaceholder, sigX, sigY, sigScreenWidth, sigScreenHeight, null);
- g.setColor(this.sigPlaceholderBorderColor);
- g.drawRect(sigX, sigY, sigScreenWidth-1, sigScreenHeight-1);
- }
- }
- }
-
- /**
- * Handles notification of the fact that some part of the image changed.
- * Repaints that portion.
- *
- * @return true if more updates are desired.
- */
- @Override
- public boolean imageUpdate(Image img, int infoflags, int x, int y,
- int width, int height) {
- if ((infoflags & (SOMEBITS | ALLBITS)) != 0) {
- repaint(x + this.offX, y + this.offY, width, height);
- }
- return ((infoflags & (ALLBITS | ERROR | ABORT)) == 0);
- }
-
- private MouseAdapter mouseListener = new MouseAdapter() {
-
- private boolean doDrag = false;
- private int dragXOffset = 0;
- private int dragYOffset = 0;
-
- private void updateSigPosDrag(MouseEvent evt) {
- SignaturePanel.this.setSignaturePosition(
- SignaturePanel.this.scale(evt.getX() - this.dragXOffset, U.SCREEN_ABS, U.PAGE_ABS, Dim.X),
- SignaturePanel.this.scale(evt.getY() - this.dragYOffset, U.SCREEN_ABS, U.PAGE_ABS, Dim.Y)
- );
- }
-
- /** Handles a mouseMoved event */
- @Override
- public void mouseMoved(MouseEvent evt) {
- try {
- boolean onSig = isOnSignature(evt);
- setCursor(onSig ? Cursors.HAND : Cursors.DEFAULT);
- } catch (NullPointerException e) {
- // do nothing
- }
- }
-
- /** Handles a mousePressed event */
- @Override
- public void mousePressed(MouseEvent evt) {
- if (evt.getButton() == MouseEvent.BUTTON1)
- {
- this.doDrag = true;
- if (isOnSignature(evt)) {
- /* offsets (in screen units) from top-left corner of signature to cursor on drag start */
- this.dragXOffset = (int)(evt.getX() - SignaturePanel.this.scale(SignaturePanel.this.sigPagePos.getX(), U.PAGE_ABS, U.SCREEN_ABS, Dim.X));
- this.dragYOffset = (int)(evt.getY() - SignaturePanel.this.scale(SignaturePanel.this.sigPagePos.getY(), U.PAGE_ABS, U.SCREEN_ABS, Dim.Y));
- } else {
- this.dragXOffset = 0;
- this.dragYOffset = 0;
- }
- updateSigPosDrag(evt);
- setCursor(Cursors.MOVE);
- }
- }
-
- /** Handles a mouseReleased event */
- @Override
- public void mouseReleased(MouseEvent evt) {
- this.doDrag = false;
- boolean onSig = isOnSignature(evt);
- setCursor(onSig ? Cursors.HAND : Cursors.DEFAULT);
- }
-
- /**
- * Handles a mouseDragged event.
- */
- @Override
- public void mouseDragged(MouseEvent evt) {
- if (this.doDrag)
- updateSigPosDrag(evt);
- }
- };
-
- /**
- * Sets the mouse cursor
- * @param cursor cursor to set
- */
- void setCursor(Cursors cursor)
- {
- if (this.currentCursor == cursor)
- return;
- this.currentCursor = cursor;
- Cursor cur = null;
- switch (cursor) {
- case DEFAULT:
- cur = this.defaultCursor;
- break;
- case HAND:
- cur = this.handCursor;
- break;
- case MOVE:
- cur = this.moveCursor;
- break;
- }
- this.getParent().setCursor(cur);
- }
-
- /**
- * Check whether given point is on signature placeholder
- * @param x x coordinate (screen)
- * @param y y coordinate (screen)
- * @return true if given point is on signature placeholder
- */
- private boolean isOnSignature(MouseEvent evt)
- {
- if (this.sigPagePos == null)
- return false;
-
- Rectangle2D sig = new Rectangle2D.Double(
- this.scale(this.sigPagePos.getX(), U.PAGE_ABS, U.SCREEN_ABS, Dim.X),
- this.scale(this.sigPagePos.getY(), U.PAGE_ABS, U.SCREEN_ABS, Dim.Y),
- this.scale(this.sigPageWidth, U.PAGE_REL, U.SCREEN_REL, Dim.X),
- this.scale(this.sigPageHeight, U.PAGE_REL, U.SCREEN_REL, Dim.Y)
- );
- return sig.contains(evt.getX(), evt.getY());
- }
-
- /**
- * Clamp x to be within [min-max]
- * @param x int to clamp
- * @param min minimum value
- * @param max maximum value
- * @return clamped x
- */
- private static double clamp(double x, double min, double max)
- {
- if (x < min)
- x = min;
- else if (x > max)
- x = max;
- return x;
- }
-}
diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/StateComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/StateComposite.java deleted file mode 100644 index 085f7b71..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/StateComposite.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.composites; - -// Imports -import org.eclipse.swt.widgets.Composite; - -import at.asit.pdfover.gui.workflow.states.State; - -/** - * Composite interface for workflow state gui implementations - */ -public abstract class StateComposite extends Composite { - - /** - * Current State - */ - protected State state; - - /** - * The base class for state composites - * - * @param parent The parent Composite - * @param style The Composite style - * @param state The current State - */ - public StateComposite(Composite parent, int style, State state) { - super(parent, style); - this.state = state; - } - - public final void doLayout() { this.layout(true,true); this.onDisplay(); } - - /** - * Reloads the localizeable resources - */ - public abstract void reloadResources(); - - /** - * Called when the control is .display()ed - */ - public void onDisplay() {} - - // allow subclassing of SWT components - @Override protected final void checkSubclass() {} -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/WaitingComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/WaitingComposite.java deleted file mode 100644 index dc18155a..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/WaitingComposite.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.composites; - -// Imports -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.FormAttachment; -import org.eclipse.swt.layout.FormData; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.ProgressBar; - -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.gui.workflow.states.State; - -/** - * - */ -public class WaitingComposite extends StateComposite { - private Label lbl_description; - - /** - * Create the composite. - * @param parent - * @param style - * @param state - */ - public WaitingComposite(Composite parent, int style, State state) { - super(parent, style, state); - setLayout(new FormLayout()); - - this.lbl_description = new Label(this, SWT.NATIVE); - FormData fd_lbl_description = new FormData(); - fd_lbl_description.bottom = new FormAttachment(50, -10); - fd_lbl_description.left = new FormAttachment(0, +10); - fd_lbl_description.right = new FormAttachment(100, -10); - this.lbl_description.setLayoutData(fd_lbl_description); - this.lbl_description.setAlignment(SWT.CENTER); - SWTUtils.setLocalizedText(lbl_description, "waiting.message"); - - ProgressBar progressBar = new ProgressBar(this, SWT.HORIZONTAL | SWT.INDETERMINATE); - FormData fd_progressBar = new FormData(); - fd_progressBar.top = new FormAttachment(50, +10); - fd_progressBar.bottom = new FormAttachment(50, +40); - fd_progressBar.left = new FormAttachment(50, -100); - fd_progressBar.right = new FormAttachment(50, +100); - progressBar.setLayoutData(fd_progressBar); - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.composites.StateComposite#reloadResources() - */ - @Override - public void reloadResources() { - SWTUtils.setLocalizedText(lbl_description, "waiting.message"); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/AboutComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/AboutComposite.java deleted file mode 100644 index 14f7a015..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/AboutComposite.java +++ /dev/null @@ -1,132 +0,0 @@ -package at.asit.pdfover.gui.composites.configuration; - -import java.awt.Desktop; -import java.io.File; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.program.Program; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Link; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.gui.utils.UpdateCheckManager; -import at.asit.pdfover.gui.workflow.config.ConfigurationDataInMemory; -import at.asit.pdfover.gui.workflow.config.ConfigurationManager; -import at.asit.pdfover.gui.workflow.states.State; - -public class AboutComposite extends ConfigurationCompositeBase { - static final Logger log = LoggerFactory.getLogger(AboutComposite.class); - private Link lnkAbout; - private Link lnkDataProtection; - private Label lblDataProtection; - private Link lnkUpdateCheckStatus; - private Button btnUpdateCheck; - private Button btnOpenLogDirectory; - private UpdateCheckManager.Status latestUpdateStatus; - /** - * @param parent - * @param style - */ - public AboutComposite(Composite parent, int style, State state, ConfigurationDataInMemory container) { - super(parent, style, state, container); - - setLayout(new FormLayout()); - - this.lnkAbout = new Link(this, SWT.WRAP); - SWTUtils.anchor(lnkAbout).top(0,5).right(100,-5).left(0,5); - SWTUtils.setFontHeight(lnkAbout, Constants.TEXT_SIZE_NORMAL); - SWTUtils.addSelectionListener(lnkAbout, (e) -> { SWTUtils.openURL(Messages.getString("config.LicenseURL")); }); - - this.lblDataProtection = new Label(this, SWT.WRAP); - SWTUtils.anchor(lblDataProtection).top(lnkAbout, 15).left(0,5).right(100,-5); - SWTUtils.setFontHeight(lblDataProtection, Constants.TEXT_SIZE_BIG); - SWTUtils.setFontStyle(lblDataProtection, SWT.BOLD); - - this.lnkDataProtection = new Link(this, SWT.WRAP); - SWTUtils.anchor(lnkDataProtection).top(lblDataProtection,10).left(0,5).right(100,-5); - SWTUtils.setFontHeight(lnkDataProtection, Constants.TEXT_SIZE_NORMAL); - SWTUtils.addSelectionListener(lnkDataProtection, (e) -> { SWTUtils.openURL(Messages.getString("config.DataProtectionURL")); }); - - this.lnkUpdateCheckStatus = new Link(this, SWT.NONE); - SWTUtils.anchor(lnkUpdateCheckStatus).bottom(100, -5).left(0,5); - SWTUtils.setFontHeight(lnkUpdateCheckStatus, Constants.TEXT_SIZE_BUTTON); - UpdateCheckManager.registerStatusCallback((s) -> { if (isDisposed()) return; latestUpdateStatus = s; getDisplay().asyncExec(() -> { RefreshUpdateStatusText(); }); }); - SWTUtils.addSelectionListener(lnkUpdateCheckStatus, (e) -> { - if (latestUpdateStatus == UpdateCheckManager.Status.OUTDATED) - Program.launch(Constants.UPDATE_URL); - else - UpdateCheckManager.checkNow(getShell()); - }); - - this.btnUpdateCheck = new Button(this, SWT.CHECK); - SWTUtils.anchor(btnUpdateCheck).bottom(lnkUpdateCheckStatus,-5).left(0,5); - SWTUtils.setFontHeight(btnUpdateCheck, Constants.TEXT_SIZE_BUTTON); - SWTUtils.addSelectionListener(btnUpdateCheck, (e) -> { - boolean enabled = btnUpdateCheck.getSelection(); - this.configurationContainer.updateCheck = enabled; - if (enabled) - UpdateCheckManager.checkNow(getShell()); - }); - - this.btnOpenLogDirectory = new Button(this, SWT.NONE); - SWTUtils.anchor(btnOpenLogDirectory).bottom(100, -5).right(100, -5); - SWTUtils.setFontHeight(btnOpenLogDirectory, Constants.TEXT_SIZE_BUTTON); - - SWTUtils.reanchor(lnkDataProtection).bottom(btnUpdateCheck,-5); - - SWTUtils.addSelectionListener(btnOpenLogDirectory, (e) -> { - try { - if (Desktop.isDesktopSupported()) - Desktop.getDesktop().open(new File(Constants.CONFIG_DIRECTORY + File.separator + "logs")); - } catch (Exception ex) { - log.warn("Failed to open log directory: ", ex); - } - }); - - // Load localized strings - reloadResources(); - } - - private void RefreshUpdateStatusText() { - SWTUtils.setLocalizedText(lnkUpdateCheckStatus, "config.UpdateStatus." + latestUpdateStatus.name()); - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.composites.StateComposite#reloadResources() - */ - @Override - public void reloadResources() { - SWTUtils.setLocalizedText(lnkAbout, "config.AboutText"); - SWTUtils.setLocalizedText(lblDataProtection, "config.DataProtection"); - SWTUtils.setLocalizedText(lnkDataProtection, "config.DataProtectionStatement"); - SWTUtils.setLocalizedText(btnUpdateCheck, "advanced_config.UpdateCheck"); - SWTUtils.setLocalizedToolTipText(btnUpdateCheck, "advanced_config.UpdateCheck_ToolTip"); - SWTUtils.setLocalizedText(btnOpenLogDirectory, "config.ShowLogDirectory"); - RefreshUpdateStatusText(); - } - - @Override - public void initConfiguration(ConfigurationManager provider) { - this.configurationContainer.updateCheck = provider.getUpdateCheck(); - } - - @Override - public void loadConfiguration() { - btnUpdateCheck.setSelection(this.configurationContainer.updateCheck); - } - - @Override - public void storeConfiguration(ConfigurationManager store) { - store.setUpdateCheckPersistent(this.configurationContainer.updateCheck); - } - - @Override - public void validateSettings(int resumeFrom) throws Exception {} -}
\ No newline at end of file diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/AdvancedConfigurationComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/AdvancedConfigurationComposite.java deleted file mode 100644 index df1a809b..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/AdvancedConfigurationComposite.java +++ /dev/null @@ -1,709 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.composites.configuration; - -// Imports -import java.io.File; -import java.util.Arrays; -import java.util.List; -import java.util.Locale; -import java.util.stream.Collectors; - -import javax.annotation.Nonnull; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.FocusAdapter; -import org.eclipse.swt.events.FocusEvent; -import org.eclipse.swt.layout.FormData; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.DirectoryDialog; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Text; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.BKUs; -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.commons.Profile; -import at.asit.pdfover.gui.composites.ConfigurationComposite; -import at.asit.pdfover.gui.controls.Dialog.BUTTONS; -import at.asit.pdfover.gui.controls.ErrorDialog; -import at.asit.pdfover.gui.controls.ErrorMarker; -import at.asit.pdfover.gui.exceptions.InvalidPortException; -import at.asit.pdfover.gui.exceptions.OutputfolderDoesntExistException; -import at.asit.pdfover.gui.exceptions.OutputfolderNotADirectoryException; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.gui.workflow.config.ConfigurationManager; -import at.asit.pdfover.gui.workflow.config.ConfigurationDataInMemory; -import at.asit.pdfover.gui.workflow.states.State; - -/** - * Composite for advanced configuration - * - * Contains the simple configuration composite - */ -public class AdvancedConfigurationComposite extends ConfigurationCompositeBase { - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(AdvancedConfigurationComposite.class); - - private ConfigurationComposite configurationComposite; - - private Group grpSignatur; - private Group grpPlaceholder; - Button btnAutomatischePositionierung; - Button btnPdfACompat; - Button btnPlatzhalterVerwenden; - Button btnSignatureFieldsUsage; - Button btnEnablePlaceholderUsage; - - private Group grpBkuAuswahl; - Combo cmbBKUAuswahl; - List<String> bkuStrings; - Button btnKeystoreEnabled; - - private final Group grpSpeicherort; - private final Label lblDefaultOutputFolder; - Text txtOutputFolder; - private final Button btnBrowse; - private final Label lblSaveFilePostFix; - private final Text txtSaveFilePostFix; - - private final Group grpLocaleAuswahl; - Combo cmbLocaleAuswahl; - - private Group grpProxy; - private Label lblProxyHost; - private Text txtProxyHost; - private ErrorMarker proxyHostErrorMarker; - private Label lblProxyPort; - private Text txtProxyPort; - private ErrorMarker txtProxyPortErrorMarker; - FormData fd_txtProxyPort; - FormData fd_txtProxyPortErrorMarker; - - /** - * @param parent - * @param style - * @param state - * @param container - * @param config - */ - public AdvancedConfigurationComposite(Composite parent, int style, State state, ConfigurationDataInMemory container, - ConfigurationComposite config) { - super(parent, style, state, container); - this.configurationComposite = config; - setLayout(new FormLayout()); - - FormLayout STANDARD_LAYOUT = new FormLayout(); - STANDARD_LAYOUT.marginHeight = 10; - STANDARD_LAYOUT.marginWidth = 5; - - this.grpLocaleAuswahl = new Group(this, SWT.NONE); - this.grpLocaleAuswahl.setLayout(STANDARD_LAYOUT); - SWTUtils.anchor(grpLocaleAuswahl).top(0, 5).left(0,5).right(100,-5); - SWTUtils.setFontHeight(grpLocaleAuswahl, Constants.TEXT_SIZE_NORMAL); - - this.grpSignatur = new Group(this, SWT.NONE); - this.grpSignatur.setLayout(STANDARD_LAYOUT); - SWTUtils.anchor(grpSignatur).top(grpLocaleAuswahl,5).right(100,-5).left(0,5); - SWTUtils.setFontHeight(grpSignatur, Constants.TEXT_SIZE_NORMAL); - - this.grpPlaceholder = new Group(this, SWT.NONE); - this.grpPlaceholder.setLayout(STANDARD_LAYOUT); - SWTUtils.anchor(grpPlaceholder).top(grpSignatur, 5).left(0,5).right(100,-5); - SWTUtils.setFontHeight(grpPlaceholder, Constants.TEXT_SIZE_NORMAL); - - this.grpBkuAuswahl = new Group(this, SWT.NONE); - this.grpBkuAuswahl.setLayout(STANDARD_LAYOUT); - SWTUtils.anchor(grpBkuAuswahl).top(grpPlaceholder, 5).left(0,5).right(100,-5); - SWTUtils.setFontHeight(grpBkuAuswahl, Constants.TEXT_SIZE_NORMAL); - - this.grpSpeicherort = new Group(this, SWT.NONE); - grpSpeicherort.setLayout(new GridLayout(3, false)); - SWTUtils.anchor(grpSpeicherort).left(0,5).top(grpBkuAuswahl, 5).right(100,-5); - SWTUtils.setFontHeight(grpSpeicherort, Constants.TEXT_SIZE_NORMAL); - - this.grpProxy = new Group(this, SWT.NONE); - SWTUtils.anchor(grpProxy).right(100,-5).top(grpSpeicherort, 5).left(0,5); - this.grpProxy.setLayout(new GridLayout(2, false)); - SWTUtils.setFontHeight(grpProxy, Constants.TEXT_SIZE_NORMAL); - - this.btnAutomatischePositionierung = new Button(this.grpSignatur, SWT.CHECK); - SWTUtils.anchor(btnAutomatischePositionierung).right(100,-5).top(0).left(0,5); - SWTUtils.setFontHeight(btnAutomatischePositionierung, Constants.TEXT_SIZE_BUTTON); - SWTUtils.addSelectionListener(btnAutomatischePositionierung, e -> { performPositionSelection(btnAutomatischePositionierung.getSelection()); }); - - this.btnPdfACompat = new Button(this.grpSignatur, SWT.CHECK); - SWTUtils.anchor(btnPdfACompat).right(100,-5).top(btnAutomatischePositionierung, 5).left(0,5); - SWTUtils.setFontHeight(btnPdfACompat, Constants.TEXT_SIZE_BUTTON); - SWTUtils.addSelectionListener(btnPdfACompat, e -> { performPdfACompatSelection(btnPdfACompat.getSelection()); }); - - this.btnEnablePlaceholderUsage = new Button(this.grpPlaceholder, SWT.CHECK); - SWTUtils.anchor(btnEnablePlaceholderUsage).top(0,5).left(0,5).right(100,-5); - SWTUtils.setFontHeight(btnEnablePlaceholderUsage, Constants.TEXT_SIZE_BUTTON); - SWTUtils.addSelectionListener(btnEnablePlaceholderUsage, e -> { performEnableUsePlaceholder(btnEnablePlaceholderUsage.getSelection()); }); - - this.btnPlatzhalterVerwenden = new Button(this.grpPlaceholder, SWT.RADIO); - SWTUtils.anchor(btnPlatzhalterVerwenden).right(100,-5).top(btnEnablePlaceholderUsage,5).left(0,5); - SWTUtils.setFontHeight(btnPlatzhalterVerwenden, Constants.TEXT_SIZE_BUTTON); - SWTUtils.addSelectionListener(btnPlatzhalterVerwenden, e -> { performUseMarkerSelection(btnPlatzhalterVerwenden.getSelection()); }); - - this.btnSignatureFieldsUsage = new Button(this.grpPlaceholder, SWT.RADIO); - SWTUtils.anchor(btnSignatureFieldsUsage).right(100,-5).top(btnPlatzhalterVerwenden, 5).left(0,5); - SWTUtils.setFontHeight(btnSignatureFieldsUsage, Constants.TEXT_SIZE_BUTTON); - SWTUtils.addSelectionListener(btnSignatureFieldsUsage, e -> { performUseSignatureFieldsSelection(btnSignatureFieldsUsage.getSelection()); }); - - this.cmbBKUAuswahl = new Combo(this.grpBkuAuswahl, SWT.READ_ONLY); - SWTUtils.anchor(cmbBKUAuswahl).right(100,-5).top(0).left(0,5); - SWTUtils.setFontHeight(cmbBKUAuswahl, Constants.TEXT_SIZE_NORMAL); - SWTUtils.scrollPassthrough(cmbBKUAuswahl); - - this.bkuStrings = Arrays.stream(BKUs.values()).map(s -> Messages.getString("BKU."+s)).collect(Collectors.toList()); - this.cmbBKUAuswahl.setItems(bkuStrings.toArray(new String[0])); - SWTUtils.addSelectionListener(cmbBKUAuswahl, e -> { - int selectionIndex = getBKUElementIndex(configurationContainer.defaultBKU); - if (cmbBKUAuswahl.getSelectionIndex() != selectionIndex) { - selectionIndex = cmbBKUAuswahl.getSelectionIndex(); - performBKUSelectionChanged(cmbBKUAuswahl.getItem(selectionIndex)); - } - }); - - this.btnKeystoreEnabled = new Button(this.grpBkuAuswahl, SWT.CHECK); - SWTUtils.anchor(btnKeystoreEnabled).right(100,-5).top(cmbBKUAuswahl,5).left(0,5); - SWTUtils.setFontHeight(btnKeystoreEnabled, Constants.TEXT_SIZE_BUTTON); - SWTUtils.addSelectionListener(btnKeystoreEnabled, e -> { performKeystoreEnabledSelection(btnKeystoreEnabled.getSelection()); }); - - this.lblDefaultOutputFolder = new Label(this.grpSpeicherort, SWT.NONE); - SWTUtils.setFontHeight(lblDefaultOutputFolder, Constants.TEXT_SIZE_NORMAL); - - this.txtOutputFolder = new Text(this.grpSpeicherort, SWT.BORDER); - txtOutputFolder.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); - SWTUtils.setFontHeight(txtOutputFolder, Constants.TEXT_SIZE_NORMAL); - - this.txtOutputFolder.addFocusListener(new FocusAdapter() { - @Override - public void focusLost(FocusEvent e) { - performOutputFolderChanged(txtOutputFolder.getText()); - } - }); - - this.btnBrowse = new Button(this.grpSpeicherort, SWT.NONE); - btnBrowse.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 1, 1)); - SWTUtils.setFontHeight(btnBrowse, Constants.TEXT_SIZE_BUTTON); - - SWTUtils.addSelectionListener(btnBrowse, e -> { - DirectoryDialog dlg = new DirectoryDialog(AdvancedConfigurationComposite.this.getShell()); - - // Set the initial filter path according - // to anything they've selected or typed in - dlg.setFilterPath(AdvancedConfigurationComposite.this.txtOutputFolder.getText()); - - // Change the title bar text - SWTUtils.setLocalizedText(dlg, "advanced_config.OutputFolder.Dialog_Title"); - - // Customizable message displayed in the dialog - dlg.setMessage(Messages.getString("advanced_config.OutputFolder.Dialog")); - - // Calling open() will open and run the dialog. - // It will return the selected directory, or - // null if user cancels - String dir = dlg.open(); - if (dir != null) { - // Set the text box to the new selection - performOutputFolderChanged(dir); - } - }); - - this.lblSaveFilePostFix = new Label(this.grpSpeicherort, SWT.NONE); - SWTUtils.setLocalizedText(lblSaveFilePostFix, "AdvancedConfigurationComposite.lblSaveFilePostFix.text"); - SWTUtils.setFontHeight(lblSaveFilePostFix, Constants.TEXT_SIZE_NORMAL); - - this.txtSaveFilePostFix = new Text(this.grpSpeicherort, SWT.BORDER); - txtSaveFilePostFix.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); - SWTUtils.setFontHeight(txtSaveFilePostFix, Constants.TEXT_SIZE_NORMAL); - - this.txtSaveFilePostFix.addFocusListener(new FocusAdapter() { - @Override - public void focusLost(FocusEvent e) { - if (txtSaveFilePostFix.getText().trim().isEmpty()) - txtSaveFilePostFix.setText(Constants.DEFAULT_POSTFIX); - performPostFixChanged(Constants.ISNOTNULL(txtSaveFilePostFix.getText())); - } - }); - - this.cmbLocaleAuswahl = new Combo(this.grpLocaleAuswahl, SWT.READ_ONLY); - SWTUtils.anchor(cmbLocaleAuswahl).right(100,-5).top(0).left(0,5); - SWTUtils.setFontHeight(cmbLocaleAuswahl, Constants.TEXT_SIZE_NORMAL);; - this.cmbLocaleAuswahl.setItems(Arrays.stream(Constants.SUPPORTED_LOCALES).map(l -> l.getDisplayLanguage()).toArray(String[]::new)); - SWTUtils.scrollPassthrough(cmbLocaleAuswahl); - - SWTUtils.addSelectionListener(cmbLocaleAuswahl, e -> { - Locale currentLocale = configurationContainer.interfaceLocale; - Locale selectedLocale = Constants.SUPPORTED_LOCALES[cmbLocaleAuswahl.getSelectionIndex()]; - if (!currentLocale.equals(selectedLocale)) { - performLocaleSelectionChanged(selectedLocale); - } - }); - - this.lblProxyHost = new Label(this.grpProxy, SWT.NONE); - do { /* grid positioning */ - GridData gd_lblProxyHost = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1); - gd_lblProxyHost.widthHint = 66; - this.lblProxyHost.setLayoutData(gd_lblProxyHost); - this.lblProxyHost.setBounds(0, 0, 57, 15); - } while (false); - SWTUtils.setFontHeight(lblProxyHost, Constants.TEXT_SIZE_NORMAL); - - Composite compProxyHostContainer = new Composite(this.grpProxy, SWT.NONE); - compProxyHostContainer.setLayout(new FormLayout()); - compProxyHostContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); - - this.txtProxyHost = new Text(compProxyHostContainer, SWT.BORDER); - SWTUtils.anchor(txtProxyHost).right(100,-42).top(0).left(0,5); - SWTUtils.setFontHeight(txtProxyHost, Constants.TEXT_SIZE_NORMAL); - - this.proxyHostErrorMarker = new ErrorMarker(compProxyHostContainer, SWT.NONE, ""); - SWTUtils.anchor(proxyHostErrorMarker).left(100,-32).right(100).top(0).bottom(0,32); - this.proxyHostErrorMarker.setVisible(false); - - this.txtProxyHost.addFocusListener(new FocusAdapter() { - @Override - public void focusLost(FocusEvent e) { - processProxyHostChanged(); - } - }); - - this.txtProxyHost.addTraverseListener(e -> { - if (e.detail == SWT.TRAVERSE_RETURN) { - processProxyHostChanged(); - } - }); - - this.lblProxyPort = new Label(this.grpProxy, SWT.NONE); - this.lblProxyPort.setBounds(0, 0, 57, 15); - SWTUtils.setFontHeight(lblProxyPort, Constants.TEXT_SIZE_NORMAL); - - Composite compProxyPortContainer = new Composite(this.grpProxy, SWT.NONE); - compProxyPortContainer.setLayout(new FormLayout()); - compProxyPortContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); - - this.txtProxyPort = new Text(compProxyPortContainer, SWT.BORDER); - SWTUtils.anchor(txtProxyPort).top(0,0).left(0,5).right(100,-42); - SWTUtils.setFontHeight(txtProxyPort, Constants.TEXT_SIZE_NORMAL); - - this.txtProxyPort.addTraverseListener(e -> { - if (e.detail == SWT.TRAVERSE_RETURN) { - processProxyPortChanged(); - } - }); - - this.txtProxyPortErrorMarker = new ErrorMarker(compProxyPortContainer, SWT.NONE, ""); - SWTUtils.anchor(txtProxyPortErrorMarker).left(100,-32).right(100).top(0).bottom(0,32); - this.txtProxyPortErrorMarker.setVisible(false); - - this.txtProxyPort.addFocusListener(new FocusAdapter() { - @Override - public void focusLost(FocusEvent e) { - processProxyPortChanged(); - } - }); - - reloadResources(); - } - - private void performPostFixChanged(@Nonnull String postfix) { - - log.debug("Save file postfix changed to : {}", postfix); - this.configurationContainer.saveFilePostFix = postfix; - AdvancedConfigurationComposite.this.txtSaveFilePostFix.setText(postfix); - } - - void performOutputFolderChanged(String foldername) { - log.debug("Selected Output folder: {}", foldername); - this.configurationContainer.outputFolder = foldername; - AdvancedConfigurationComposite.this.txtOutputFolder.setText(foldername); - } - - int getBKUElementIndex(BKUs bku) { - String lookup = "BKU." + bku.toString(); - String bkuName = Messages.getString(lookup); - - int i = this.bkuStrings.indexOf(bkuName); - if (i == -1) { - log.warn("NO BKU match for {}", bkuName); - return 0; - } - return i; - } - - void performBKUSelectionChanged(@Nonnull BKUs selected) { - log.debug("Selected BKU: {}", selected); - this.configurationContainer.defaultBKU = selected; - this.cmbBKUAuswahl.select(this.getBKUElementIndex(selected)); - } - - void performBKUSelectionChanged(String selected) { - try { - BKUs bkuvalue = resolveBKU(selected); - this.performBKUSelectionChanged(bkuvalue); - } catch (Exception ex) { - log.error("Failed to parse BKU value: {} {}", selected, ex); - ErrorDialog dialog = new ErrorDialog(getShell(), Messages.getString("error.InvalidBKU"), BUTTONS.OK); - dialog.open(); - } - } - - @Nonnull BKUs resolveBKU(String localizedBKU) { - int blen = BKUs.values().length; - - for (int i = 0; i < blen; i++) { - String lookup = "BKU." + BKUs.values()[i].toString(); - if (Messages.getString(lookup).equals(localizedBKU)) { - return Constants.ISNOTNULL(BKUs.values()[i]); - } - } - - return BKUs.NONE; - } - - int getLocaleElementIndex(Locale locale) { - for (int i = 0; i < Constants.SUPPORTED_LOCALES.length; i++) { - if (Constants.SUPPORTED_LOCALES[i].equals(locale)) { - log.debug("Locale: {} IDX: {}", locale, i); - return i; - } - } - - log.warn("NO Locale match for {}", locale); - return 0; - } - - void performLocaleSelectionChanged(Locale selected) { - log.debug("Selected Locale: {}", selected); - this.configurationContainer.interfaceLocale = selected; - this.cmbLocaleAuswahl.select(this.getLocaleElementIndex(selected)); - } - - void performPositionSelection(boolean automatic) { - log.debug("Selected Position: {}", automatic); - this.configurationContainer.autoPositionSignature = automatic; - this.btnAutomatischePositionierung.setSelection(automatic); - } - - void performUseMarkerSelection(boolean useMarker) { - this.configurationContainer.setUseMarker(useMarker); - this.btnPlatzhalterVerwenden.setSelection(useMarker); - } - - void performUseSignatureFieldsSelection(boolean useFields) { - this.configurationContainer.setUseSignatureFields(useFields); - this.btnSignatureFieldsUsage.setSelection(useFields); - } - - void performEnableUsePlaceholder(boolean enable) { - this.btnPlatzhalterVerwenden.setEnabled(enable); - this.btnSignatureFieldsUsage.setEnabled(enable); - this.configurationContainer.enabledPlaceholderUsage = enable; - this.btnEnablePlaceholderUsage.setSelection(enable); - } - - void performPdfACompatSelection(boolean compat) { - this.configurationContainer.signaturePDFACompat = compat; - this.btnPdfACompat.setSelection(compat); - } - - void performKeystoreEnabledSelection(boolean enabled) { - this.configurationContainer.keystoreEnabled = enabled; - this.btnKeystoreEnabled.setSelection(enabled); - this.configurationComposite.keystoreEnabled(enabled); - - int ksIndex = getBKUElementIndex(BKUs.KS); - String ksText = this.bkuStrings.get(ksIndex); - if (enabled) { - if (!this.cmbBKUAuswahl.getItem(ksIndex).equals(ksText)) - this.cmbBKUAuswahl.add(ksText, ksIndex); - } else { - int i = this.cmbBKUAuswahl.indexOf(ksText); - if (i != -1) { - if (this.cmbBKUAuswahl.getSelectionIndex() == i) - performBKUSelectionChanged(BKUs.NONE); - this.cmbBKUAuswahl.remove(i); - } - } - } - - void processProxyHostChanged() { - try { - this.proxyHostErrorMarker.setVisible(false); - plainProxyHostSetter(); - } catch (Exception ex) { - this.proxyHostErrorMarker.setVisible(true); - this.proxyHostErrorMarker.setToolTipText(ex.getMessage()); - log.error("processProxyHost: ", ex); - } - } - - /** - * - */ - private void plainProxyHostSetter() { - String host = this.txtProxyHost.getText(); - this.configurationContainer.proxyHost = host; - } - - void processProxyPortChanged() { - try { - this.txtProxyPortErrorMarker.setVisible(false); - plainProxyPortSetter(); - } catch (Exception ex) { - this.txtProxyPortErrorMarker.setVisible(true); - this.txtProxyPortErrorMarker.setToolTipText(ex.getMessage()); - log.error("processProxyPort: ", ex); - } - } - - /** - * @throws InvalidPortException - */ - private void plainProxyPortSetter() throws InvalidPortException { - String portString = this.txtProxyPort.getText(); - int port = -1; - if (portString == null || portString.trim().isEmpty()) { - port = -1; - } else { - try { - port = Integer.parseInt(portString); - } catch (NumberFormatException e) { - throw new InvalidPortException(portString, e); - } - } - this.configurationContainer.setProxyPort(port); - } - - @Override - public void initConfiguration(ConfigurationManager provider) { - this.configurationContainer.autoPositionSignature = provider.getAutoPositionSignaturePersistent(); - this.configurationContainer.setUseMarker(provider.getUseMarker()); - this.configurationContainer.setUseSignatureFields(provider.getUseSignatureFields()); - this.configurationContainer.enabledPlaceholderUsage = provider.getEnablePlaceholderUsage(); - this.configurationContainer.signaturePDFACompat = provider.getSignaturePdfACompat(); - - this.configurationContainer.defaultBKU = provider.getDefaultBKUPersistent(); - this.configurationContainer.keystoreEnabled = provider.getKeyStoreEnabledPersistent(); - - this.configurationContainer.outputFolder = provider.getDefaultOutputFolderPersistent(); - this.configurationContainer.saveFilePostFix = provider.getSaveFilePostFix(); - - this.configurationContainer.interfaceLocale = provider.getInterfaceLocale(); - - this.configurationContainer.proxyHost = provider.getProxyHostPersistent(); - try { - this.configurationContainer.setProxyPort(provider.getProxyPortPersistent()); - } catch (InvalidPortException e) { - log.error("Failed to set proxy port!", e); - } - this.configurationContainer.proxyUser = provider.getProxyUserPersistent(); - this.configurationContainer.proxyPass = provider.getProxyPassPersistent(); - } - - /* - * (non-Javadoc) - * - * @see - * at.asit.pdfover.gui.composites.BaseConfigurationComposite#loadConfiguration() - */ - @Override - public void loadConfiguration() { - // load advanced settings - performBKUSelectionChanged(this.configurationContainer.defaultBKU); - String outputFolder = this.configurationContainer.outputFolder; - if (outputFolder != null) { - performOutputFolderChanged(outputFolder); - } - performPostFixChanged(this.configurationContainer.saveFilePostFix); - performPositionSelection(this.configurationContainer.autoPositionSignature); - performUseMarkerSelection(this.configurationContainer.getUseMarker()); - performUseSignatureFieldsSelection(this.configurationContainer.getUseSignatureFields()); - performEnableUsePlaceholder(this.configurationContainer.enabledPlaceholderUsage); - performLocaleSelectionChanged(this.configurationContainer.interfaceLocale); - performPdfACompatSelection(this.configurationContainer.signaturePDFACompat); - performKeystoreEnabledSelection(this.configurationContainer.keystoreEnabled); - - int port = this.configurationContainer.getProxyPort(); - if (port > 0) { - this.txtProxyPort.setText(Integer.toString(port)); - } - - String host = this.configurationContainer.proxyHost; - if (host != null) { - this.txtProxyHost.setText(host); - } - - } - - @Override - public void storeConfiguration(ConfigurationManager store) { - store.setAutoPositionSignaturePersistent(this.configurationContainer.autoPositionSignature); - store.setUseMarkerPersistent(this.configurationContainer.getUseMarker()); - store.setUseSignatureFieldsPersistent(this.configurationContainer.getUseSignatureFields()); - store.setEnablePlaceholderUsagePersistent(this.configurationContainer.enabledPlaceholderUsage); - store.setSignaturePdfACompatPersistent(this.configurationContainer.signaturePDFACompat); - - store.setDefaultBKUPersistent(this.configurationContainer.defaultBKU); - store.setKeyStoreEnabledPersistent(this.configurationContainer.keystoreEnabled); - - store.setDefaultOutputFolderPersistent(this.configurationContainer.outputFolder); - store.setSaveFilePostFixPersistent(this.configurationContainer.saveFilePostFix); - store.setInterfaceLocalePersistent(this.configurationContainer.interfaceLocale); - - String hostOld = store.getProxyHostPersistent(); - String hostNew = this.configurationContainer.proxyHost; - if (hostOld != null && !hostOld.isEmpty() && (hostNew == null || hostNew.isEmpty())) { - // Proxy has been removed, let's clear the system properties - // Otherwise, the proxy settings wouldn't get removed - System.clearProperty("http.proxyHost"); - System.clearProperty("https.proxyHost"); - } - store.setProxyHostPersistent(hostNew); - - int portOld = store.getProxyPortPersistent(); - int portNew = this.configurationContainer.getProxyPort(); - if (portOld != -1 && portNew == -1) { - // cf. above - System.clearProperty("http.proxyPort"); - System.clearProperty("https.proxyPort"); - } - store.setProxyPortPersistent(portNew); - - String userOld = store.getProxyUserPersistent(); - String userNew = this.configurationContainer.proxyUser; - if (userOld != null && !userOld.isEmpty() && (userNew == null || userNew.isEmpty())) { - // cf. above - System.clearProperty("http.proxyUser"); - System.clearProperty("https.proxyUser"); - } - store.setProxyUserPersistent(userNew); - - String passOld = store.getProxyPassPersistent(); - String passNew = this.configurationContainer.proxyPass; - if (passOld != null && passNew == null) { - // cf. above - System.clearProperty("http.proxyPassword"); - System.clearProperty("https.proxyPassword"); - } - store.setProxyPassPersistent(passNew); - } - - /* - * (non-Javadoc) - * - * @see - * at.asit.pdfover.gui.composites.BaseConfigurationComposite#validateSettings() - */ - @Override - public void validateSettings(int resumeIndex) throws Exception { - - String foldername = this.configurationContainer.outputFolder; - - switch (resumeIndex) { - case 0: - if (foldername != null && !foldername.isEmpty()) { - File outputFolder = new File(foldername); - if (!outputFolder.exists()) { - throw new OutputfolderDoesntExistException(outputFolder, 1); - } - if (!outputFolder.isDirectory()) { - throw new OutputfolderNotADirectoryException(outputFolder); - } - } - // Fall through - case 1: - this.plainProxyHostSetter(); - // Fall through - case 2: - this.plainProxyPortSetter(); - // Fall through - // case 3: - // this.plainProxyUserSetter(); - // // Fall through - // case 4: - // this.plainProxyPassSetter(); - } - } - - /* - * (non-Javadoc) - * - * @see at.asit.pdfover.gui.composites.StateComposite#reloadResources() - */ - @Override - public void reloadResources() { - SWTUtils.setLocalizedText(grpSignatur, "advanced_config.Signature_Title"); - SWTUtils.setLocalizedText(btnAutomatischePositionierung, "advanced_config.AutoPosition"); - SWTUtils.setLocalizedToolTipText(btnAutomatischePositionierung, "advanced_config.AutoPosition_ToolTip"); - SWTUtils.setLocalizedText(grpPlaceholder, "advanced_config.Placeholder_Title"); - SWTUtils.setLocalizedText(btnPlatzhalterVerwenden, "advanced_config.UseMarker"); - SWTUtils.setLocalizedToolTipText(btnPlatzhalterVerwenden, "advanced_config.UseMarker_ToolTip"); - SWTUtils.setLocalizedText(btnSignatureFieldsUsage, "advanced_config.UseSignatureFields"); - SWTUtils.setLocalizedToolTipText(btnSignatureFieldsUsage, "advanced_config.UseSignatureFields_ToolTip"); - SWTUtils.setLocalizedText(btnEnablePlaceholderUsage, "advanced_config.Placeholder_Enabled"); - SWTUtils.setLocalizedText(btnPdfACompat, "advanced_config.PdfACompat"); - SWTUtils.setLocalizedToolTipText(btnPdfACompat, "advanced_config.PdfACompat_ToolTip"); - - SWTUtils.setLocalizedText(grpBkuAuswahl, "advanced_config.BKUSelection_Title"); - SWTUtils.setLocalizedToolTipText(cmbBKUAuswahl, "advanced_config.BKUSelection_ToolTip"); - SWTUtils.setLocalizedText(btnKeystoreEnabled, "advanced_config.KeystoreEnabled"); - SWTUtils.setLocalizedToolTipText(btnKeystoreEnabled, "advanced_config.KeystoreEnabled_ToolTip"); - - SWTUtils.setLocalizedText(grpSpeicherort, "advanced_config.OutputFolder_Title"); - SWTUtils.setLocalizedText(lblDefaultOutputFolder, "advanced_config.OutputFolder"); - SWTUtils.setLocalizedToolTipText(txtOutputFolder, "advanced_config.OutputFolder_ToolTip"); - SWTUtils.setLocalizedText(btnBrowse, "common.browse"); - - SWTUtils.setLocalizedText(grpLocaleAuswahl, "advanced_config.LocaleSelection_Title"); - SWTUtils.setLocalizedToolTipText(cmbLocaleAuswahl, "advanced_config.LocaleSelection_ToolTip"); - - SWTUtils.setLocalizedText(grpProxy, "advanced_config.Proxy_Title"); - SWTUtils.setLocalizedText(lblProxyHost, "advanced_config.ProxyHost"); - SWTUtils.setLocalizedToolTipText(txtProxyHost, "advanced_config.ProxyHost_ToolTip"); - this.txtProxyHost.setMessage(Messages.getString("advanced_config.ProxyHost_Template")); - SWTUtils.setLocalizedText(lblProxyPort, "advanced_config.ProxyPort"); - SWTUtils.setLocalizedToolTipText(txtProxyPort, "advanced_config.ProxyPort_ToolTip"); - this.txtProxyPort.setMessage(Messages.getString("advanced_config.ProxyPort_Template")); - // StateComposite.setLocalizedText(lblProxyUser, "advanced_config.ProxyUser"); - - // this.txtProxyUser.setToolTipText(Messages - // .getString("advanced_config.ProxyUser_ToolTip")); - // this.txtProxyUser.setMessage(Messages - // .getString("advanced_config.ProxyUser_Template")); - // StateComposite.setLocalizedText(lblProxyPass, "advanced_config.ProxyPass"); - - // this.txtProxyPass.setToolTipText(Messages - // .getString("advanced_config.ProxyPass_ToolTip")); - // this.txtProxyPass.setMessage(Messages - // .getString("advanced_config.ProxyPass_Template")); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/ConfigurationCompositeBase.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/ConfigurationCompositeBase.java deleted file mode 100644 index 54207292..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/ConfigurationCompositeBase.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.composites.configuration; - - -import org.eclipse.swt.widgets.Composite; - -import at.asit.pdfover.gui.composites.StateComposite; -import at.asit.pdfover.gui.workflow.config.ConfigurationManager; -import at.asit.pdfover.gui.workflow.config.ConfigurationDataInMemory; -import at.asit.pdfover.gui.workflow.states.State; - -/** - * Base class for configuration composites - */ -public abstract class ConfigurationCompositeBase extends StateComposite { - - /** - * the configuration container - */ - protected ConfigurationDataInMemory configurationContainer; - - /** - * @param parent - * @param style - * @param state - * @param configuration - */ - public ConfigurationCompositeBase(Composite parent, int style, State state, ConfigurationDataInMemory configuration) { - super(parent, style, state); - this.configurationContainer = configuration; - } - - /** - * Initialize ConfigurationContainer from ConfigProviderImpl - * @param provider the ConfigProviderImpl to load config from - */ - public abstract void initConfiguration(ConfigurationManager provider); - - /** - * Load configuration from ConfigurationContainer - */ - public abstract void loadConfiguration(); - - /** - * Store configuration from ConfigurationContainer to ConfigProvider - * @param store the ConfigProviderImpl to store config to - */ - public abstract void storeConfiguration(ConfigurationManager store); - - /** - * Called before exit. - * The method validates every setting in the configuration before exit - * - * There might be settings when the user can decide to ignore a validation exception - * (for example the Outputfolder validation) - * In this case, the validator throws a ResumableException, which includes the - * validator index to resume from (should the user choose to ignore the error) - * - * @param resumeFrom Resume from this validator index (initially 0) - * @throws Exception - */ - public abstract void validateSettings(int resumeFrom) throws Exception; -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/Fido2ConfigurationComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/Fido2ConfigurationComposite.java deleted file mode 100644 index 9b2d3ef1..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/Fido2ConfigurationComposite.java +++ /dev/null @@ -1,95 +0,0 @@ -package at.asit.pdfover.gui.composites.configuration; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Link; - -import com.sun.jna.Platform; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.gui.workflow.config.ConfigurationDataInMemory; -import at.asit.pdfover.gui.workflow.config.ConfigurationManager; -import at.asit.pdfover.gui.workflow.states.State; -import at.asit.webauthn.WebAuthN; - -public class Fido2ConfigurationComposite extends ConfigurationCompositeBase { - - private Link lnkInfoText; - private Link unsupportedText; - - private Group grpFidoSettings; - private Button btnFido2ByDefault; - - public Fido2ConfigurationComposite(Composite parent, int style, State state, ConfigurationDataInMemory container) { - super(parent, style, state, container); - setLayout(new FormLayout()); - - this.lnkInfoText = new Link(this, SWT.WRAP); - SWTUtils.anchor(lnkInfoText).top(0,5).left(0,5).right(100,-5); - SWTUtils.setFontHeight(lnkInfoText, Constants.TEXT_SIZE_NORMAL); - SWTUtils.addSelectionListener(lnkInfoText, () -> { SWTUtils.openURL(Messages.getString("config.fido2.InfoURL")); }); - - this.unsupportedText = new Link(this, SWT.WRAP); - SWTUtils.anchor(unsupportedText).top(lnkInfoText,5).left(0,5).right(100,-5); - SWTUtils.setFontHeight(unsupportedText, Constants.TEXT_SIZE_NORMAL); - SWTUtils.addSelectionListener(unsupportedText, () -> { SWTUtils.openURL("https://developers.yubico.com/libfido2/#_installation"); }); - - FormLayout STANDARD_LAYOUT = new FormLayout(); - STANDARD_LAYOUT.marginHeight = 10; - STANDARD_LAYOUT.marginWidth = 5; - - this.grpFidoSettings = new Group(this, SWT.NONE); - this.grpFidoSettings.setLayout(STANDARD_LAYOUT); - SWTUtils.anchor(grpFidoSettings).top(lnkInfoText,10).left(0,5).right(100,-5); - SWTUtils.setFontHeight(grpFidoSettings, Constants.TEXT_SIZE_NORMAL); - - this.btnFido2ByDefault = new Button(this.grpFidoSettings, SWT.CHECK); - SWTUtils.anchor(btnFido2ByDefault).top(0).left(0,5).right(100,-5); - SWTUtils.setFontHeight(btnFido2ByDefault, Constants.TEXT_SIZE_BUTTON); - SWTUtils.addSelectionListener(btnFido2ByDefault, () -> { this.configurationContainer.fido2ByDefault = btnFido2ByDefault.getSelection(); }); - - if (WebAuthN.isAvailable()) - this.unsupportedText.setVisible(false); - else - this.grpFidoSettings.setVisible(false); - - reloadResources(); - } - - @Override - public void reloadResources() { - SWTUtils.setLocalizedText(lnkInfoText, "config.fido2.AboutFIDO"); - SWTUtils.setLocalizedText(grpFidoSettings, "config.fido2.Group"); - SWTUtils.setLocalizedText(btnFido2ByDefault, "config.fido2.ByDefault"); - - if (Platform.isLinux() || Platform.isMac()) - SWTUtils.setLocalizedText(unsupportedText, "config.fido2.UnsupportedTryLibFido2"); - else { - SWTUtils.setFontStyle(unsupportedText, SWT.BOLD); - SWTUtils.setLocalizedText(unsupportedText, "config.fido2.UnsupportedPlatform"); - } - } - - @Override - public void initConfiguration(ConfigurationManager provider) { - this.configurationContainer.fido2ByDefault = provider.getFido2ByDefault(); - } - - @Override - public void loadConfiguration() { - btnFido2ByDefault.setSelection(this.configurationContainer.fido2ByDefault); - } - - @Override - public void storeConfiguration(ConfigurationManager store) { - store.setFido2ByDefaultPersistent(this.configurationContainer.fido2ByDefault); - } - - @Override - public void validateSettings(int resumeIndex) throws Exception {} -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/KeystoreConfigurationComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/KeystoreConfigurationComposite.java deleted file mode 100644 index a477422e..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/KeystoreConfigurationComposite.java +++ /dev/null @@ -1,592 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.composites.configuration; - -// Imports -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.UnrecoverableKeyException; -import java.security.cert.CertificateException; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.Map; -import java.util.Vector; - -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.FocusAdapter; -import org.eclipse.swt.events.FocusEvent; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.layout.FormAttachment; -import org.eclipse.swt.layout.FormData; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Text; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.gui.controls.Dialog.BUTTONS; -import at.asit.pdfover.gui.controls.ErrorDialog; -import at.asit.pdfover.gui.controls.PasswordInputDialog; -import at.asit.pdfover.gui.exceptions.CantLoadKeystoreException; -import at.asit.pdfover.gui.exceptions.KeystoreAliasDoesntExistException; -import at.asit.pdfover.gui.exceptions.KeystoreAliasNoKeyException; -import at.asit.pdfover.gui.exceptions.KeystoreDoesntExistException; -import at.asit.pdfover.gui.exceptions.KeystoreKeyPasswordException; -import at.asit.pdfover.gui.keystore.KeystoreUtils; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.workflow.config.ConfigurationManager; -import at.asit.pdfover.gui.workflow.config.ConfigurationDataInMemory.KeyStorePassStorageType; -import at.asit.pdfover.gui.workflow.config.ConfigurationDataInMemory; -import at.asit.pdfover.gui.workflow.states.State; - -/** - * - */ -public class KeystoreConfigurationComposite extends ConfigurationCompositeBase { - - /** - * SLF4J Logger instance - **/ - static final Logger log = LoggerFactory.getLogger(KeystoreConfigurationComposite.class); - - private Group grpKeystore; - private Label lblKeystoreFile; - Text txtKeystoreFile; - private Button btnBrowse; - private Label lblKeystoreType; - Combo cmbKeystoreType; - private Button btnLoad; - private Label lblKeystoreAlias; - Combo cmbKeystoreAlias; - private Label lblKeystorePassStoreType; - Combo cmbKeystorePassStoreType; - private Label lblKeystoreStorePass; - Text txtKeystoreStorePass; - private Label lblKeystoreKeyPass; - Text txtKeystoreKeyPass; - - private KeyStore ks; - - /** - * @param parent - * @param style - * @param state - * @param container - */ - public KeystoreConfigurationComposite( - org.eclipse.swt.widgets.Composite parent, int style, State state, - ConfigurationDataInMemory container) { - super(parent, style, state, container); - setLayout(new FormLayout()); - - this.grpKeystore = new Group(this, SWT.NONE | SWT.RESIZE); - FormLayout layout = new FormLayout(); - layout.marginHeight = 10; - layout.marginWidth = 5; - this.grpKeystore.setLayout(layout); - - SWTUtils.anchor(grpKeystore).top(0,5).left(0,5).right(100,-5); - SWTUtils.setFontHeight(this.grpKeystore, Constants.TEXT_SIZE_NORMAL); - - this.lblKeystoreFile = new Label(this.grpKeystore, SWT.NONE); - SWTUtils.anchor(lblKeystoreFile).top(0).left(0,5); - FormData fd_lblKeystoreFile = new FormData(); - fd_lblKeystoreFile.top = new FormAttachment(0); - fd_lblKeystoreFile.left = new FormAttachment(0, 5); - this.lblKeystoreFile.setLayoutData(fd_lblKeystoreFile); - SWTUtils.setFontHeight(lblKeystoreFile, Constants.TEXT_SIZE_NORMAL); - - this.txtKeystoreFile = new Text(grpKeystore, SWT.BORDER); - this.btnBrowse = new Button(grpKeystore, SWT.NONE); - SWTUtils.setFontHeight(txtKeystoreFile, Constants.TEXT_SIZE_NORMAL); - SWTUtils.setFontHeight(btnBrowse, Constants.TEXT_SIZE_BUTTON); - SWTUtils.anchor(txtKeystoreFile).top(lblKeystoreFile, 5).left(0,15).right(btnBrowse,-5); - SWTUtils.anchor(btnBrowse).top(lblKeystoreFile, 5).right(100,-5); - - this.lblKeystoreType = new Label(grpKeystore, SWT.NONE); - SWTUtils.anchor(lblKeystoreType).top(txtKeystoreFile, 5).left(0,5); - SWTUtils.setFontHeight(lblKeystoreType, Constants.TEXT_SIZE_NORMAL); - - this.btnLoad = new Button(this.grpKeystore, SWT.NONE); - SWTUtils.anchor(btnLoad).top(lblKeystoreType, 5).right(100,-5); - SWTUtils.setFontHeight(btnLoad, Constants.TEXT_SIZE_BUTTON); - - this.cmbKeystoreType = new Combo(grpKeystore, SWT.READ_ONLY); - SWTUtils.anchor(cmbKeystoreType).top(lblKeystoreType, 5).left(0,15).right(btnLoad, -5); - SWTUtils.setFontHeight(cmbKeystoreType, Constants.TEXT_SIZE_NORMAL); - SWTUtils.scrollPassthrough(cmbKeystoreType); - - this.lblKeystoreAlias = new Label(grpKeystore, SWT.NONE); - SWTUtils.anchor(lblKeystoreAlias).top(cmbKeystoreType, 5).left(0, 5); - SWTUtils.setFontHeight(lblKeystoreAlias, Constants.TEXT_SIZE_NORMAL); - - this.cmbKeystoreAlias = new Combo(grpKeystore, SWT.NONE); - SWTUtils.anchor(cmbKeystoreAlias).top(lblKeystoreAlias, 5).left(0,15).right(100,-5); - SWTUtils.setFontHeight(cmbKeystoreAlias, Constants.TEXT_SIZE_NORMAL); - SWTUtils.scrollPassthrough(cmbKeystoreAlias); - - this.lblKeystorePassStoreType = new Label(this.grpKeystore, SWT.NONE); - SWTUtils.anchor(lblKeystorePassStoreType).top(cmbKeystoreAlias, 5).left(0,5); - SWTUtils.setFontHeight(lblKeystorePassStoreType, Constants.TEXT_SIZE_NORMAL); - - this.cmbKeystorePassStoreType = new Combo(grpKeystore, SWT.READ_ONLY); - SWTUtils.anchor(cmbKeystorePassStoreType).top(lblKeystorePassStoreType, 5).left(0,15).right(100,-5); - SWTUtils.setFontHeight(cmbKeystorePassStoreType, Constants.TEXT_SIZE_NORMAL); - SWTUtils.scrollPassthrough(cmbKeystorePassStoreType); - - this.lblKeystoreStorePass = new Label(grpKeystore, SWT.NONE); - SWTUtils.anchor(lblKeystoreStorePass).top(cmbKeystorePassStoreType, 5).left(0,5); - SWTUtils.setFontHeight(lblKeystoreStorePass, Constants.TEXT_SIZE_NORMAL); - - this.txtKeystoreStorePass = new Text(grpKeystore, SWT.BORDER | SWT.PASSWORD); - SWTUtils.anchor(txtKeystoreStorePass).right(100, -5).top(lblKeystoreStorePass, 5).left(0,15); - SWTUtils.setFontHeight(txtKeystoreStorePass, Constants.TEXT_SIZE_NORMAL); - - this.lblKeystoreKeyPass = new Label(grpKeystore, SWT.NONE); - SWTUtils.anchor(lblKeystoreKeyPass).top(txtKeystoreStorePass, 5).left(0,5); - SWTUtils.setFontHeight(lblKeystoreKeyPass, Constants.TEXT_SIZE_NORMAL); - - this.txtKeystoreKeyPass = new Text(grpKeystore, SWT.BORDER | SWT.PASSWORD); - SWTUtils.anchor(txtKeystoreKeyPass).top(lblKeystoreKeyPass, 5).left(0,15).right(100,-5); - SWTUtils.setFontHeight(txtKeystoreKeyPass, Constants.TEXT_SIZE_NORMAL); - - this.txtKeystoreFile.addFocusListener(new FocusAdapter() { - @Override - public void focusLost(FocusEvent e) { - performKeystoreFileChanged(KeystoreConfigurationComposite.this.txtKeystoreFile.getText()); - } - }); - - this.btnBrowse.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - FileDialog dialog = new FileDialog( - KeystoreConfigurationComposite.this.getShell(), SWT.OPEN); - dialog.setFilterExtensions(new String[] { - "*.p12;*.pkcs12;*.pfx;*.ks;*.jks", "*.p12;*.pkcs12;*.pfx;", "*.ks;*.jks*.", "*" }); - dialog.setFilterNames(new String[] { - Messages.getString("common.KeystoreExtension_Description"), - Messages.getString("common.PKCS12Extension_Description"), - Messages.getString("common.KSExtension_Description"), - Messages.getString("common.AllExtension_Description") }); - String fileName = dialog.open(); - File file = null; - if (fileName != null) { - file = new File(fileName); - if (file.exists()) { - performKeystoreFileChanged(fileName); - } - } - } - }); - - this.cmbKeystoreType.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - performKeystoreTypeChanged( - KeystoreConfigurationComposite.this.keystoreTypes.get( - KeystoreConfigurationComposite.this.cmbKeystoreType.getItem( - KeystoreConfigurationComposite.this.cmbKeystoreType.getSelectionIndex()))); - } - }); - - this.txtKeystoreStorePass.addFocusListener(new FocusAdapter() { - @Override - public void focusLost(FocusEvent e) { - performKeystoreStorePassChanged(KeystoreConfigurationComposite. - this.txtKeystoreStorePass.getText()); - } - - }); - - this.btnLoad.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - File f = new File(KeystoreConfigurationComposite.this - .configurationContainer.keystoreFile); - try { - loadKeystore(); - } catch (KeyStoreException ex) { - log.error("Error loading keystore", ex); - showErrorDialog(Messages.getString("error.KeyStore")); - } catch (FileNotFoundException ex) { - log.error("Error loading keystore", ex); - showErrorDialog(Messages.formatString( - "error.KeyStoreFileNotExist", f.getName())); - } catch (NoSuchAlgorithmException ex) { - log.error("Error loading keystore", ex); - showErrorDialog(Messages.getString("error.KeyStore")); - } catch (CertificateException ex) { - log.error("Error loading keystore", ex); - showErrorDialog(Messages.getString("error.KeyStore")); - } catch (IOException ex) { - log.error("Error loading keystore", ex); - showErrorDialog(Messages.getString("error.KeyStore")); - } catch (NullPointerException ex) { - log.error("Error loading keystore - NPE?", ex); - showErrorDialog(Messages.getString("error.KeyStore")); - } catch (UnrecoverableKeyException ex) { - log.warn("Error loading keystore, invalid password", ex); - showErrorDialog(Messages.getString("error.KeyStoreStorePass")); - } - } - }); - - this.cmbKeystoreAlias.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - performKeystoreAliasChanged( - KeystoreConfigurationComposite.this.cmbKeystoreAlias.getItem( - KeystoreConfigurationComposite.this.cmbKeystoreAlias.getSelectionIndex())); - } - }); - this.cmbKeystoreAlias.addFocusListener(new FocusAdapter() { - @Override - public void focusLost(FocusEvent e) { - performKeystoreAliasChanged(KeystoreConfigurationComposite.this.cmbKeystoreAlias.getText()); - } - }); - - this.cmbKeystorePassStoreType.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - performKeystorePassStorageTypeChanged( - keystorePassStorageTypeOptions.get( - KeystoreConfigurationComposite.this.cmbKeystorePassStoreType.getSelectionIndex() - ).getLeft() - ); - } - }); - - this.txtKeystoreKeyPass.addFocusListener(new FocusAdapter() { - @Override - public void focusLost(FocusEvent e) { - performKeystoreKeyPassChanged(KeystoreConfigurationComposite.this.txtKeystoreKeyPass.getText()); - } - }); - - // Load localized strings - - reloadResources(); - } - - void showErrorDialog(String error) { - ErrorDialog e = new ErrorDialog(getShell(), error, BUTTONS.OK); - e.open(); - } - - void loadKeystore() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException { - this.cmbKeystoreAlias.remove(0, this.cmbKeystoreAlias.getItemCount()-1); - - ConfigurationDataInMemory config = this.configurationContainer; - this.ks = null; - String pass = config.keystoreStorePass; - - while (this.ks == null) - { - if (pass == null) - { - pass = new PasswordInputDialog( - getShell(), - Messages.getString("keystore_config.KeystoreStorePass"), - Messages.getString("keystore.KeystoreStorePassEntry")).open(); - if (pass == null) - throw new UnrecoverableKeyException("User cancelled password input"); - } - - try { - this.ks = KeystoreUtils.tryLoadKeystore(new File(config.keystoreFile), config.keystoreType, pass); - } catch (UnrecoverableKeyException ex) { - new ErrorDialog(getShell(), Messages.getString("error.KeyStoreStorePass"), BUTTONS.OK).open(); - pass = null; - } - } - config.keystoreStorePass = pass; - - Enumeration<String> aliases = this.ks.aliases(); - while (aliases.hasMoreElements()) - this.cmbKeystoreAlias.add(aliases.nextElement()); - } - - /** - * @param fileName - */ - protected void performKeystoreFileChanged(String fileName) { - log.debug("Selected keystore file: " + fileName); - this.configurationContainer.keystoreFile = fileName; - KeystoreConfigurationComposite.this.txtKeystoreFile.setText(fileName); - int i = fileName.lastIndexOf('.'); - if (i > 0) { - String ext = fileName.substring(i+1); - if ( - ext.equalsIgnoreCase("p12") || - ext.equalsIgnoreCase("pkcs12") || - ext.equalsIgnoreCase("pfx")) - performKeystoreTypeChanged("PKCS12"); - else if ( - ext.equalsIgnoreCase("ks") || - ext.equalsIgnoreCase("jks")) - performKeystoreTypeChanged("JCEKS"); - } - } - - /** - * @param type - */ - protected void performKeystoreTypeChanged(String type) { - log.debug("Selected keystore type: " + type); - this.configurationContainer.keystoreType = type; - for (int i = 0; i < this.cmbKeystoreType.getItemCount(); ++i) { - if (this.keystoreTypes.get(this.cmbKeystoreType.getItem(i)).equals(type)) { - this.cmbKeystoreType.select(i); - break; - } - } - } - - protected void performKeystorePassStorageTypeChanged(KeyStorePassStorageType p) { - this.configurationContainer.keystorePassStorageType = p; - for (int i=0; i<keystorePassStorageTypeOptions.size(); ++i) - { - if (keystorePassStorageTypeOptions.get(i).getLeft() == p) - { - this.cmbKeystorePassStoreType.select(i); - break; - } - } - - boolean showPasswordFields = (p == KeyStorePassStorageType.DISK); - this.lblKeystoreKeyPass.setVisible(showPasswordFields); - this.txtKeystoreKeyPass.setVisible(showPasswordFields); - this.lblKeystoreStorePass.setVisible(showPasswordFields); - this.txtKeystoreStorePass.setVisible(showPasswordFields); - if (showPasswordFields) - { /* get rid of potential nulls */ - performKeystoreKeyPassChanged(this.txtKeystoreKeyPass.getText()); - performKeystoreStorePassChanged(this.txtKeystoreStorePass.getText()); - } - } - - /** - * @param storepass - */ - protected void performKeystoreStorePassChanged(String storepass) { - log.debug("Changed keystore store password"); - this.configurationContainer.keystoreStorePass = storepass; - if (storepass == null) - this.txtKeystoreStorePass.setText(""); - else - this.txtKeystoreStorePass.setText(storepass); - } - - /** - * @param alias - */ - protected void performKeystoreAliasChanged(String alias) { - log.debug("Selected keystore alias: " + alias); - this.configurationContainer.keystoreAlias = alias; - this.cmbKeystoreAlias.setText(alias); - } - - /** - * @param keypass - */ - protected void performKeystoreKeyPassChanged(String keypass) { - log.debug("Changed keystore key password"); - this.configurationContainer.keystoreKeyPass = keypass; - if (keypass == null) - this.txtKeystoreKeyPass.setText(""); - else - this.txtKeystoreKeyPass.setText(keypass); - } - - @Override - public void initConfiguration(ConfigurationManager provider) { - ConfigurationDataInMemory config = this.configurationContainer; - config.keystoreFile = provider.getKeyStoreFilePersistent(); - config.keystoreType = provider.getKeyStoreTypePersistent(); - config.keystoreAlias = provider.getKeyStoreAliasPersistent(); - config.keystorePassStorageType = provider.getKeyStorePassStorageType(); - if (config.keystorePassStorageType == KeyStorePassStorageType.DISK) { - config.keystoreStorePass = provider.getKeyStoreStorePassPersistent(); - config.keystoreKeyPass = provider.getKeyStoreKeyPassPersistent(); - } else if (config.keystorePassStorageType == KeyStorePassStorageType.MEMORY) { - config.keystoreStorePass = provider.getKeyStoreStorePass(); - config.keystoreKeyPass = provider.getKeyStoreKeyPass(); - } - } - - /* - * (non-Javadoc) - * @see at.asit.pdfover.gui.composites.BaseConfigurationComposite#loadConfiguration - * () - */ - @Override - public void loadConfiguration() { - // Initialize form fields from configuration Container - ConfigurationDataInMemory config = this.configurationContainer; - - String ks = config.keystoreFile; - performKeystoreFileChanged(ks); - performKeystoreTypeChanged(config.keystoreType); - performKeystorePassStorageTypeChanged(config.keystorePassStorageType); - performKeystoreStorePassChanged(config.keystoreStorePass); - try { - File ksf = new File(ks); - if (ksf.exists() && config.keystoreStorePass != null) - loadKeystore(); - } catch (Exception e) { - log.info("Failed to load keystore on init", e); - } - performKeystoreAliasChanged(config.keystoreAlias); - performKeystoreKeyPassChanged(config.keystoreKeyPass); - } - - @Override - public void storeConfiguration(ConfigurationManager store) { - ConfigurationDataInMemory config = this.configurationContainer; - store.setKeyStoreFilePersistent(config.keystoreFile); - store.setKeyStoreTypePersistent(config.keystoreType); - store.setKeyStoreAliasPersistent(config.keystoreAlias); - store.setKeyStorePassStorageTypePersistent(config.keystorePassStorageType); - if (config.keystorePassStorageType == KeyStorePassStorageType.DISK) - { - store.setKeyStoreStorePassPersistent(config.keystoreStorePass); - store.setKeyStoreKeyPassPersistent(config.keystoreKeyPass); - } - else if (config.keystorePassStorageType == KeyStorePassStorageType.MEMORY) - { - store.setKeyStoreStorePassOverlay(config.keystoreStorePass); - store.setKeyStoreKeyPassOverlay(config.keystoreKeyPass); - } - } - - /* - * (non-Javadoc) - * - * @see - * at.asit.pdfover.gui.composites.BaseConfigurationComposite#validateSettings - * () - */ - @Override - public void validateSettings(int resumeFrom) throws Exception { - ConfigurationDataInMemory config = this.configurationContainer; - switch (resumeFrom) { - case 0: - String fname = config.keystoreFile; - - if (fname.isEmpty()) - break; //no checks required - - File f = new File(fname); - if (!f.exists() || !f.isFile()) - throw new KeystoreDoesntExistException(f, 4); //skip next checks - // Fall through - case 1: - try { - if (config.keystoreStorePass != null) /* don't cause password prompts, just silently accept if there is no saved password */ - loadKeystore(); - } catch (Exception e) { - throw new CantLoadKeystoreException(e, 4); //skip next checks - } - // Fall through - case 2: - { - if (this.ks != null) - { - String alias = config.keystoreAlias; - if (!this.ks.containsAlias(alias)) - throw new KeystoreAliasDoesntExistException(alias, 4); //skip next check - if (!this.ks.isKeyEntry(alias)) - throw new KeystoreAliasNoKeyException(alias, 4); //skip next check - } - } - // Fall through - case 3: - try { - String alias = config.keystoreAlias; - String keypass = config.keystoreKeyPass; - if ((this.ks != null) && (keypass != null)) - { /* if no keypass is specified, this will happen at signature time */ - this.ks.getKey(alias, keypass.toCharArray()); - } - } catch (Exception e) { - throw new KeystoreKeyPasswordException(4); - } - } - } - - - Map<String, String> keystoreTypes; - private void reloadKeystoreTypeStrings() { - this.keystoreTypes = new HashMap<String, String>(); - this.keystoreTypes.put(Messages.getString("keystore_config.KeystoreType_PKCS12"), "PKCS12"); - this.keystoreTypes.put(Messages.getString("keystore_config.KeystoreType_JKS"), "JCEKS"); - } - - Vector<Pair<KeyStorePassStorageType, String>> keystorePassStorageTypeOptions; - private void reloadKeystorePassStorageTypeStrings() { - keystorePassStorageTypeOptions = new Vector<Pair<KeyStorePassStorageType, String>>(); - java.util.function.BiConsumer<KeyStorePassStorageType, String> add = (k,v) -> { - keystorePassStorageTypeOptions.add(new ImmutablePair<KeyStorePassStorageType,String>(k,Messages.getString(v))); - }; - add.accept(null, "keystore_config.SaveToWhere.None"); - add.accept(KeyStorePassStorageType.MEMORY, "keystore_config.SaveToWhere.Memory"); - add.accept(KeyStorePassStorageType.DISK, "keystore_config.SaveToWhere.Disk"); - - int n = keystorePassStorageTypeOptions.size(); - cmbKeystorePassStoreType.setVisibleItemCount(n); - cmbKeystorePassStoreType.setItems(); - for (int i=0; i<n; ++i) - cmbKeystorePassStoreType.add(keystorePassStorageTypeOptions.get(i).getRight()); - } - - - @Override - - public void reloadResources() { - SWTUtils.setLocalizedText(grpKeystore, "keystore_config.Keystore_Title"); - SWTUtils.setLocalizedText(lblKeystoreFile, "keystore_config.KeystoreFile"); - SWTUtils.setLocalizedText(btnBrowse, "common.browse"); - SWTUtils.setLocalizedToolTipText(txtKeystoreFile, "keystore_config.KeystoreFile_ToolTip"); - SWTUtils.setLocalizedText(lblKeystoreType, "keystore_config.KeystoreType"); - reloadKeystoreTypeStrings(); - SWTUtils.setLocalizedText(lblKeystorePassStoreType, "keystore_config.SaveToWhere.Header"); - reloadKeystorePassStorageTypeStrings(); - this.cmbKeystoreType.setItems(this.keystoreTypes.keySet().toArray(new String[0])); - SWTUtils.setLocalizedText(lblKeystoreStorePass, "keystore_config.KeystoreStorePass"); - SWTUtils.setLocalizedToolTipText(txtKeystoreStorePass, "keystore_config.KeystoreStorePass_ToolTip"); - SWTUtils.setLocalizedText(btnLoad, "keystore_config.Load"); - SWTUtils.setLocalizedToolTipText(btnLoad, "keystore_config.Load_ToolTip"); - SWTUtils.setLocalizedText(lblKeystoreAlias, "keystore_config.KeystoreAlias"); - SWTUtils.setLocalizedText(lblKeystoreKeyPass, "keystore_config.KeystoreKeyPass"); - SWTUtils.setLocalizedToolTipText(txtKeystoreKeyPass, "keystore_config.KeystoreKeyPass_ToolTip"); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/SimpleConfigurationComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/SimpleConfigurationComposite.java deleted file mode 100644 index cf24dca3..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/configuration/SimpleConfigurationComposite.java +++ /dev/null @@ -1,717 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.composites.configuration; - -// Imports -import java.io.File; -import java.util.Arrays; -import java.util.Locale; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.dnd.DND; -import org.eclipse.swt.dnd.DropTarget; -import org.eclipse.swt.dnd.DropTargetAdapter; -import org.eclipse.swt.dnd.DropTargetEvent; -import org.eclipse.swt.dnd.FileTransfer; -import org.eclipse.swt.dnd.Transfer; -import org.eclipse.swt.events.FocusAdapter; -import org.eclipse.swt.events.FocusEvent; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Canvas; -import org.eclipse.swt.widgets.Combo; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.FileDialog; -import org.eclipse.swt.widgets.Group; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Scale; -import org.eclipse.swt.widgets.Text; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.commons.Profile; -import at.asit.pdfover.gui.controls.Dialog.BUTTONS; -import at.asit.pdfover.gui.controls.ErrorDialog; -import at.asit.pdfover.gui.controls.ErrorMarker; -import at.asit.pdfover.gui.exceptions.InvalidEmblemFile; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.gui.workflow.config.ConfigurationDataInMemory; -import at.asit.pdfover.gui.workflow.config.ConfigurationManager; -import at.asit.pdfover.gui.workflow.states.State; -import at.asit.pdfover.signer.Emblem; -import at.asit.pdfover.signer.pdfas.PdfAs4SignatureParameter; -import at.asit.pdfover.signer.pdfas.PdfAs4SignaturePlaceholder; - -/** - * - */ -public class SimpleConfigurationComposite extends ConfigurationCompositeBase { - - /** - * SLF4J Logger instance - **/ - static final Logger log = LoggerFactory.getLogger(SimpleConfigurationComposite.class); - - private Group grpHandySignatur; - private Label lblMobileNumber; - protected Text txtMobileNumber; - protected ErrorMarker txtMobileNumberErrorMarker; - - private Group grpPreview; - protected Canvas cSigPreview; - protected Button btnClearImage; - private Button btnBrowseLogo; - - private Group grpSignatureNote; - private Label lblSignatureNote; - protected Text txtSignatureNote; - private Button btnSignatureNoteDefault; - - protected final Group grpSignatureLang; - protected final Combo cmbSignatureLang; - - final Group grpLogoOnlyTargetSize; - final Label lblLogoOnlyTargetSizeCurrentValue; - /** in millimeters */ - final Scale sclLogoOnlyTargetSize; - private void updateLogoOnlyTargetSizeCurrentValueLabel() { - lblLogoOnlyTargetSizeCurrentValue.setText(String.format("%4.1fcm", configurationContainer.logoOnlyTargetSize / 10.0)); - } - - protected String logoFile = null; - - protected final Group grpSignatureProfile; - protected final Combo cmbSignatureProfiles; - - - - - /** - * @param parent - * @param style - * @param state - * @param container - */ - public SimpleConfigurationComposite( - org.eclipse.swt.widgets.Composite parent, int style, State state, - ConfigurationDataInMemory container) { - super(parent, style, state, container); - setLayout(new FormLayout()); - - this.grpHandySignatur = new Group(this, SWT.NONE | SWT.RESIZE); - SWTUtils.anchor(grpHandySignatur).right(100,-5).left(0,5).top(0,5); - grpHandySignatur.setLayout(new GridLayout(2, false)); - SWTUtils.setFontHeight(grpHandySignatur, Constants.TEXT_SIZE_NORMAL); - - this.lblMobileNumber = new Label(grpHandySignatur, SWT.NONE | SWT.RESIZE); - this.lblMobileNumber.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1)); - SWTUtils.setFontHeight(lblMobileNumber, Constants.TEXT_SIZE_NORMAL); - - Composite compMobileNumerContainer = new Composite(this.grpHandySignatur, SWT.NONE); - compMobileNumerContainer.setLayout(new FormLayout()); - compMobileNumerContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); - - this.txtMobileNumber = new Text(compMobileNumerContainer, SWT.BORDER | SWT.RESIZE); - SWTUtils.anchor(txtMobileNumber).left(0,5).right(100,-42).top(0); - SWTUtils.setFontHeight(txtMobileNumber, Constants.TEXT_SIZE_NORMAL); - - this.txtMobileNumberErrorMarker = new ErrorMarker(compMobileNumerContainer, SWT.NONE, ""); - this.txtMobileNumberErrorMarker.setVisible(false); - SWTUtils.anchor(txtMobileNumberErrorMarker).left(100,-32).right(100).top(0).bottom(0,32); - - this.txtMobileNumber.addTraverseListener(e -> { - if (e.detail == SWT.TRAVERSE_RETURN) { - processNumberChanged(); - } - }); - - this.txtMobileNumber.addFocusListener(new FocusAdapter() { - @Override - public void focusLost(FocusEvent e) { - processNumberChanged(); - } - }); - - this.grpSignatureProfile = new Group(this, SWT.NONE); - SWTUtils.anchor(grpSignatureProfile).right(100,-5).left(0,5).top(grpHandySignatur, 5); - this.grpSignatureProfile.setLayout(new FormLayout()); - SWTUtils.setFontHeight(grpSignatureProfile, Constants.TEXT_SIZE_NORMAL); - - this.cmbSignatureProfiles = new Combo(this.grpSignatureProfile, SWT.READ_ONLY); - SWTUtils.anchor(cmbSignatureProfiles).left(0,10).right(100,-10).top(0,10).bottom(100,-10); - SWTUtils.setFontHeight(cmbSignatureProfiles, Constants.TEXT_SIZE_NORMAL); - SWTUtils.scrollPassthrough(cmbSignatureProfiles); - this.cmbSignatureProfiles.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - Profile current = SimpleConfigurationComposite.this.configurationContainer.getSignatureProfile(); - int index = SimpleConfigurationComposite.this.cmbSignatureProfiles.getSelectionIndex(); - Profile selected = Profile.values()[index]; - if (!current.equals(selected)) { - performProfileSelectionChanged(selected); - } - } - }); - - this.grpSignatureLang = new Group(this, SWT.NONE); - SWTUtils.anchor(grpSignatureLang).right(100,-5).top(grpSignatureProfile, 5).left(0,5); - this.grpSignatureLang.setLayout(new FormLayout()); - SWTUtils.setFontHeight(grpSignatureLang, Constants.TEXT_SIZE_NORMAL); - - this.cmbSignatureLang = new Combo(this.grpSignatureLang, SWT.READ_ONLY); - SWTUtils.anchor(cmbSignatureLang).left(0,10).right(100,-10).top(0,10).bottom(100,-10); - SWTUtils.setFontHeight(cmbSignatureLang, Constants.TEXT_SIZE_NORMAL); - SWTUtils.scrollPassthrough(cmbSignatureLang); - this.cmbSignatureLang.setItems(Arrays.stream(Constants.SUPPORTED_LOCALES).map(l -> l.getDisplayLanguage()).toArray(String[]::new)); - - this.cmbSignatureLang.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - Locale currentLocale = SimpleConfigurationComposite.this.configurationContainer.signatureLocale; - Locale selectedLocale = Constants.SUPPORTED_LOCALES[SimpleConfigurationComposite.this.cmbSignatureLang.getSelectionIndex()]; - if (!currentLocale.equals(selectedLocale)) { - performSignatureLangSelectionChanged(selectedLocale, currentLocale); - } - } - }); - - this.grpSignatureNote = new Group(this, SWT.NONE); - SWTUtils.anchor(grpSignatureNote).right(100,-5).top(grpSignatureLang,5).left(0,5); - this.grpSignatureNote.setLayout(new GridLayout(2, false)); - SWTUtils.setFontHeight(grpSignatureNote, Constants.TEXT_SIZE_NORMAL); - - this.lblSignatureNote = new Label(this.grpSignatureNote, SWT.NONE); - do { /* grid positioning */ - GridData gd_lblSignatureNote = new GridData(SWT.LEFT, SWT.CENTER, - false, false, 1, 1); - gd_lblSignatureNote.widthHint = 66; - this.lblSignatureNote.setLayoutData(gd_lblSignatureNote); - this.lblSignatureNote.setBounds(0, 0, 57, 15); - } while (false); - SWTUtils.setFontHeight(lblSignatureNote, Constants.TEXT_SIZE_NORMAL); - - Composite compSignatureNoteContainer = new Composite(this.grpSignatureNote, SWT.NONE); - compSignatureNoteContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1)); - compSignatureNoteContainer.setLayout(new FormLayout()); - - this.txtSignatureNote = new Text(compSignatureNoteContainer, SWT.BORDER); - SWTUtils.anchor(txtSignatureNote).top(0,0).left(0,5).right(100,-42); - SWTUtils.setFontHeight(txtSignatureNote, Constants.TEXT_SIZE_NORMAL); - - this.txtSignatureNote.addFocusListener(new FocusAdapter() { - @Override - public void focusLost(FocusEvent e) { - processSignatureNoteChanged(); - } - }); - - this.txtSignatureNote.addTraverseListener(e -> { - if (e.detail == SWT.TRAVERSE_RETURN) { - processSignatureNoteChanged(); - } - }); - - Composite compSignatureNoteButtonContainer = new Composite(this.grpSignatureNote, SWT.NONE); - compSignatureNoteButtonContainer.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false, 2, 1)); - compSignatureNoteButtonContainer.setLayout(new FormLayout()); - - this.btnSignatureNoteDefault = new Button(compSignatureNoteButtonContainer, SWT.NONE); - SWTUtils.anchor(btnSignatureNoteDefault).top(0,0).right(100,-42); - SWTUtils.setFontHeight(btnSignatureNoteDefault, Constants.TEXT_SIZE_BUTTON); - this.btnSignatureNoteDefault.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - SimpleConfigurationComposite.this.txtSignatureNote.setText(getDefaultSignatureBlockNoteTextFor(null, null)); - } - }); - - this.grpLogoOnlyTargetSize = new Group(this, SWT.NONE); - SWTUtils.anchor(grpLogoOnlyTargetSize).left(0,5).right(100,-5).top(grpSignatureProfile,5); - this.grpLogoOnlyTargetSize.setLayout(new FormLayout()); - SWTUtils.setFontHeight(grpLogoOnlyTargetSize, Constants.TEXT_SIZE_NORMAL); - - Label lblLOTSLeft = new Label(this.grpLogoOnlyTargetSize, SWT.HORIZONTAL); - SWTUtils.anchor(lblLOTSLeft).top(0, 5).left(0, 15); - lblLOTSLeft.setText("1cm"); - SWTUtils.setFontHeight(lblLOTSLeft, Constants.TEXT_SIZE_NORMAL); - - Label lblLOTSRight = new Label(this.grpLogoOnlyTargetSize, SWT.HORIZONTAL); - SWTUtils.anchor(lblLOTSRight).top(0,5).right(100, -5); - lblLOTSRight.setText("20cm"); - SWTUtils.setFontHeight(lblLOTSRight, Constants.TEXT_SIZE_NORMAL); - - this.sclLogoOnlyTargetSize = new Scale(this.grpLogoOnlyTargetSize, SWT.HORIZONTAL); - SWTUtils.anchor(sclLogoOnlyTargetSize).top(0,5).left(lblLOTSLeft,5).right(lblLOTSRight,-5); - sclLogoOnlyTargetSize.setMinimum(10); - sclLogoOnlyTargetSize.setMaximum(200); - sclLogoOnlyTargetSize.setIncrement(1); - sclLogoOnlyTargetSize.setPageIncrement(1); - SWTUtils.scrollPassthrough(sclLogoOnlyTargetSize); - SWTUtils.addSelectionListener(sclLogoOnlyTargetSize, e -> - { - configurationContainer.logoOnlyTargetSize = sclLogoOnlyTargetSize.getSelection(); - this.updateLogoOnlyTargetSizeCurrentValueLabel(); - }); - sclLogoOnlyTargetSize.addFocusListener(new FocusAdapter() { - public void focusLost(FocusEvent e) { signatureBlockPreviewChanged(); }; - }); - - this.lblLogoOnlyTargetSizeCurrentValue = new Label(this.grpLogoOnlyTargetSize, SWT.HORIZONTAL); - SWTUtils.anchor(lblLogoOnlyTargetSizeCurrentValue).top(sclLogoOnlyTargetSize, 5).left(0,5).right(100,-5); - lblLogoOnlyTargetSizeCurrentValue.setAlignment(SWT.CENTER); - SWTUtils.setFontHeight(lblLogoOnlyTargetSizeCurrentValue, Constants.TEXT_SIZE_NORMAL); - - this.grpPreview = new Group(this, SWT.NONE); - SWTUtils.anchor(grpPreview).left(0,5).right(100,-5).top(grpSignatureNote, 5).height(250); - this.grpPreview.setLayout(new FormLayout()); - SWTUtils.setFontHeight(grpPreview, Constants.TEXT_SIZE_NORMAL); - - Composite containerComposite = new Composite(this.grpPreview, SWT.NONE); - SWTUtils.anchor(containerComposite).left(0).right(100).top(0).bottom(100); - containerComposite.setLayout(new FormLayout()); - - this.btnBrowseLogo = new Button(containerComposite, SWT.NONE); - SWTUtils.anchor(btnBrowseLogo).top(0,5).right(50,-5); - SWTUtils.setFontHeight(btnBrowseLogo, Constants.TEXT_SIZE_BUTTON); - - this.btnClearImage = new Button(containerComposite, SWT.NATIVE); - SWTUtils.anchor(btnClearImage).top(0,5).left(50, 5); - SWTUtils.setFontHeight(btnClearImage, Constants.TEXT_SIZE_BUTTON); - this.btnClearImage.setEnabled(false); - - this.cSigPreview = new Canvas(containerComposite, SWT.RESIZE); - SWTUtils.anchor(cSigPreview).left(0, 5).right(100,-5).top(btnBrowseLogo,5).bottom(100,-5); - SWTUtils.setFontHeight(cSigPreview, Constants.TEXT_SIZE_NORMAL); - this.cSigPreview.addPaintListener(e -> SimpleConfigurationComposite.this.paintSignaturePreview(e)); - - DropTarget dnd_target = new DropTarget(containerComposite, DND.DROP_DEFAULT | DND.DROP_COPY); - final FileTransfer fileTransfer = FileTransfer.getInstance(); - Transfer[] types = new Transfer[] { fileTransfer }; - dnd_target.setTransfer(types); - - dnd_target.addDropListener(new DropTargetAdapter() { - @Override - public void drop(DropTargetEvent event) { - if (fileTransfer.isSupportedType(event.currentDataType)) { - String[] files = (String[]) event.data; - if (files.length > 0) { - // Only taking first file ... - File file = new File(files[0]); - if (!file.exists()) { - log.error("File: {} does not exist!", files[0]); //// - return; - } - performProfileSelectionChanged(Profile.BASE_LOGO); - processEmblemChanged(file.getAbsolutePath()); - } - } - } - - @Override - public void dragOperationChanged(DropTargetEvent event) { - if (event.detail == DND.DROP_DEFAULT) { - if ((event.operations & DND.DROP_COPY) != 0) { - event.detail = DND.DROP_COPY; - } else { - event.detail = DND.DROP_NONE; - } - } - } - - @Override - public void dragEnter(DropTargetEvent event) { - if (event.detail == DND.DROP_DEFAULT) { - if ((event.operations & DND.DROP_COPY) != 0) { - event.detail = DND.DROP_COPY; - } else { - event.detail = DND.DROP_NONE; - } - } - // Only drop one item! - if (event.dataTypes.length > 1) { - event.detail = DND.DROP_NONE; - return; - } - // will accept text but prefer to have files dropped - for (int i = 0; i < event.dataTypes.length; i++) { - if (fileTransfer.isSupportedType(event.dataTypes[i])) { - event.currentDataType = event.dataTypes[i]; - // files should only be copied - if (event.detail != DND.DROP_COPY) { - event.detail = DND.DROP_NONE; - } - break; - } - } - } - }); - - this.btnClearImage.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - SimpleConfigurationComposite.this.processEmblemChanged(null); - } - }); - this.btnBrowseLogo.addSelectionListener(new ImageFileBrowser()); - - this.cSigPreview.addMouseListener(new MouseAdapter() { - @Override - public void mouseUp(MouseEvent e) { - SimpleConfigurationComposite.this.forceFocus(); - } - }); - - // Load localized strings - reloadResources(); - } - - private PdfAs4SignatureParameter sigPreviewParam = null; - private Image sigPreview = null; - void paintSignaturePreview(PaintEvent evt) { - if (this.sigPreview == null) - return; - Rectangle r = this.sigPreview.getBounds(); - int srcW = r.width; - int srcH = r.height; - Point p = ((Canvas)evt.widget).getSize(); - float dstW = p.x; - float dstH = p.y; - - float scale = dstW / srcW; - if (srcH * scale > dstH) - scale = dstH / srcH; - - float w = srcW * scale; - float h = srcH * scale; - - int x = (int) ((dstW / 2) - (w / 2)); - int y = (int) ((dstH / 2) - (h / 2)); - evt.gc.drawImage(this.sigPreview, 0, 0, srcW, srcH, x, y, (int) w, (int) h); - } - - /** - * - */ - private final class ImageFileBrowser extends SelectionAdapter { - /** - * - */ - public ImageFileBrowser() { - // Nothing to do - } - - @Override - public void widgetSelected(SelectionEvent e) { - FileDialog dialog = new FileDialog( - SimpleConfigurationComposite.this.getShell(), SWT.OPEN); - dialog.setFilterExtensions(new String[] { - "*.jpg;*.png;*.gif", "*.jpg", "*.png", "*.gif", "*" }); - dialog.setFilterNames(new String[] { - Messages.getString("common.ImageExtension_Description"), - Messages.getString("common.JPGExtension_Description"), - Messages.getString("common.PNGExtension_Description"), - Messages.getString("common.GIFExtension_Description"), - Messages.getString("common.AllExtension_Description") }); - String fileName = dialog.open(); - File file = null; - if (fileName != null) { - file = new File(fileName); - if (file.exists()) { - processEmblemChanged(fileName); - } - } - } - } - - private void setEmblemFileInternal(final String filename, boolean force) - throws Exception { - if (!force && this.configurationContainer.getEmblemPath() != null) { - if (this.configurationContainer.getEmblemPath().equals(filename)) { - return; // Ignore ... - } - } - - this.configurationContainer.setEmblem(filename); - this.btnClearImage.setEnabled(filename != null); - this.signatureBlockPreviewChanged(); - this.doLayout(); - } - - void signatureBlockPreviewChanged() { - try { - PdfAs4SignatureParameter param = new PdfAs4SignatureParameter(); - param.signatureProfile = this.configurationContainer.getSignatureProfile(); - if(this.configurationContainer.signatureNote != null && !this.configurationContainer.signatureNote.isEmpty()) { - param.signatureNote = this.configurationContainer.signatureNote; - } - - param.signatureLanguage = this.configurationContainer.signatureLocale.getLanguage(); - param.enablePDFACompat = this.configurationContainer.signaturePDFACompat; - param.targetLogoSize = Math.min(120.0, this.configurationContainer.logoOnlyTargetSize); // TODO WORKAROUND FOR #117 - String image = this.configurationContainer.getEmblemPath(); - if (image != null && !image.trim().isEmpty()) { - param.emblem = new Emblem(image); - } - - this.sigPreviewParam = param; - PdfAs4SignaturePlaceholder.For(param, (p) -> { - if (this.isDisposed()) - return; - - this.getDisplay().syncExec(() -> { - if (this.isDisposed()) - return; - if (this.sigPreviewParam != param) - return; - if (this.sigPreview != null) - this.sigPreview.dispose(); - if (p.hasImage()) - this.sigPreview = new Image(this.getDisplay(), p.getSWTImage()); - this.cSigPreview.redraw(); - }); - }); - } catch (Exception e) { - log.error("Failed to load image for display...", e); - } - } - - void processEmblemChanged(String filename) { - try { - setEmblemFileInternal(filename, false); - } catch (Exception ex) { - log.error("processEmblemChanged: ", ex); - ErrorDialog dialog = new ErrorDialog( - getShell(), - Messages.getString("error.FailedToLoadEmblem"), BUTTONS.OK); - dialog.open(); - } - } - - void processNumberChanged() { - try { - this.txtMobileNumberErrorMarker.setVisible(false); - plainMobileNumberSetter(); - } catch (Exception ex) { - this.txtMobileNumberErrorMarker.setVisible(true); - this.txtMobileNumberErrorMarker.setToolTipText(Messages - .getString("error.InvalidPhoneNumber")); - log.error("processNumberChanged: ", ex); - this.redraw(); - this.doLayout(); - } - } - - int getLocaleElementIndex(Locale locale) { - for (int i = 0; i < Constants.SUPPORTED_LOCALES.length; i++) { - if (Constants.SUPPORTED_LOCALES[i].equals(locale)) { - log.debug("Locale: {} IDX: {}",locale, i); - return i; - } - } - - log.warn("NO Locale match for {}", locale); - return 0; - } - - void performSignatureLangSelectionChanged(Locale selected, Locale previous) { - log.debug("Selected Sign Locale: {}", selected); - this.configurationContainer.signatureLocale = selected; - this.cmbSignatureLang.select(this.getLocaleElementIndex(selected)); - - if ((previous != null) && (txtSignatureNote.getText().equals(getDefaultSignatureBlockNoteTextFor(null, previous)))) - txtSignatureNote.setText(getDefaultSignatureBlockNoteTextFor(null, selected)); - - signatureBlockPreviewChanged(); - } - - - - void performProfileSelectionChanged(Profile newProfile) { - log.debug("Signature Profile {} was selected", newProfile.name()); - Profile oldProfile = this.configurationContainer.getSignatureProfile(); - this.configurationContainer.setSignatureProfile(newProfile); - this.cmbSignatureProfiles.select(newProfile.ordinal()); - - if (txtSignatureNote.getText().equals(getDefaultSignatureBlockNoteTextFor(oldProfile, null))) - txtSignatureNote.setText(getDefaultSignatureBlockNoteTextFor(newProfile, null)); - - this.grpSignatureLang.setVisible(newProfile.hasText()); - this.grpSignatureNote.setVisible(newProfile.hasText()); - this.grpLogoOnlyTargetSize.setVisible(newProfile.equals(Profile.BASE_LOGO)); - - SWTUtils.reanchor(grpPreview).top(newProfile.hasText() ? grpSignatureNote : grpLogoOnlyTargetSize, 5); - this.grpPreview.setVisible(newProfile.isVisibleSignature()); - this.grpPreview.requestLayout(); - signatureBlockPreviewChanged(); - } - - String getDefaultSignatureBlockNoteTextFor(Profile profile, Locale locale){ - if (profile == null) - profile = configurationContainer.getSignatureProfile(); - if (locale == null) - locale = configurationContainer.signatureLocale; - return profile.getDefaultSignatureBlockNote(locale); - } - - private void plainMobileNumberSetter() { - String number = this.txtMobileNumber.getText(); - this.configurationContainer.setMobileNumber(number); - number = this.configurationContainer.getMobileNumber(); - if (number == null) { - this.txtMobileNumber.setText(""); - return; - } - this.txtMobileNumber.setText(number); - } - - void processSignatureNoteChanged() { - String note = this.txtSignatureNote.getText(); - this.configurationContainer.signatureNote = note; - signatureBlockPreviewChanged(); - } - - @Override - public void initConfiguration(ConfigurationManager provider) { - this.configurationContainer.setMobileNumber(provider.getDefaultMobileNumberPersistent()); - - try { - this.configurationContainer.setEmblem(provider.getDefaultEmblemPersistent()); - } catch (InvalidEmblemFile e) { - log.error("Failed to set emblem!", e); - } - - this.configurationContainer.signatureLocale = provider.getSignatureLocale(); - this.configurationContainer.signatureNote = provider.getSignatureNote(); - this.configurationContainer.logoOnlyTargetSize = provider.getLogoOnlyTargetSize(); - } - - /* - * (non-Javadoc) - * @see at.asit.pdfover.gui.composites.BaseConfigurationComposite#loadConfiguration - * () - */ - @Override - public void loadConfiguration() { - // Initialize form fields from configuration Container - String number = this.configurationContainer.getMobileNumber(); - if (number != null) { - this.txtMobileNumber.setText(number); - } - - String emblemFile = this.configurationContainer.getEmblemPath(); - if (emblemFile != null && !emblemFile.trim().isEmpty()) { - this.logoFile = emblemFile; - try { - setEmblemFileInternal(emblemFile, true); - this.btnClearImage.setSelection(true); - } catch (Exception e1) { - log.error("Failed to load emblem: ", e1); - ErrorDialog dialog = new ErrorDialog( - getShell(), - Messages.getString("error.FailedToLoadEmblem"), BUTTONS.OK); - dialog.open(); - } - } - - String note = this.configurationContainer.signatureNote; - - if (note != null) { - this.txtSignatureNote.setText(note); - } - - this.sclLogoOnlyTargetSize.setSelection((int)this.configurationContainer.logoOnlyTargetSize); - this.updateLogoOnlyTargetSizeCurrentValueLabel(); - - this.signatureBlockPreviewChanged(); - - this.performSignatureLangSelectionChanged(this.configurationContainer.signatureLocale, null); - - this.performProfileSelectionChanged(this.configurationContainer.getSignatureProfile()); - - } - - @Override - public void storeConfiguration(ConfigurationManager store) { - store.setDefaultMobileNumberPersistent(this.configurationContainer.getMobileNumber()); - store.setDefaultEmblemPersistent(this.configurationContainer.getEmblemPath()); - store.setSignatureLocalePersistent(this.configurationContainer.signatureLocale); - store.setSignatureNotePersistent(this.configurationContainer.signatureNote); - store.setSignatureProfilePersistent(this.configurationContainer.getSignatureProfile()); - store.setLogoOnlyTargetSizePersistent(this.configurationContainer.logoOnlyTargetSize); - } - - /* - * (non-Javadoc) - * - * @see - * at.asit.pdfover.gui.composites.BaseConfigurationComposite#validateSettings - * () - */ - @Override - public void validateSettings(int resumeFrom) throws Exception { - switch (resumeFrom) { - case 0: - this.plainMobileNumberSetter(); - // Fall through - case 1: - this.processSignatureNoteChanged(); - break; - default: - break; - } - } - - /* - * (non-Javadoc) - * - * @see at.asit.pdfover.gui.composites.StateComposite#reloadResources() - */ - @Override - public void reloadResources() { - SWTUtils.setLocalizedText(grpHandySignatur, "simple_config.MobileBKU_Title"); - SWTUtils.setLocalizedText(lblMobileNumber, "simple_config.PhoneNumber"); - SWTUtils.setLocalizedToolTipText(txtMobileNumber, "simple_config.ExampleNumber_ToolTip"); - this.txtMobileNumber.setMessage(Messages.getString("simple_config.ExampleNumber")); - - SWTUtils.setLocalizedText(grpPreview, "simple_config.Preview_Title"); - SWTUtils.setLocalizedText(btnClearImage, "simple_config.ClearEmblem"); - SWTUtils.setLocalizedText(btnBrowseLogo, "simple_config.ReplaceEmblem"); - SWTUtils.setLocalizedText(grpSignatureNote, "simple_config.Note_Title"); - SWTUtils.setLocalizedText(lblSignatureNote, "simple_config.Note"); - SWTUtils.setLocalizedToolTipText(txtSignatureNote, "simple_config.Note_Tooltip"); - SWTUtils.setLocalizedText(btnSignatureNoteDefault, "simple_config.Note_SetDefault"); - - SWTUtils.setLocalizedText(grpSignatureLang, "simple_config.SigBlockLang_Title"); - SWTUtils.setLocalizedToolTipText(cmbSignatureLang, "simple_config.SigBlockLang_ToolTip"); - - SWTUtils.setLocalizedText(grpSignatureProfile, "simple_config.SigProfile_Title"); - this.cmbSignatureProfiles.setItems(Arrays.stream(Profile.values()).map(v -> Messages.getString("simple_config."+v.name())).toArray(String[]::new)); - - SWTUtils.setLocalizedText(grpLogoOnlyTargetSize, "simple_config.LogoOnlyTargetSize_Title"); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUEnterNumberComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUEnterNumberComposite.java deleted file mode 100644 index 7c02eda0..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUEnterNumberComposite.java +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.composites.mobilebku; - -// Imports -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Text; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.gui.bku.mobile.MobileBKUValidator; -import at.asit.pdfover.gui.composites.StateComposite; -import at.asit.pdfover.gui.exceptions.InvalidPasswordException; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.workflow.states.State; - -/** - * Composite for entering the phone number for the mobile BKU - */ -public class MobileBKUEnterNumberComposite extends StateComposite { - /** - * SLF4J Logger instance - **/ - static final Logger log = LoggerFactory.getLogger(MobileBKUEnterNumberComposite.class); - - /** - * - */ - private final SelectionListener okListener = new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - if (!MobileBKUEnterNumberComposite.this.btn_ok.isEnabled()) { - return; - } - - try { - String number = MobileBKUEnterNumberComposite.this.txt_number.getText(); - - MobileBKUEnterNumberComposite.this.setMobileNumber(number); - - String password = MobileBKUEnterNumberComposite.this.txt_password.getText(); - - MobileBKUValidator.validatePassword(password); - - MobileBKUEnterNumberComposite.this.mobilePassword = password; - MobileBKUEnterNumberComposite.this.userAck = true; - - MobileBKUEnterNumberComposite.this.btn_ok.setEnabled(false); - - } catch(InvalidPasswordException ex) { - log.info("Validating input for Mobile BKU failed!", ex); - MobileBKUEnterNumberComposite.this.setErrorMessage(ex.getMessage()); - MobileBKUEnterNumberComposite.this.txt_password.setFocus(); - } catch (Exception ex) { - log.info("Validating input for Mobile BKU failed!", ex); - MobileBKUEnterNumberComposite.this.setErrorMessage(Messages.getString("error.InvalidPhoneNumber")); - MobileBKUEnterNumberComposite.this.txt_number.setFocus(); - return; - } - } - }; - - /** - * - */ - private final SelectionListener cancelListener = new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent e) { - MobileBKUEnterNumberComposite.this.userCancel = true; - } - }; - - - String mobileNumber; - - String mobilePassword; - - Text txt_number; - - Text txt_password; - - String errorMessage = null; - - public boolean userAck = false; - public boolean userCancel = false; - - - private Label lbl_error; - private Label lbl_password; - private Label lbl_number; - - Button btn_ok; - Button btn_cancel; - Button btn_remember; - - /** - * @return the errorMessage - */ - public String getErrorMessage() { - return this.errorMessage; - } - - /** - * @param errorMessage - * the errorMessage to set - */ - public void setErrorMessage(String errorMessage) { - this.errorMessage = errorMessage; - - if (this.errorMessage != null) { - this.lbl_error.setText(this.errorMessage); - } else { - this.lbl_error.setText(""); - } - } - - public boolean isRememberPassword() { return this.btn_remember.getSelection(); } - public void setRememberPassword(boolean state) { this.btn_remember.setSelection(state); } - - /** - * Create the composite. - * - * @param parent - * @param style - * @param state - */ - public MobileBKUEnterNumberComposite(Composite parent, int style, State state) { - super(parent, style, state); - setLayout(new FormLayout()); - - final Composite containerComposite = new Composite(this, SWT.NATIVE); - containerComposite.addPaintListener(e -> { - Rectangle clientArea = containerComposite.getClientArea(); - - //e.gc.setForeground(); - e.gc.setForeground(Constants.MAINBAR_ACTIVE_BACK_DARK); - e.gc.setLineWidth(3); - e.gc.setLineStyle(SWT.LINE_SOLID); - e.gc.drawRoundRectangle(clientArea.x, - clientArea.y, clientArea.width - 2, clientArea.height - 2, - 10, 10); - }); - containerComposite.setLayout(new FormLayout()); - SWTUtils.anchor(containerComposite).top(50, -120).bottom(50, 120).left(50, -200).right(50, 200); - - this.txt_number = new Text(containerComposite, SWT.SINGLE | SWT.NATIVE | SWT.BORDER); - SWTUtils.anchor(txt_number).bottom(50, -10).left(50, 10).right(100, -20); - this.txt_number.setEditable(true); - - this.lbl_number = new Label(containerComposite, SWT.NATIVE); - this.lbl_number.setAlignment(SWT.RIGHT); - SWTUtils.anchor(lbl_number).bottom(50, -10).right(50, -10); - - ImageData mobileIconData = new ImageData(this.getClass().getResourceAsStream(Constants.RES_IMG_MOBILE)); - Image mobileIcon = new Image(getDisplay(), mobileIconData); - - Label lbl_image = new Label(containerComposite, SWT.NATIVE); - SWTUtils.anchor(lbl_image).top(20, -1 * (mobileIconData.width / 2)).bottom(20, mobileIconData.width / 2).left(0, 10).width(mobileIconData.width); - lbl_image.setImage(mobileIcon); - - this.txt_password = new Text(containerComposite, SWT.SINGLE | SWT.PASSWORD | SWT.BORDER | SWT.NATIVE); - SWTUtils.anchor(txt_password).top(50, 10).left(50, 10).right(100, -20); - this.txt_password.setEditable(true); - - this.lbl_password = new Label(containerComposite, SWT.NATIVE); - SWTUtils.anchor(lbl_password).top(50, 10).right(50, -10); - this.lbl_password.setAlignment(SWT.RIGHT); - - this.btn_ok = new Button(containerComposite, SWT.NATIVE); - SWTUtils.anchor(btn_ok).bottom(100, -20).right(100, -20); - this.btn_ok.addSelectionListener(this.okListener); - - this.btn_cancel = new Button(containerComposite, SWT.NATIVE); - SWTUtils.anchor(btn_cancel).bottom(100, -20).right(btn_ok, -10); - this.btn_cancel.addSelectionListener(this.cancelListener); - - this.lbl_error = new Label(containerComposite, SWT.WRAP | SWT.NATIVE ); - SWTUtils.anchor(lbl_error).bottom(103, -20).left(5, 0).right(btn_cancel, -10); - - this.btn_remember = new Button(containerComposite, SWT.CHECK); - SWTUtils.anchor(btn_remember).right(100, -10).top(0, 5); - } - - @Override public void onDisplay() { - getShell().setDefaultButton(this.btn_ok); - if (this.txt_number.getText().isEmpty()) { - this.txt_number.setFocus(); - } else { - this.txt_password.setFocus(); - } - } - - /** - * enables submit button - */ - public void enableButton() { - this.btn_ok.setEnabled(true); - } - - /** - * @return the mobileNumber - */ - public String getMobileNumber() { - return this.mobileNumber; - } - - /** - * @param mobileNumber - * the mobileNumber to set - */ - public void setMobileNumber(String mobileNumber) { - this.mobileNumber = mobileNumber; - - if (this.mobileNumber != null && !this.mobileNumber.isEmpty()) { - this.txt_number.setText(this.mobileNumber); - } else { - this.txt_number.setText(""); - } - } - - /** - * @return the mobilePassword - */ - public String getMobilePassword() { - return this.mobilePassword; - } - - - - /** - * @param mobilePassword - * the mobilePassword to set - */ - public void setMobilePassword(String mobilePassword) { - this.mobilePassword = mobilePassword; - - if (this.mobilePassword != null) { - this.txt_password.setText(this.mobilePassword); - } else { - this.txt_password.setText(""); - } - } - - /** (non-Javadoc) - * @see at.asit.pdfover.gui.composites.StateComposite#reloadResources() - */ - @Override - public void reloadResources() { - SWTUtils.setLocalizedText(lbl_number, "mobileBKU.number"); - SWTUtils.setLocalizedText(lbl_password, "mobileBKU.password"); - SWTUtils.setLocalizedText(btn_remember, "mobileBKU.rememberPassword"); - SWTUtils.setLocalizedText(btn_ok, "common.Ok"); - SWTUtils.setLocalizedText(btn_cancel, "common.Cancel"); - - SWTUtils.setLocalizedToolTipText(btn_remember, "mobileBKU.rememberPasswordNote"); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUEnterTANComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUEnterTANComposite.java deleted file mode 100644 index a1e90f51..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUEnterTANComposite.java +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.composites.mobilebku; - -// Imports -import java.net.URI; -import java.util.Objects; - -import javax.annotation.CheckForNull; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Link; -import org.eclipse.swt.widgets.Text; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.beust.jcommander.internal.Nullable; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.composites.StateComposite; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.gui.workflow.states.State; -import at.asit.webauthn.WebAuthN; - -/** - * Composite for entering the TAN for the mobile BKU - */ -public class MobileBKUEnterTANComposite extends StateComposite { - - private void validateAndConfirmTAN() { - String tan = this.txt_tan.getText(); - - tan = tan.trim(); - - if (tan.isEmpty()) { - this.setMessage(Messages.getString("error.NoTan")); - return; - } - - if (MobileBKUEnterTANComposite.this.refVal.startsWith(tan)) { - this.setMessage(Messages.getString("error.EnteredReferenceValue")); - return; - } - - if (tan.length() > 6) { - this.setMessage(Messages.getString("error.TanTooLong")); - return; - } - - this.tan = tan; - this.userAck = true; - } - - /** - * SLF4J Logger instance - **/ - static final Logger log = LoggerFactory.getLogger(MobileBKUEnterTANComposite.class); - - private Text txt_tan; - - private boolean userAck = false; - private boolean userCancel = false; - private boolean userFido2 = false; - - private Label lblRefVal; - - private String refVal; - - private URI signatureDataURI; - - /** - * @param signatureData - * the signatureData to set - */ - public void setSignatureDataURI(@Nullable URI uri) { - this.signatureDataURI = uri; - this.lnk_sig_data.setVisible(uri != null); - } - - private String tan; - - private Link lnk_sig_data; - - private Label lblMessage; - private Label lblRefValLabel; - private Label lblTan; - - private Button btn_ok; - private Button btn_cancel; - private Button btn_fido2; - - public boolean isDone() { return (this.userAck || this.userCancel || this.userFido2); } - public boolean isUserAck() { return this.userAck; } - public boolean isUserCancel() { return this.userCancel; } - public boolean isUserFido2() { return this.userFido2; } - - public void reset() { this.userAck = this.userCancel = this.userFido2 = false; } - - /** - * Set an error message - * @param errorMessage the error message - */ - public void setErrorMessage(String errorMessage) { - if (errorMessage == null) - this.lblMessage.setText(""); - else - this.lblMessage.setText( - Messages.getString("error.Title") + ": " + errorMessage); - } - - public void setFIDO2Enabled(boolean state) { - this.btn_fido2.setEnabled(state); - } - - /** - * Sets the message - * - * @param msg - */ - public void setMessage(String msg) { - this.lblMessage.setText(msg); - this.lblMessage.redraw(); - this.lblMessage.getParent().layout(true, true); - } - - public String getRefVal() { return this.refVal; } - public void setRefVal(@CheckForNull String refVal) { - this.refVal = (refVal != null) ? refVal.trim() : null; - this.lblRefVal.setText(Objects.requireNonNullElse(this.refVal, "")); - } - - /** - * @return the tan - */ - public String getTan() { - return this.tan; - } - - /** - * @param tan - * the tan to set - */ - public void setTan(String tan) { - this.tan = tan; - - if (this.tan == null) { - this.txt_tan.setText(""); - } else { - this.txt_tan.setText(this.tan); - } - } - - /** - * Create the composite. - * - * @param parent - * @param style - * @param state - */ - public MobileBKUEnterTANComposite(Composite parent, int style, State state) { - super(parent, style, state); - setLayout(new FormLayout()); - - final Composite containerComposite = new Composite(this, SWT.NATIVE); - containerComposite.addPaintListener(new PaintListener() { - @Override - public void paintControl(PaintEvent e) { - Rectangle clientArea = containerComposite.getClientArea(); - - // e.gc.setForeground(); - e.gc.setForeground(Constants.MAINBAR_ACTIVE_BACK_DARK); - e.gc.setLineWidth(3); - e.gc.setLineStyle(SWT.LINE_SOLID); - e.gc.drawRoundRectangle(clientArea.x, clientArea.y, - clientArea.width - 2, clientArea.height - 2, 10, 10); - } - }); - containerComposite.setLayout(new FormLayout()); - SWTUtils.anchor(containerComposite).top(50, -120).bottom(50, 120).left(50, -200).right(50, 200); - - this.lblRefValLabel = new Label(containerComposite, SWT.NATIVE); - SWTUtils.anchor(lblRefValLabel).right(50, -10).bottom(50,-10); - SWTUtils.setLocalizedText(lblRefValLabel, "tanEnter.ReferenceValue"); - this.lblRefValLabel.setAlignment(SWT.RIGHT); - - ImageData mobileIcon = new ImageData(this.getClass().getResourceAsStream(Constants.RES_IMG_MOBILE)); - Label lbl_image = new Label(containerComposite, SWT.NATIVE); - SWTUtils.anchor(lbl_image).top(50, -1 * (mobileIcon.width / 2)).bottom(50, mobileIcon.width / 2).left(0, 10).width(mobileIcon.width); - lbl_image.setImage(new Image(getDisplay(), mobileIcon)); - - this.lblRefVal = new Label(containerComposite, SWT.NATIVE); - SWTUtils.anchor(lblRefVal).left(50,10).right(100,-20).bottom(50,-10); - this.lblRefVal.setText(""); - - this.lblTan = new Label(containerComposite, SWT.NATIVE); - SWTUtils.anchor(lblTan).right(50,-10).top(50,10); - SWTUtils.setLocalizedText(lblTan, "tanEnter.TAN"); - this.lblTan.setAlignment(SWT.RIGHT); - - this.txt_tan = new Text(containerComposite, SWT.BORDER | SWT.NATIVE); - SWTUtils.anchor(txt_tan).left(50,10).right(100,-20).top(50,10); - this.txt_tan.setEditable(true); - - this.txt_tan.addTraverseListener((e) -> { - if (e.detail == SWT.TRAVERSE_RETURN) { - validateAndConfirmTAN(); - } - }); - - this.txt_tan.addModifyListener((e) -> { - String text = this.txt_tan.getText(); - if (text.length() > 3 && this.getRefVal().startsWith(text.trim())) - this.setMessage(Messages.getString("error.EnteredReferenceValue")); - }); - - this.lnk_sig_data = new Link(containerComposite, SWT.NATIVE | SWT.RESIZE); - SWTUtils.anchor(lnk_sig_data).right(100,-20).top(0,20); - lnk_sig_data.setEnabled(true); - SWTUtils.addSelectionListener(lnk_sig_data, (e) -> { SWTUtils.openURL(this.signatureDataURI); }); - - this.btn_ok = new Button(containerComposite, SWT.NATIVE); - SWTUtils.anchor(btn_ok).right(100,-20).bottom(100,-20); - SWTUtils.addSelectionListener(btn_ok, (e) -> { validateAndConfirmTAN(); }); - - this.btn_cancel = new Button(containerComposite, SWT.NATIVE); - SWTUtils.anchor(btn_cancel).right(btn_ok, -20).bottom(100, -20); - SWTUtils.addSelectionListener(btn_cancel, (e) -> { this.userCancel = true; }); - - this.btn_fido2 = new Button(containerComposite, SWT.NATIVE); - SWTUtils.anchor(btn_fido2).right(btn_cancel, -20).bottom(100, -20); - SWTUtils.addSelectionListener(btn_fido2, (e) -> { this.userFido2 = true; }); - this.btn_fido2.setVisible(WebAuthN.isAvailable()); - - this.lblMessage = new Label(containerComposite, SWT.WRAP | SWT.NATIVE); - SWTUtils.anchor(lblMessage).right(btn_fido2, -10).bottom(100, -20); - } - - @Override public void onDisplay() { getShell().setDefaultButton(btn_ok); txt_tan.setFocus(); } - - /* - * (non-Javadoc) - * - * @see at.asit.pdfover.gui.composites.StateComposite#reloadResources() - */ - @Override - public void reloadResources() { - SWTUtils.setLocalizedText(lnk_sig_data, "mobileBKU.show"); - SWTUtils.setLocalizedToolTipText(lnk_sig_data, "mobileBKU.show_tooltip"); - SWTUtils.setLocalizedText(lblRefValLabel, "tanEnter.ReferenceValue"); - SWTUtils.setLocalizedText(lblTan, "tanEnter.TAN"); - SWTUtils.setLocalizedText(btn_cancel, "common.Cancel"); - SWTUtils.setLocalizedText(btn_ok, "common.Ok"); - SWTUtils.setLocalizedText(btn_fido2, "tanEnter.FIDO2"); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUFido2Composite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUFido2Composite.java deleted file mode 100644 index b0506596..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUFido2Composite.java +++ /dev/null @@ -1,133 +0,0 @@ -package at.asit.pdfover.gui.composites.mobilebku; - -import java.net.URI; - -import javax.annotation.CheckForNull; -import javax.annotation.Nonnull; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Link; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.gui.composites.StateComposite; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.gui.workflow.states.State; -import at.asit.webauthn.PublicKeyCredential; -import at.asit.webauthn.WebAuthN; -import at.asit.webauthn.exceptions.WebAuthNUserCancelled; -import at.asit.webauthn.responsefields.AuthenticatorAssertionResponse; - -public class MobileBKUFido2Composite extends StateComposite { - private static final Logger log = LoggerFactory.getLogger(MobileBKUFido2Composite.class); - - private @Nonnull String fido2OptionsString = ""; - - private PublicKeyCredential<AuthenticatorAssertionResponse> credential; - private boolean userCancel; - private boolean userSms; - - private Button btn_authenticate; - private Button btn_cancel; - private Button btn_sms; - public void setSMSEnabled(boolean state) { this.btn_sms.setEnabled(state); } - - private @CheckForNull URI signatureDataURI; - private Link lnk_sigData; - public void setSignatureDataURI(URI uri) { this.signatureDataURI = uri; this.lnk_sigData.setVisible(uri != null); } - - public void initialize(@Nonnull String fido2Options) { - this.fido2OptionsString = fido2Options; - this.credential = null; - this.userCancel = this.userSms = false; - } - - public boolean isDone() { return ((this.credential != null) || this.userCancel || this.userSms); } - public PublicKeyCredential<AuthenticatorAssertionResponse> getResultingCredential() { return this.credential; } - public boolean wasUserCancelClicked() { return userCancel; } - public boolean wasUserSMSClicked() { return userSms; } - - public void beginAuthentication() { - if (!btn_authenticate.isEnabled()) return; - - SWTUtils.setLocalizedText(btn_authenticate, "common.working"); - btn_authenticate.setEnabled(false); - new Thread(() -> { - try { - this.credential = WebAuthN.buildGetFromJSON(this.fido2OptionsString).get("https://service.a-trust.at"); - } catch (Throwable t) { - if (!(t instanceof WebAuthNUserCancelled)) { - log.warn("webauthn operation failed", t); - } - } finally { - this.getDisplay().syncExec(() -> { btn_authenticate.setEnabled(true); this.reloadResources(); }); - this.getDisplay().wake(); - } - }).start(); - } - - public MobileBKUFido2Composite(Composite parent, int style, State state) { - super(parent, style, state); - setLayout(new FormLayout()); - - final Composite containerComposite = new Composite(this, SWT.NATIVE); - containerComposite.addPaintListener((e) -> { - Rectangle clientArea = containerComposite.getClientArea(); - e.gc.setForeground(Constants.MAINBAR_ACTIVE_BACK_DARK); - e.gc.setLineWidth(3); - e.gc.setLineStyle(SWT.LINE_SOLID); - e.gc.drawRoundRectangle(clientArea.x, clientArea.y+25, - clientArea.width - 2, clientArea.height - 27, 10, 10); - - }); - containerComposite.setLayout(new FormLayout()); - SWTUtils.anchor(containerComposite).top(50, -145).bottom(50, 120).left(50, -200).right(50, 200); - - ImageData webauthnLogoImg = new ImageData(this.getClass().getResourceAsStream(Constants.RES_IMG_WEBAUTHN)); - Label webauthnLogo = new Label(containerComposite, SWT.NATIVE); - SWTUtils.anchor(webauthnLogo).top(0,0).left(0, 10).height(50).width(187); - webauthnLogo.setBackground(getBackground()); - webauthnLogo.setImage(new Image(getDisplay(), webauthnLogoImg.scaledTo(187, 50))); - - ImageData fidoLogoImg = new ImageData(this.getClass().getResourceAsStream(Constants.RES_IMG_FIDO2)); - Label fidoLogo = new Label(containerComposite, SWT.NATIVE); - SWTUtils.anchor(fidoLogo).left(0, 10).bottom(100, -10).height(50).width(81); - fidoLogo.setImage(new Image(getDisplay(), fidoLogoImg.scaledTo(81, 50))); - - this.btn_authenticate = new Button(containerComposite, SWT.NATIVE); - SWTUtils.anchor(btn_authenticate).top(50, -15).left(0, 90).right(100, -90); - SWTUtils.addSelectionListener(btn_authenticate, this::beginAuthentication); - btn_authenticate.setEnabled(WebAuthN.isAvailable()); - - this.btn_cancel = new Button(containerComposite, SWT.NATIVE); - SWTUtils.anchor(btn_cancel).bottom(100, -10).right(100, -10); - SWTUtils.addSelectionListener(btn_cancel, () -> { this.userCancel = true; }); - - this.btn_sms = new Button(containerComposite, SWT.NATIVE); - SWTUtils.anchor(btn_sms).bottom(100, -10).right(btn_cancel, -10); - SWTUtils.addSelectionListener(btn_sms, () -> { this.userSms = true; }); - - this.lnk_sigData = new Link(containerComposite, SWT.NATIVE | SWT.RESIZE); - SWTUtils.anchor(lnk_sigData).top(0, 45).right(100, -20); - SWTUtils.addSelectionListener(lnk_sigData, (e) -> { SWTUtils.openURL(this.signatureDataURI); }); - } - - @Override public void onDisplay() { getShell().setDefaultButton(this.btn_authenticate); beginAuthentication(); } - - @Override - public void reloadResources() { - SWTUtils.setLocalizedText(btn_authenticate, WebAuthN.isAvailable() ? "mobileBKU.authorize" : "common.unavailable"); - SWTUtils.setLocalizedText(btn_cancel, "common.Cancel"); - SWTUtils.setLocalizedText(btn_sms, "tanEnter.SMS"); - SWTUtils.setLocalizedText(lnk_sigData, "mobileBKU.show"); - SWTUtils.setLocalizedToolTipText(lnk_sigData, "mobileBKU.show_tooltip"); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUFingerprintComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUFingerprintComposite.java deleted file mode 100644 index ee9d9a0c..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUFingerprintComposite.java +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.composites.mobilebku; - -import java.net.URI; -import java.util.Objects; - -import javax.annotation.CheckForNull; - -// Imports -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Link; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.composites.StateComposite; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.gui.workflow.states.State; -import at.asit.webauthn.WebAuthN; - -/** - * Composite for displaying the QR code for the mobile BKU - */ -public class MobileBKUFingerprintComposite extends StateComposite { - private Label lblError; - private Label lblRefValLabel; - private Label lblFPLabel; - private Label lblRefVal; - private Button btn_sms; - private Button btn_fido2; - private Button btn_cancel; - private Link lnk_sig_data; - public URI signatureDataURI; - private String refVal; - - private boolean userCancelClicked = false; - private boolean userSMSClicked = false; - private boolean userFido2Clicked = false; - private boolean pollingDone = false; - - public void signalPollingDone() { this.pollingDone = true; getDisplay().wake(); } - public boolean isDone() { return (this.userCancelClicked || this.userSMSClicked || this.userFido2Clicked || this.pollingDone); } - public boolean wasCancelClicked() { return this.userCancelClicked; } - public boolean wasSMSClicked() { return this.userSMSClicked; } - public boolean wasFIDO2Clicked() { return this.userFido2Clicked; } - public void reset() { this.userCancelClicked = this.userSMSClicked = this.userFido2Clicked = this.pollingDone = false; } - - public void setSMSEnabled(boolean state) { - this.btn_sms.setEnabled(state); - } - - public void setFIDO2Enabled(boolean state) { - this.btn_fido2.setEnabled(state); - } - - /** - * Set an error message - * @param errorMessage the error message - */ - public void setErrorMessage(String errorMessage) { - if (errorMessage == null) - this.lblError.setText(""); - else - this.lblError.setText(Messages.getString("error.Title") + ": " + errorMessage); - } - - public String getRefVal() { return this.refVal; } - public void setRefVal(@CheckForNull String refVal) { - this.refVal = (refVal != null) ? refVal.trim() : null; - this.lblRefVal.setText(Objects.requireNonNullElse(this.refVal, "")); - } - - /** - * Create the composite. - * - * @param parent - * @param style - * @param state - */ - public MobileBKUFingerprintComposite(Composite parent, int style, State state) { - super(parent, style, state); - setLayout(new FormLayout()); - - final Composite containerComposite = new Composite(this, SWT.NATIVE); - containerComposite.addPaintListener(new PaintListener() { - @Override - public void paintControl(PaintEvent e) { - Rectangle clientArea = containerComposite.getClientArea(); - - // e.gc.setForeground(); - e.gc.setForeground(Constants.MAINBAR_ACTIVE_BACK_DARK); - e.gc.setLineWidth(3); - e.gc.setLineStyle(SWT.LINE_SOLID); - e.gc.drawRoundRectangle(clientArea.x, clientArea.y, - clientArea.width - 2, clientArea.height - 2, 10, 10); - } - }); - containerComposite.setLayout(new FormLayout()); - SWTUtils.anchor(containerComposite).top(50, -140).bottom(50, 140).left(50, -200).right(50, 200); - - this.lblRefValLabel = new Label(containerComposite, SWT.NATIVE); - SWTUtils.anchor(lblRefValLabel).right(50, -10).top(30, -10); - this.lblRefValLabel.setAlignment(SWT.RIGHT); - - ImageData mobileIcon = new ImageData(this.getClass().getResourceAsStream(Constants.RES_IMG_MOBILE)); - Label lbl_image = new Label(containerComposite, SWT.NATIVE); - SWTUtils.anchor(lbl_image).top(50, -1 * (mobileIcon.width / 2)).bottom(50, mobileIcon.width / 2).left(0, 10).width(mobileIcon.width); - lbl_image.setImage(new Image(getDisplay(), mobileIcon)); - - this.lblRefVal = new Label(containerComposite, SWT.NATIVE); - SWTUtils.anchor(lblRefVal).left(50, 10).right(100, -20).top(30, -10); - - this.lblFPLabel = new Label(containerComposite, SWT.NATIVE); - SWTUtils.anchor(lblFPLabel).left(25, 10).top(lblRefValLabel, 10); - this.lblFPLabel.setAlignment(SWT.LEFT); - - this.lnk_sig_data = new Link(containerComposite, SWT.NATIVE | SWT.RESIZE); - SWTUtils.anchor(lnk_sig_data).right(100, -20).top(0, 20); - this.lnk_sig_data.setEnabled(true); - SWTUtils.addSelectionListener(lnk_sig_data, (e) -> { SWTUtils.openURL(this.signatureDataURI); }); - - this.btn_cancel = new Button(containerComposite, SWT.NATIVE); - SWTUtils.anchor(btn_cancel).right(100, -20).bottom(100, -20); - SWTUtils.addSelectionListener(btn_cancel, () -> { this.userCancelClicked = true; }); - - this.btn_sms = new Button(containerComposite, SWT.NATIVE); - SWTUtils.anchor(btn_sms).right(btn_cancel, -20).bottom(100, -20); - SWTUtils.addSelectionListener(btn_sms, () -> { this.userSMSClicked = true; }); - - this.btn_fido2 = new Button(containerComposite, SWT.NATIVE); - SWTUtils.anchor(btn_fido2).right(btn_sms, -20).bottom(100, -20); - SWTUtils.addSelectionListener(btn_fido2, () -> { this.userFido2Clicked = true; }); - this.btn_fido2.setVisible(WebAuthN.isAvailable()); - - this.lblError = new Label(containerComposite, SWT.WRAP | SWT.NATIVE); - SWTUtils.anchor(lblError).right(btn_sms, -10).bottom(100, -20); - - reloadResources(); - } - - /* - * (non-Javadoc) - * - * @see at.asit.pdfover.gui.composites.StateComposite#reloadResources() - */ - @Override - public void reloadResources() { - SWTUtils.setLocalizedText(lblRefValLabel, "tanEnter.ReferenceValue"); - SWTUtils.setLocalizedText(lblFPLabel, "tanEnter.FP"); - SWTUtils.setLocalizedText(lnk_sig_data, "mobileBKU.show"); - SWTUtils.setLocalizedToolTipText(lnk_sig_data, "mobileBKU.show_tooltip"); - SWTUtils.setLocalizedText(btn_cancel, "common.Cancel"); - SWTUtils.setLocalizedText(btn_sms, "tanEnter.SMS"); - SWTUtils.setLocalizedText(btn_fido2, "tanEnter.FIDO2"); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUQRComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUQRComposite.java deleted file mode 100644 index 135bb775..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/MobileBKUQRComposite.java +++ /dev/null @@ -1,240 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.composites.mobilebku; - -// Imports -import java.io.ByteArrayInputStream; -import java.net.URI; -import java.util.Objects; - -import javax.annotation.CheckForNull; -import javax.annotation.Nullable; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.SWTException; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Link; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.composites.StateComposite; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.gui.workflow.states.State; -import at.asit.webauthn.WebAuthN; - -/** - * Composite for displaying the QR code for the mobile BKU - */ -public class MobileBKUQRComposite extends StateComposite { - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(MobileBKUQRComposite.class); - - private Label lblQR; - - private boolean userCancelClicked = false; - private boolean userSMSClicked = false; - private boolean userFIDO2Clicked = false; - private boolean pollingDone = false; - - private Label lblRefVal; - - private String refVal; - - private ImageData currentQRImage; - - private URI signatureDataURI; - - private Label lblError; - private Label lblRefValLabel; - private Label lblQRLabel; - - private Button btn_fido2; - private Button btn_sms; - private Button btn_cancel; - - private Link lnk_sig_data; - - public void signalPollingDone() { this.pollingDone = true; getDisplay().wake(); } - public boolean isDone() { return (this.userCancelClicked || this.userSMSClicked || this.userFIDO2Clicked || this.pollingDone); } - public boolean wasCancelClicked() { return this.userCancelClicked; } - public boolean wasSMSClicked() { return this.userSMSClicked; } - public boolean wasFIDO2Clicked() { return this.userFIDO2Clicked; } - public void reset() { this.userCancelClicked = this.userSMSClicked = this.userFIDO2Clicked = this.pollingDone = false; } - - /** - * Set an error message - * @param errorMessage the error message - */ - public void setErrorMessage(String errorMessage) { - if (errorMessage == null) - this.lblError.setText(""); - else - this.lblError.setText( - Messages.getString("error.Title") + ": " + errorMessage); - } - - public String getRefVal() { return this.refVal; } - public void setRefVal(@CheckForNull String refVal) { - this.refVal = (refVal != null) ? refVal.trim() : null; - this.lblRefVal.setText(Objects.requireNonNullElse(this.refVal, "")); - } - - private void updateQRImage() { - if (this.currentQRImage == null) - return; - - Point availableSize = this.lblQR.getSize(); - int targetSize = Math.min(availableSize.x, availableSize.y); - if (targetSize <= 0) - return; - - this.lblQR.setImage(new Image(this.lblQR.getDisplay(), this.currentQRImage.scaledTo(targetSize, targetSize))); - } - - /** - * @param qrcode - * the qrcode to set - */ - public void setQR(byte[] qrcode) { - if (qrcode == null) { - setErrorMessage(Messages.getString("error.FailedToLoadQRCode")); - return; - } - try { - this.currentQRImage = new ImageData(new ByteArrayInputStream(qrcode)); - } catch (SWTException e) { - log.warn("Failed to load QR code", e); - setErrorMessage(Messages.getString("error.FailedToLoadQRCode")); - return; - } - updateQRImage(); - } - - public void setSMSEnabled(boolean state) { - this.btn_sms.setEnabled(state); - } - - public void setFIDO2Enabled(boolean state) { - this.btn_fido2.setEnabled(state); - } - - public void setSignatureDataURI(@Nullable URI uri) { - this.signatureDataURI = uri; - this.lnk_sig_data.setVisible(uri != null); - } - - /** - * Create the composite. - * - * @param parent - * @param style - * @param state - */ - public MobileBKUQRComposite(Composite parent, int style, State state) { - super(parent, style, state); - setLayout(new FormLayout()); - - final Composite containerComposite = new Composite(this, SWT.NATIVE); - SWTUtils.anchor(containerComposite).top(50, -140).bottom(50, 140).left(50, -200).right(50, 200); - containerComposite.addPaintListener(new PaintListener() { - @Override - public void paintControl(PaintEvent e) { - Rectangle clientArea = containerComposite.getClientArea(); - - // e.gc.setForeground(); - e.gc.setForeground(Constants.MAINBAR_ACTIVE_BACK_DARK); - e.gc.setLineWidth(3); - e.gc.setLineStyle(SWT.LINE_SOLID); - e.gc.drawRoundRectangle(clientArea.x, clientArea.y, - clientArea.width - 2, clientArea.height - 2, 10, 10); - } - }); - containerComposite.setLayout(new FormLayout()); - - this.lblRefValLabel = new Label(containerComposite, SWT.NATIVE); - SWTUtils.anchor(lblRefValLabel).right(50, -10).top(30, -10); - this.lblRefValLabel.setAlignment(SWT.RIGHT); - - ImageData mobileIcon = new ImageData(this.getClass().getResourceAsStream(Constants.RES_IMG_MOBILE)); - Label lbl_image = new Label(containerComposite, SWT.NATIVE); - SWTUtils.anchor(lbl_image).top(50, -1 * (mobileIcon.width / 2)).bottom(50, mobileIcon.width / 2).left(0, 10).width(mobileIcon.width); - lbl_image.setImage(new Image(getDisplay(), mobileIcon)); - - this.lblRefVal = new Label(containerComposite, SWT.NATIVE); - SWTUtils.anchor(lblRefVal).left(50, 10).right(100, -20).top(30, -10); - - this.lblQRLabel = new Label(containerComposite, SWT.NATIVE); - SWTUtils.anchor(lblQRLabel).right(50, -10).top(lblRefValLabel, 10); - this.lblQRLabel.setAlignment(SWT.RIGHT); - - this.lblQR = new Label(containerComposite, SWT.NATIVE); - this.lblQR.addListener(SWT.Resize, (e) -> { updateQRImage(); }); - - this.lnk_sig_data = new Link(containerComposite, SWT.NATIVE | SWT.RESIZE); - SWTUtils.anchor(lnk_sig_data).right(100, -20).top(0, 20); - SWTUtils.addSelectionListener(lnk_sig_data, (e) -> { SWTUtils.openURL(this.signatureDataURI); }); - - this.btn_cancel = new Button(containerComposite, SWT.NATIVE); - SWTUtils.anchor(btn_cancel).right(100, -20).bottom(100, -5); - SWTUtils.addSelectionListener(btn_cancel, (e) -> { this.userCancelClicked = true; }); - - this.btn_sms = new Button(containerComposite, SWT.NATIVE); - SWTUtils.anchor(btn_sms).right(btn_cancel, -20).bottom(100, -5); - SWTUtils.addSelectionListener(btn_sms, (e) -> { this.userSMSClicked = true; }); - - this.btn_fido2 = new Button(containerComposite, SWT.NATIVE); - SWTUtils.anchor(btn_fido2).right(btn_sms, -20).bottom(100, -5); - SWTUtils.addSelectionListener(btn_fido2, (e) -> { this.userFIDO2Clicked = true; }); - this.btn_fido2.setVisible(WebAuthN.isAvailable()); - - SWTUtils.anchor(lblQR).left(50, 10).right(100, -20).top(lblRefVal, 10).bottom(btn_sms, -10); - - this.lblError = new Label(containerComposite, SWT.WRAP | SWT.NATIVE); - SWTUtils.anchor(lblError).right(btn_sms, -10).bottom(100, -20); - - reloadResources(); - } - - /* - * (non-Javadoc) - * - * @see at.asit.pdfover.gui.composites.StateComposite#reloadResources() - */ - @Override - public void reloadResources() { - SWTUtils.setLocalizedText(lblRefValLabel, "tanEnter.ReferenceValue"); - SWTUtils.setLocalizedText(lblQRLabel, "tanEnter.QR"); - SWTUtils.setLocalizedText(lnk_sig_data, "mobileBKU.show"); - SWTUtils.setLocalizedToolTipText(lnk_sig_data, "mobileBKU.show_tooltip"); - SWTUtils.setLocalizedText(btn_cancel, "common.Cancel"); - SWTUtils.setLocalizedText(btn_sms, "tanEnter.SMS"); - SWTUtils.setLocalizedText(btn_fido2, "tanEnter.FIDO2"); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/WaitingForAppComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/WaitingForAppComposite.java deleted file mode 100644 index 24529452..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/mobilebku/WaitingForAppComposite.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.composites.mobilebku; - - -// Imports -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.FormLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.ProgressBar; - -import at.asit.pdfover.gui.composites.StateComposite; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.gui.workflow.states.State; -import at.asit.webauthn.WebAuthN; - -import org.eclipse.swt.widgets.Button; - -/** - * - */ -public class WaitingForAppComposite extends StateComposite { - private Label lbl_description; - private Button btn_sms; - private Button btn_cancel; - private Button btn_fido2; - private boolean userSMSClicked = false; - private boolean userCancelClicked = false; - private boolean userFIDO2Clicked = false; - private boolean pollingDone = false; - - public void signalPollingDone() { this.pollingDone = true; getDisplay().wake(); } - public boolean isDone() { return (this.userCancelClicked || this.userSMSClicked || this.userFIDO2Clicked || this.pollingDone); } - public boolean wasCancelClicked() { return this.userCancelClicked; } - public boolean wasSMSClicked() { return this.userSMSClicked; } - public boolean wasFIDO2Clicked() { return this.userFIDO2Clicked; } - public void reset() { this.userCancelClicked = this.userSMSClicked = this.userFIDO2Clicked = this.pollingDone = false; } - - public void setSMSEnabled(boolean state) { - this.btn_sms.setEnabled(state); - } - - public void setFIDO2Enabled(boolean state) { - this.btn_fido2.setEnabled(state); - } - - /** - * Create the composite. - * @param parent - * @param style - * @param state - */ - public WaitingForAppComposite(Composite parent, int style, State state) { - super(parent, style, state); - setLayout(new FormLayout()); - - this.lbl_description = new Label(this, SWT.NATIVE); - SWTUtils.anchor(lbl_description).bottom(50, -1).left(0, 10).right(100, -10); - this.lbl_description.setAlignment(SWT.CENTER); - SWTUtils.setLocalizedText(lbl_description, "waiting_for_app.message"); - - ProgressBar progressBar = new ProgressBar(this, SWT.HORIZONTAL | SWT.INDETERMINATE); - SWTUtils.anchor(progressBar).top(50, 10).bottom(50, 40).left(50,-100).right(50,100); - - this.btn_sms = new Button(this, SWT.NONE); - SWTUtils.anchor(btn_sms).top(progressBar, 24).right(progressBar, 0, SWT.RIGHT); - SWTUtils.addSelectionListener(btn_sms, (e) -> { this.userSMSClicked = true; }); - - this.btn_cancel = new Button(this, SWT.NONE); - SWTUtils.anchor(btn_cancel).top(btn_sms, 0, SWT.TOP).right(btn_sms, -6); - SWTUtils.addSelectionListener(btn_cancel, (e) -> { this.userCancelClicked = true; }); - - this.btn_fido2 = new Button(this, SWT.NONE); - SWTUtils.anchor(btn_fido2).top(btn_cancel, 0, SWT.TOP).right(btn_cancel, -6); - SWTUtils.addSelectionListener(btn_fido2, (e) -> { this.userFIDO2Clicked = true; }); - this.btn_fido2.setVisible(WebAuthN.isAvailable()); - - reloadResources(); - - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.composites.StateComposite#reloadResources() - */ - @Override - public void reloadResources() { - SWTUtils.setLocalizedText(lbl_description, "waiting_for_app.message"); - SWTUtils.setLocalizedText(btn_sms, "tanEnter.SMS"); - SWTUtils.setLocalizedText(btn_fido2, "tanEnter.FIDO2"); - SWTUtils.setLocalizedText(btn_cancel, "common.Cancel"); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/ClickableCanvas.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/ClickableCanvas.java deleted file mode 100644 index 0f3f1642..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/ClickableCanvas.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.controls; - -// Imports -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.graphics.Cursor; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.Canvas; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Event; - -/** - * - */ -public class ClickableCanvas extends Canvas { - - private Image image = null; - - /** - * @param parent - * @param style - */ - public ClickableCanvas(Composite parent, int style) { - super(parent, style); - - this.addPaintListener(new PaintListener() { - - @Override - public void paintControl(PaintEvent e) { - ClickableCanvas.this.paintControl(e); - } - }); - - final Cursor hand = new Cursor(this.getDisplay(), SWT.CURSOR_HAND); - - this.addListener(SWT.Resize, (Event event) -> { - ClickableCanvas.this.redraw(); - }); - - this.setCursor(hand); - - } - - /** - * Gets the image - * - * @return the image - */ - public Image getImage() { - return this.image; - } - - /** - * Sets the Image - * - * @param image - * the imgage to set - */ - public void setImage(Image image) { - this.image = image; - } - - /** - * Main painting method - * - * @param e - */ - void paintControl(PaintEvent e) { - this.paintText(e); - } - - /** - * Paint the text or image on the button - * - * @param e - */ - protected void paintText(PaintEvent e) { - Point size = this.getSize(); - int width = size.x; - - // e.gc.fillGradientRectangle(0, 1, width, height / 4, true); - - if (this.image != null) { - - //log.debug("Width: " + width + " Height: " + height); - - int w = 0; - Image tmp = null; - if(this.image.getImageData().width < width) { - tmp = new Image(getDisplay(), this.image.getImageData()); - w = (width - this.image.getImageData().width) / 2; - } else if(this.image.getImageData().width > width) { - tmp = new Image(getDisplay(), this.image.getImageData().scaledTo(width, width)); - } else { - tmp = new Image(getDisplay(), this.image.getImageData()); - } - - e.gc.drawImage(tmp, w, w); - } - - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/Dialog.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/Dialog.java deleted file mode 100644 index de3fb157..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/Dialog.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.controls; - -// Imports -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.MessageBox; -import org.eclipse.swt.widgets.Shell; - -/** - * A Message dialog - */ -public class Dialog { - - private MessageBox box; - - /** - * Message box buttons - */ - public enum BUTTONS { - /** Display only ok button */ - OK, - /** Display buttons ok and cancel */ - OK_CANCEL, - /** Display retry and cancel buttons */ - RETRY_CANCEL, - /** Display abort, retry and ignore buttons */ - ABORT_RETRY_IGNORE, - /** Display yes and no buttons */ - YES_NO - }; - - /** - * Message box icon - */ - public enum ICON { - /** Error icon */ - ERROR, - /** Information icon */ - INFORMATION, - /** Question icon */ - QUESTION, - /** Warning icon */ - WARNING, - /** Working icon */ - WORKING - }; - - /** - * @param parent The parent shell - * @param title The dialog title - * @param message The dialog message - * @param button The BUTTONS to be shown - * @param icon The ICON to be displayed - */ - public Dialog(Shell parent, String title, String message, BUTTONS button, ICON icon) { - this.initialize(parent, title, message, button, icon); - } - - private void initialize(Shell parent, String title, String message, BUTTONS button, ICON icon) { - int boxstyle = 0; - switch (icon) { - case ERROR: - boxstyle |= SWT.ICON_ERROR; - break; - case INFORMATION: - boxstyle |= SWT.ICON_INFORMATION; - break; - case QUESTION: - boxstyle |= SWT.ICON_QUESTION; - break; - case WARNING: - boxstyle |= SWT.ICON_WARNING; - break; - case WORKING: - boxstyle |= SWT.ICON_WORKING; - break; - } - - switch(button) { - case OK: - boxstyle |= SWT.OK; - break; - case OK_CANCEL: - boxstyle |= SWT.OK | SWT.CANCEL; - break; - case RETRY_CANCEL: - boxstyle |= SWT.RETRY | SWT.CANCEL; - break; - case ABORT_RETRY_IGNORE: - boxstyle |= SWT.RETRY | SWT.ABORT | SWT.IGNORE; - break; - case YES_NO: - boxstyle |= SWT.YES | SWT.NO; - } - - this.box = new MessageBox(parent, boxstyle); - this.box.setMessage(message); - this.box.setText(title); - } - - /** - * Open error dialog - * - * @return SWT.OK | SWT.IGNORE | SWT.ABORT | SWT.RETRY | SWT.CANCEL - */ - public int open() { - return this.box.open(); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/ErrorDialog.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/ErrorDialog.java deleted file mode 100644 index f5b5bf9b..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/ErrorDialog.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.controls; - -// Imports -import org.eclipse.swt.widgets.Shell; - -import at.asit.pdfover.commons.Messages; - -/** - * An error dialog - */ -public class ErrorDialog extends Dialog { - /** - * @param parent The parent shell - * @param message The error message - * @param button The buttons to be shown - */ - public ErrorDialog(Shell parent, String message, BUTTONS button) { - super(parent, Messages.getString("error.Title"), - message, button, ICON.ERROR); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/ErrorMarker.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/ErrorMarker.java deleted file mode 100644 index bd99b887..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/ErrorMarker.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.controls; - -// Imports -import java.io.InputStream; - -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; - -/** - * - */ -public class ErrorMarker extends Label { - - /** - * SLF4J Logger instance - **/ - @SuppressWarnings("unused") - private static final Logger log = LoggerFactory.getLogger(ErrorMarker.class); - - Image errorImg; - - /** - * Draw an error marker for a faulty entry - * @param parent the parent composite - * @param style the SWT style - * @param message a message describing the error (can be set later through setToolTipText) - */ - public ErrorMarker(Composite parent, int style, - String message) { - super(parent, style); - - InputStream stream = this.getClass().getResourceAsStream(Constants.RES_IMG_ERROR); - - this.errorImg = new Image(getDisplay(), new ImageData(stream)); - - this.addPaintListener(new PaintListener() { - final Rectangle imgSize = ErrorMarker.this.errorImg.getBounds(); - - @Override - public void paintControl(PaintEvent e) { - Rectangle dstSize = ErrorMarker.this.getBounds(); - e.gc.drawImage(ErrorMarker.this.errorImg, - 0, 0, this.imgSize.width, this.imgSize.height, - 0, 0, dstSize.width, dstSize.height); - } - }); - - setToolTipText(message); - } - - @Override - protected void checkSubclass() { - // Allow subclassing - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/InputDialog.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/InputDialog.java deleted file mode 100644 index 4845863f..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/InputDialog.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.controls; - -// Imports -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.Rectangle; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Button; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; - -import at.asit.pdfover.gui.utils.SWTUtils; - -/** - * - */ -public class InputDialog extends org.eclipse.swt.widgets.Dialog { - /** - * SLF4J Logger instance - **/ -// private static final Logger log = LoggerFactory -// .getLogger(InputDialog.class); - - private String prompt; - String input; - - /** - * SWT flags of the input box - */ - protected static int TEXT_FLAGS = SWT.BORDER; - - /** - * Create a password input dialog - * @param parent parent - * @param title title - * @param prompt prompt message - */ - public InputDialog(Shell parent, String title, String prompt) { - super(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); - setText(title); - setMessage(prompt); - } - - /** - * Get the prompt message - * @return the prompt message - */ - public String getPrompt() { - return this.prompt; - } - - /** - * set the prompt message - * @param message the prompt message - */ - public void setMessage(String message) { - this.prompt = message; - } - - /** - * Get the input - * @return the input - */ - public String getInput() { - return this.input; - } - - /** - * Get the input - * @param input the input - */ - public void setInput(String input) { - this.input = input; - } - - /** - * Open the dialog - * @return the input - */ - public String open() { - Shell parent = getParent(); - Shell shell = new Shell(parent, getStyle()); - shell.setText(getText()); - createContents(shell); - shell.pack(); - shell.open(); - Display display = parent.getDisplay(); - Rectangle bounds = parent.getBounds(); - Rectangle main = shell.getBounds(); - shell.setLocation( - bounds.x + (bounds.width - main.width) / 2, - bounds.y + (bounds.height - main.height) / 2); - while (!shell.isDisposed()) { - if (!display.readAndDispatch()) { - display.sleep(); - } - } - return getInput(); - } - - private void createContents(final Shell shell) { - GridLayout layout = new GridLayout(2, false); - layout.verticalSpacing = 10; - layout.marginLeft = 5; - layout.marginRight = 5; - layout.marginTop = 5; - shell.setLayout(layout); - Label label = new Label(shell, SWT.NONE); - label.setText(this.prompt); - GridData data = new GridData(); - data.horizontalSpan = 2; - label.setLayoutData(data); - final Text text = new Text(shell, TEXT_FLAGS); - data = new GridData(GridData.FILL_HORIZONTAL); - data.horizontalSpan = 2; - text.setLayoutData(data); - Button ok = new Button(shell, SWT.PUSH); - SWTUtils.setLocalizedText(ok, "common.Ok"); - data = new GridData(GridData.FILL_HORIZONTAL); - ok.setLayoutData(data); - ok.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent event) { - InputDialog.this.input = text.getText(); - shell.close(); - } - }); - Button cancel = new Button(shell, SWT.PUSH); - SWTUtils.setLocalizedText(cancel, "common.Cancel"); - data = new GridData(GridData.FILL_HORIZONTAL); - cancel.setLayoutData(data); - cancel.addSelectionListener(new SelectionAdapter() { - @Override - public void widgetSelected(SelectionEvent event) { - InputDialog.this.input = null; - shell.close(); - } - }); - shell.setDefaultButton(ok); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/MainBarButton.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/MainBarButton.java deleted file mode 100644 index 52bdf55c..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/MainBarButton.java +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.controls; - -// Imports -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.events.PaintListener; -import org.eclipse.swt.graphics.Color; -import org.eclipse.swt.graphics.Cursor; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Region; -import org.eclipse.swt.widgets.Canvas; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; - -import at.asit.pdfover.commons.Constants; - -/** - * Main Bar Button implementation - */ -public abstract class MainBarButton extends Canvas { - - /** - * If borders are drawn with a gradient effect this sets the size - */ - public static final int GradientFactor = 5; - - /** - * Number of pixel of the altitude of the triangle representing the arrow within the button shapes - * - * This should be a multiple of 2! - */ - public static final int SplitFactor = 10; - - /** - * the used text color - */ - protected Color textColor = null; - - /** - * the text size - */ - protected int textsize = Constants.TEXT_SIZE_BUTTON; - - private Color inactiveBackground = null; - private Color activeBackground1 = null; - private Color borderColor = null; - private Color activeBackground = null; - - private Color inactiveText = null; - - private String text = ""; - - private boolean active = true; - - private Image image = null; - - - /** - * @param parent - * @param style - */ - public MainBarButton(Composite parent, int style) { - super(parent, style); - this.addPaintListener(new PaintListener() { - - @Override - public void paintControl(PaintEvent e) { - MainBarButton.this.paintControl(e); - } - }); - - final Cursor hand = new Cursor(this.getDisplay(), SWT.CURSOR_HAND); - - this.addListener(SWT.Resize, new Listener() { - - @Override - public void handleEvent(Event event) { - MainBarButton.this.setRegion(MainBarButton.this - .getCustomRegion()); - MainBarButton.this.redraw(); - } - }); - - this.setCursor(hand); - - - this.inactiveBackground = Constants.MAINBAR_INACTIVE_BACK; - this.activeBackground1 = Constants.MAINBAR_ACTIVE_BACK_DARK; - this.activeBackground = Constants.MAINBAR_ACTIVE_BACK_LIGHT; - //this.textColor = this.getForeground(); - this.textColor = Constants.MAINBAR_ACTIVE_TEXTCOLOR; - //this.borderColor = new Color(getDisplay(), 0xf9, 0xf9, 0xf9); - this.borderColor = this.getBackground(); - this.inactiveText = Constants.MAINBAR_INACTIVE_TEXTCOLOR; - this.textsize = Constants.TEXT_SIZE_BUTTON; - - } - - /** - * @param inactiveBackground - * the inactiveBackground to set - */ - public void setInactiveBackground(Color inactiveBackground) { - this.inactiveBackground = inactiveBackground; - } - - /** - * @param activeBackground - * the activeBackground to set - */ - public void setActiveBackground(Color activeBackground) { - this.activeBackground = activeBackground; - } - - /** - * @return the textsize - */ - public int getTextsize() { - return this.textsize; - } - - /** - * @param textsize - * the textsize to set - */ - public void setTextsize(int textsize) { - this.textsize = textsize; - } - - /** - * @param textColor - * the textColor to set - */ - public void setTextColor(Color textColor) { - this.textColor = textColor; - } - - /** - * @return the borderColor - */ - public Color getBorderColor() { - return this.borderColor; - } - - /** - * @param borderColor - * the borderColor to set - */ - public void setBorderColor(Color borderColor) { - this.borderColor = borderColor; - } - - - /** - * Gets the image - * - * @return the image - */ - public Image getImage() { - return this.image; - } - - /** - * Sets the Image - * - * @param image - * the imgage to set - */ - public void setImage(Image image) { - this.image = image; - } - - /** - * Sets if this button is active - * - * @param active - * the active state - */ - public void setActive(boolean active) { - - this.active = active; - if (this.active) { - this.setBackground(this.activeBackground); - } else { - this.setBackground(this.inactiveBackground); - } - } - - /** - * Gets if this button is active - * - * @return the active state - */ - public boolean getActive() { - return this.active; - } - - /** - * Gets the button text - * - * @return the text - */ - public String getText() { - return this.text; - } - - /** - * Sets the text for the button - * - * @param text - * the text to set - */ - public void setText(String text) { - this.text = text; - } - - /** - * Paint 3D style borders - * - * @param e - */ - protected void paintBackground(PaintEvent e) { - Point size = this.getSize(); - int height = size.y - 4; - - int width = size.x; - - e.gc.setForeground(this.activeBackground1); - e.gc.setBackground(this.activeBackground); - - e.gc.fillGradientRectangle(0, height, width, -1 * height, true); - - //e.gc.setBackground(activeBackground); - - // LEFT - // e.gc.fillGradientRectangle(0, 0, factor, height, false); - - // RIGTH - // e.gc.fillGradientRectangle(width, 0, -1 * (width / factor), height, - // false); - - } - - /** - * Main painting method - * - * @param e - */ - void paintControl(PaintEvent e) { - Color forecurrent = e.gc.getForeground(); - Color backcurrent = e.gc.getBackground(); - - e.gc.setForeground(getBorderColor()); - if(this.getActive()) { - this.paintBackground(e); - } - - e.gc.setForeground(getBorderColor()); - - this.paintButton(e); - - e.gc.setForeground(forecurrent); - e.gc.setBackground(backcurrent); - - this.paintText(e); - } - - /** - * paint the inner button - * - * @param e - */ - protected void paintButton(PaintEvent e) { - // could be overwritten by subclasses - } - - /** - * Paint the text or image on the button - * - * @param e - */ - protected void paintText(PaintEvent e) { - Point size = this.getSize(); - int height = size.y; - - int width = size.x; - - // e.gc.fillGradientRectangle(0, 1, width, height / 4, true); - - if (this.image == null) { - Color current = e.gc.getForeground(); - - if(this.getActive() && this.isEnabled()) { - e.gc.setForeground(this.textColor); - } else { - e.gc.setForeground(this.inactiveText); - } - - String font_name = e.gc.getFont().getFontData()[0].getName(); - - Font font = new Font(this.getDisplay(), font_name, - this.getTextsize(), - e.gc.getFont().getFontData()[0].getStyle()); - - String text = this.getText(); - e.gc.setFont(font); - size = e.gc.stringExtent(text); - int texty = (height - size.y) / 2; - int textx = (width - size.x) / 2; - textx = this.changeTextPosition(textx); - e.gc.drawText(this.getText(), textx, texty, true); - font.dispose(); - - e.gc.setForeground(current); - } else { - - //log.debug("Width: " + width + " Height: " + height); - - int w = 0; - Image tmp = null; - if(this.image.getImageData().width < width) { - tmp = new Image(getDisplay(), this.image.getImageData()); - w = (width - this.image.getImageData().width) / 2; - } else if(this.image.getImageData().width > width) { - tmp = new Image(getDisplay(), this.image.getImageData().scaledTo(width, width)); - } else { - tmp = new Image(getDisplay(), this.image.getImageData()); - } - - e.gc.drawImage(tmp, w, w); - } - - } - - /** - * change the text position - * - * @param positionX - * the position - * @return the new position - */ - protected int changeTextPosition(int positionX) { - return positionX; - } - - /** - * Gets the region of the button - * - * @return the button region - */ - protected abstract Region getCustomRegion(); -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/MainBarEndButton.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/MainBarEndButton.java deleted file mode 100644 index 1e80aa36..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/MainBarEndButton.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.controls; - -// Imports -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Region; -import org.eclipse.swt.widgets.Composite; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * - */ -public class MainBarEndButton extends MainBarButton { - /** - * @param parent - * @param style - */ - public MainBarEndButton(Composite parent, int style) { - super(parent, style); - } - - /** - * SLF4J Logger instance - **/ - @SuppressWarnings("unused") - private static final Logger log = LoggerFactory.getLogger(MainBarEndButton.class); - - /* - * (non-Javadoc) - * - * @see - * at.asit.pdfover.gui.controls.MainBarButton#paintButton(org.eclipse.swt - * .events.PaintEvent) - */ - @Override - protected void paintButton(PaintEvent e) { - Point size = this.getSize(); - int height = size.y - 3; - - int split = 10; - int width = size.x - 1; - - e.gc.drawLine(0, 0, width, 0); - e.gc.drawLine(width, 0, width, height); - e.gc.drawLine(width, height, 0, height); - e.gc.drawLine(0, height, 0+split, (height) / 2); - e.gc.drawLine(0+split, (height) / 2, 0, 0); - - } - - /* - * (non-Javadoc) - * - * @see at.asit.pdfover.gui.controls.MainBarButton#getCustomRegion() - */ - @Override - protected Region getCustomRegion() { - Point size = this.getSize(); - - int height = size.y - 2; - - int split = SplitFactor; - - int width = size.x; - - Region reg = new Region(); - reg.add(new int[] { 0, 0, width, 0, width, height, 0, height, - 0 + split, (height) / 2, 0, 0 }); - return reg; - } - - /** - * change the text position - * @param positionX the position - * @return the new position - */ - @Override - protected int changeTextPosition(int positionX) { - return positionX + (SplitFactor / 2); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/MainBarMiddleButton.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/MainBarMiddleButton.java deleted file mode 100644 index 452f0a45..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/MainBarMiddleButton.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.controls; - -// Imports -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Region; -import org.eclipse.swt.widgets.Composite; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * - */ -public class MainBarMiddleButton extends MainBarButton { - /** - * @param parent - * @param style - */ - public MainBarMiddleButton(Composite parent, int style) { - super(parent, style); - } - - /** - * SLF4J Logger instance - **/ - @SuppressWarnings("unused") - private static final Logger log = LoggerFactory.getLogger(MainBarMiddleButton.class); - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.controls.MainBarButton#paintButton(org.eclipse.swt.events.PaintEvent) - */ - @Override - protected void paintButton(PaintEvent e) { - - Point size = this.getSize(); - - int height = size.y - 3; - - int split = SplitFactor; - int width = size.x - split; - - e.gc.drawLine(0, 0, width, 0); - e.gc.drawLine(width, 0, width+split, (height) / 2); - e.gc.drawLine(width+split, (height) / 2, width, height); - e.gc.drawLine(width, height, 0, height); - e.gc.drawLine(0, height, 0+split, (height) / 2); - e.gc.drawLine(0+split, (height) / 2, 0, 0); - - } - - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.controls.MainBarButton#getCustomRegion() - */ - @Override - protected Region getCustomRegion() { - Point size = this.getSize(); - - int height = size.y - 2; - - int split = SplitFactor; - - int width = size.x - split; - - Region reg = new Region(); - reg.add(new int[] { - 0, 0, - width, 0, - width + split, (height) / 2, - width, height, - 0, height, - 0+split, (height) / 2, - 0, 0 }); - - return reg; - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/MainBarRectangleButton.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/MainBarRectangleButton.java deleted file mode 100644 index 22a73b15..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/MainBarRectangleButton.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.controls; - -// Imports -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Region; -import org.eclipse.swt.widgets.Composite; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * - */ -public class MainBarRectangleButton extends MainBarButton { - - /** - * SLF4J Logger instance - **/ - @SuppressWarnings("unused") - private static final Logger log = LoggerFactory.getLogger(MainBarRectangleButton.class); - - private Image enabledImg = null; - private Image disabledImg = null; - - /** - * @param parent - * @param style - */ - public MainBarRectangleButton(Composite parent, int style) { - super(parent, style); - this.setActiveBackground(null); - this.setInactiveBackground(null); - } - - /** - * Set the image to display while this control is enabled - * @param enabledImg enabled image - */ - public void setEnabledImage(Image enabledImg) { - this.enabledImg = enabledImg; - if (getEnabled()) - setImage(enabledImg); - } - - /** - * Set the image to display while this control is disabled - * @param disabledImg disabled image - */ - public void setDisabledImage(Image disabledImg) { - this.disabledImg = disabledImg; - if (!getEnabled()) - setImage(disabledImg); - } - - /* - * (non-Javadoc) - * - * @see - * at.asit.pdfover.gui.controls.MainBarButton#paintButton(org.eclipse.swt - * .events.PaintEvent) - */ - @Override - protected void paintButton(PaintEvent e) { - - Point size = this.getSize(); - - int height = size.y - 3; - - int width = size.x; - - e.gc.drawLine(0, 0, width, 0); - e.gc.drawLine(width, 0, width, height); - e.gc.drawLine(width, height, 0, height); - e.gc.drawLine(0, height, 0, 0); - - } - - @Override - protected void paintBackground(PaintEvent e) { - Point size = this.getSize(); - int height = size.y - 2; - - int width = size.x; - - int factor = GradientFactor; - - Region left_reg = new Region(); - left_reg.add(new int[] { 0, 0, factor, factor, factor, height-factor, 0, height, 0, 0 }); - - Region right_reg = new Region(); - right_reg.add(new int[] { width, 0, - width - factor, factor, - width - factor, height-factor, width, height, width, 0 }); - - Region top_reg = new Region(); - top_reg.add(new int[] { - 0, 0, - factor, factor, - width - factor, factor, - width, 0, - 0, 0 }); - - Region bottom_reg = new Region(); - bottom_reg.add(new int[] { - 0, height, - factor, height-factor, - width - factor, height-factor, - width, height, 0, height }); - - e.gc.setClipping(top_reg); - - //TOP - e.gc.fillGradientRectangle(0, 0, width, factor, true); - - e.gc.setClipping(bottom_reg); - - //BOTTOM - e.gc.fillGradientRectangle(0, height, width, -1 * (factor), - true); - - e.gc.setClipping(left_reg); - - // LEFT - e.gc.fillGradientRectangle(0, 0, factor, height, false); - - - e.gc.setClipping(right_reg); - // RIGTH - e.gc.fillGradientRectangle(width, 0, -1 * factor, height, - false); - - e.gc.setClipping((Region)null); - } - - /* - * (non-Javadoc) - * - * @see at.asit.pdfover.gui.controls.MainBarButton#getCustomRegion() - */ - @Override - protected Region getCustomRegion() { - Point size = this.getSize(); - - int height = size.y - 2; - - int width = size.x; - - Region reg = new Region(); - reg.add(new int[] { 0, 0, width, 0, width, height, 0, height, 0, 0 }); - return reg; - } - - @Override - public void setEnabled(boolean enabled) { - setImage(enabled ? this.enabledImg : this.disabledImg); - super.setEnabled(enabled); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/MainBarStartButton.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/MainBarStartButton.java deleted file mode 100644 index ef03fdcb..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/MainBarStartButton.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.controls; - -// Imports -import org.eclipse.swt.events.PaintEvent; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.graphics.Region; -import org.eclipse.swt.widgets.Composite; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * - */ -public class MainBarStartButton extends MainBarButton { - /** - * @param parent - * @param style - */ - public MainBarStartButton(Composite parent, int style) { - super(parent, style); - } - - /** - * SLF4J Logger instance - **/ - @SuppressWarnings("unused") - private static final Logger log = LoggerFactory.getLogger(MainBarStartButton.class); - - @Override - protected void paintBackground(PaintEvent e) { - super.paintBackground(e); - /* - Point size = this.getSize(); - int height = size.y - 2; - - int split = SplitFactor; - int width = size.x - split; - - int factor = GradientFactor; - - Region left_reg = new Region(); - left_reg.add(new int[] { 0, 0, factor, factor, factor, height-factor, 0, height, 0, 0 }); - - Region right1_reg = new Region(); - right1_reg.add(new int[] { width, 0, - width - factor, factor, - width - factor, height-factor, width, height, width, 0 }); - - Region top_reg = new Region(); - top_reg.add(new int[] { - 0, 0, - factor, factor, - width - factor, factor, - width, 0, - 0, 0 }); - - Region bottom_reg = new Region(); - bottom_reg.add(new int[] { - 0, height, - factor, height-factor, - width - factor, height-factor, - width, height, 0, height }); - - e.gc.setClipping(top_reg); - - //TOP - e.gc.fillGradientRectangle(0, 0, width, factor, true); - - e.gc.setClipping(bottom_reg); - - //BOTTOM - e.gc.fillGradientRectangle(0, height, width, -1 * (factor), - true); - - e.gc.setClipping(left_reg); - - // LEFT - e.gc.fillGradientRectangle(0, 0, factor, height, false); - - - e.gc.setClipping(right1_reg); - // RIGTH - e.gc.fillGradientRectangle(width, 0, -1 * factor, height, - false); - - e.gc.setClipping((Region)null);*/ - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.controls.MainBarButton#paintButton(org.eclipse.swt.events.PaintEvent) - */ - @Override - protected void paintButton(PaintEvent e) { - - Point size = this.getSize(); - - int height = size.y - 3; - - int split = SplitFactor; - int width = size.x - split; - - e.gc.drawLine(0, 0, width, 0); - e.gc.drawLine(width, 0, width + split, (height) / 2); - e.gc.drawLine(width + split, (height) / 2, width, height); - e.gc.drawLine(width, height, 0, height); - e.gc.drawLine(0, height, 0, 0); - - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.controls.MainBarButton#getRegion() - */ - @Override - protected Region getCustomRegion() { - Point size = this.getSize(); - - int height = size.y - 2; - - int split = SplitFactor; - - int width = size.x - split; - - Region reg = new Region(); - reg.add(new int[] { 0, 0, width, 0, width + split, - (height) / 2, width, height, 0, height, 0, 0 }); - return reg; - } - - - /** - * change the text position - * @param positionX the position - * @return the new position - */ - @Override - protected int changeTextPosition(int positionX) { - return positionX - (SplitFactor / 2); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/PasswordInputDialog.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/PasswordInputDialog.java deleted file mode 100644 index 3a15c63a..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/controls/PasswordInputDialog.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.controls; - -// Imports -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Shell; - -/** - * - */ -public class PasswordInputDialog extends InputDialog { - - /** - * @param parent - * @param title - * @param prompt - */ - public PasswordInputDialog(Shell parent, String title, String prompt) { - super(parent, title, prompt); - PasswordInputDialog.TEXT_FLAGS = SWT.BORDER | SWT.PASSWORD; - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/ATrustConnectionException.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/ATrustConnectionException.java deleted file mode 100644 index 1b18c99c..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/ATrustConnectionException.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.exceptions; - -// Imports - -import at.asit.pdfover.commons.Messages; - -/** - * - */ -public class ATrustConnectionException extends Exception { - /** - * - */ - private static final long serialVersionUID = -5826910929587650685L; - - /** - * Constructor - * @param file - */ - public ATrustConnectionException() { - super(Messages.getString("error.ATrustConnection")); - } - - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/CantLoadKeystoreException.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/CantLoadKeystoreException.java deleted file mode 100644 index 6bb72ffa..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/CantLoadKeystoreException.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.exceptions; - -import at.asit.pdfover.commons.Messages; - -/** - * - */ -public class CantLoadKeystoreException extends ResumableException { - /** - * - */ - private static final long serialVersionUID = 7554121273052104624L; - - /** - * @param resumeIndex The resume Index - * @param cause The original exception - */ - public CantLoadKeystoreException(Throwable cause, int resumeIndex) { - super(Messages.getString("error.KeyStore"), cause, resumeIndex); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/InitializationException.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/InitializationException.java deleted file mode 100644 index 8f717391..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/InitializationException.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.exceptions; - -/** - * - */ -public class InitializationException extends PDFOverGUIException { - /** - * - */ - private static final long serialVersionUID = 433744698649684034L; - - /** - * @param msg - * @param cause - */ - public InitializationException(String msg, Throwable cause) { - super(msg, cause); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/InvalidEmblemFile.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/InvalidEmblemFile.java deleted file mode 100644 index 27295b1d..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/InvalidEmblemFile.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.exceptions; - -// Imports -import java.io.File; - -import at.asit.pdfover.commons.Messages; - -/** - * - */ -public class InvalidEmblemFile extends PDFOverGUIException { - /** - * - */ - private static final long serialVersionUID = -5826910929131650685L; - - /** - * Constructor - * @param file - */ - public InvalidEmblemFile(final File file) { - super(Messages.formatString("exception.InvalidEmblemFile", file.getAbsolutePath())); - } - - /** - * Constructor - * @param file - * @param reason - */ - public InvalidEmblemFile(final File file, Throwable reason) { - super(Messages.formatString("exception.InvalidEmblemFile", file.getAbsolutePath()), reason); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/InvalidPasswordException.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/InvalidPasswordException.java deleted file mode 100644 index 2067c0fc..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/InvalidPasswordException.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.exceptions; - -/** - * Base Class for Invalid password exceptions - */ -public abstract class InvalidPasswordException extends PDFOverGUIException { - - /** - * - */ - private static final long serialVersionUID = 6735754648793405145L; - - /** - * Invalid Password - * @param msg - */ - public InvalidPasswordException(String msg) { - super(msg); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/InvalidPortException.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/InvalidPortException.java deleted file mode 100644 index 96c09663..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/InvalidPortException.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.exceptions; - -import at.asit.pdfover.commons.Messages; - -/** - * - */ -public class InvalidPortException extends PDFOverGUIException { - /** - * - */ - private static final long serialVersionUID = -4809078091773253962L; - - - /** - * Constructor with an invalid port number - * @param port invalid port number - */ - public InvalidPortException(int port) { - super(Messages.formatString("exception.InvalidPort", Integer.toString(port), 1, 0xffff)); - } - - /** - * Constructor with an invalid port string - * @param source InvalidNumberFormat exception - * @param portString invalid port string - */ - public InvalidPortException(String portString, Throwable source) { - super(Messages.formatString("exception.InvalidPort", portString, 1, 0xffff), source); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/KeystoreAliasDoesntExistException.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/KeystoreAliasDoesntExistException.java deleted file mode 100644 index da1a2fe9..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/KeystoreAliasDoesntExistException.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.exceptions; - -import at.asit.pdfover.commons.Messages; - -/** - * - */ -public class KeystoreAliasDoesntExistException extends ResumableException { - /** - * - */ - private static final long serialVersionUID = 2264150118185552023L; - - /** - * @param alias The keystore key alias - * @param resumeIndex The resume Index - */ - public KeystoreAliasDoesntExistException(final String alias, int resumeIndex) { - super(Messages.formatString("error.KeyStoreAliasExist", alias), resumeIndex); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/KeystoreAliasNoKeyException.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/KeystoreAliasNoKeyException.java deleted file mode 100644 index 3b1d28cf..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/KeystoreAliasNoKeyException.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.exceptions; - -import at.asit.pdfover.commons.Messages; - -/** - * - */ -public class KeystoreAliasNoKeyException extends ResumableException { - /** - * - */ - private static final long serialVersionUID = -4030764219866181859L; - - /** - * @param alias The keystore key alias - * @param resumeIndex The resume Index - */ - public KeystoreAliasNoKeyException(final String alias, int resumeIndex) { - super(Messages.formatString("error.KeyStoreAliasNoKey", alias), resumeIndex); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/KeystoreDoesntExistException.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/KeystoreDoesntExistException.java deleted file mode 100644 index 9cd205d4..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/KeystoreDoesntExistException.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.exceptions; - -import java.io.File; - -import at.asit.pdfover.commons.Messages; - -/** - * - */ -public class KeystoreDoesntExistException extends ResumableException { - /** - * - */ - private static final long serialVersionUID = 8213496549933275086L; - - /** - * @param keystore The keystore file - * @param resumeIndex The resume Index - */ - public KeystoreDoesntExistException(final File keystore, int resumeIndex) { - super(Messages.formatString("error.KeyStoreFileNotExist", keystore.getPath()), resumeIndex); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/KeystoreKeyPasswordException.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/KeystoreKeyPasswordException.java deleted file mode 100644 index 907c5577..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/KeystoreKeyPasswordException.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.exceptions; - -import at.asit.pdfover.commons.Messages; - -/** - * - */ -public class KeystoreKeyPasswordException extends ResumableException { - /** - * - */ - private static final long serialVersionUID = 7734648200275150410L; - - /** - * @param resumeIndex The resume Index - */ - public KeystoreKeyPasswordException(int resumeIndex) { - super(Messages.getString("error.KeyStoreKeyPass"), resumeIndex); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/OutputfolderDoesntExistException.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/OutputfolderDoesntExistException.java deleted file mode 100644 index cddaec98..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/OutputfolderDoesntExistException.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.exceptions; - -import java.io.File; - -import at.asit.pdfover.commons.Messages; - -/** - * - */ -public class OutputfolderDoesntExistException extends ResumableException { - /** - * - */ - private static final long serialVersionUID = -1005495921021280599L; - - /** - * @param folder The file - * @param resumeIndex The resume Index - */ - public OutputfolderDoesntExistException(final File folder, int resumeIndex) { - super(Messages.formatString("exception.PathNotExist", folder.getAbsolutePath()), resumeIndex); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/OutputfolderNotADirectoryException.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/OutputfolderNotADirectoryException.java deleted file mode 100644 index 9355ff87..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/OutputfolderNotADirectoryException.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.exceptions; - -// Imports -import java.io.File; - - -import at.asit.pdfover.commons.Messages; - -/** - * - */ -public class OutputfolderNotADirectoryException extends PDFOverGUIException { - /** - * - */ - private static final long serialVersionUID = -3270628002264772405L; - - /** - * @param folder The file - */ - public OutputfolderNotADirectoryException(File folder) { - super(Messages.formatString("exception.PathNotDirectory", folder.getAbsolutePath())); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/PDFOverGUIException.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/PDFOverGUIException.java deleted file mode 100644 index bdfbe41d..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/PDFOverGUIException.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.exceptions; - -/** - * Base class for GUI Exceptions - */ -public class PDFOverGUIException extends Exception { - /** - * Serial Version UID - */ - private static final long serialVersionUID = -3942861617701033882L; - - /** - * Constructor - */ - public PDFOverGUIException() { - } - - /** - * Constructor - * @param msg Exception message - */ - public PDFOverGUIException(String msg) { - super(msg); - } - - /** - * Constructor - * @param cause Exception causing this one - */ - public PDFOverGUIException(Throwable cause) { - super(cause); - } - - /** - * Constructor - * @param msg Exception message - * @param cause Exception causing this one - */ - public PDFOverGUIException(String msg, Throwable cause) { - super(msg, cause); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/PasswordTooLongException.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/PasswordTooLongException.java deleted file mode 100644 index 6ea2b662..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/PasswordTooLongException.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.exceptions; - -import at.asit.pdfover.commons.Messages; - -// Imports - -/** - * - */ -public class PasswordTooLongException extends InvalidPasswordException { - - /** - * Constructor - */ - public PasswordTooLongException() { - super(Messages.getString("exception.PasswordTooLong")); - } - /** - * - */ - private static final long serialVersionUID = -3268343884240608304L; - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/PasswordTooShortException.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/PasswordTooShortException.java deleted file mode 100644 index ac1eafb0..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/PasswordTooShortException.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.exceptions; - -import at.asit.pdfover.commons.Messages; - -// Imports - -/** - * - */ -public class PasswordTooShortException extends InvalidPasswordException { - /** - * - */ - private static final long serialVersionUID = 3015765967751806169L; - - /** - * Constructor - */ - public PasswordTooShortException() { - super(Messages.getString("exception.PasswordTooShort")); - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/ResumableException.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/ResumableException.java deleted file mode 100644 index 7cec826f..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/exceptions/ResumableException.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.exceptions; - -/** - * - */ -public class ResumableException extends PDFOverGUIException { - - /** - * - */ - private static final long serialVersionUID = -607216270516492225L; - - private int resumeIndex = 0; - - /** - * Create a new resumable exception, thrown by a validator which can be ignored - * @param msg Error message - * @param resumeIndex Validator index to resume from - */ - public ResumableException(String msg, int resumeIndex) { - super(msg); - this.resumeIndex = resumeIndex; - } - - /** - * Create a new resumable exception, thrown by a validator which can be ignored - * @param msg Error message - * @param cause Exception causing this one - * @param resumeIndex Validator index to resume from - */ - public ResumableException(String msg, Throwable cause, int resumeIndex) { - super(msg, cause); - this.resumeIndex = resumeIndex; - } - - /** - * Return the validator index to resume from - * @return the resumeIndex - */ - public int getResumeIndex() { - return this.resumeIndex; - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/keystore/KeystoreUtils.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/keystore/KeystoreUtils.java deleted file mode 100644 index 8b7bb59c..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/keystore/KeystoreUtils.java +++ /dev/null @@ -1,28 +0,0 @@ -package at.asit.pdfover.gui.keystore; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.UnrecoverableKeyException; -import java.security.cert.CertificateException; - -public class KeystoreUtils { - public static KeyStore tryLoadKeystore(File location, String storeType, String storePass) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException { - KeyStore ks = KeyStore.getInstance(storeType); - FileInputStream fis = new FileInputStream(location); - try - { - ks.load(fis, storePass.toCharArray()); - } catch (IOException e) { - UnrecoverableKeyException keyCause = (UnrecoverableKeyException)e.getCause(); - if (keyCause != null) - throw keyCause; - else - throw e; - } - return ks; - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/osx/CocoaUIEnhancer.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/osx/CocoaUIEnhancer.java deleted file mode 100644 index 60e39aac..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/osx/CocoaUIEnhancer.java +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Copyright 2014 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ - -package at.asit.pdfover.gui.osx; - -import java.lang.reflect.Method; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.internal.C; -import org.eclipse.swt.internal.Callback; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Listener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.commons.Messages; - -/** - * Provide a hook to connecting the Preferences, About and Quit menu items of - * the Mac OS X Application menu when using the SWT Cocoa bindings. - * <p> - * This code does not require the Cocoa SWT JAR in order to be compiled as it - * uses reflection to access the Cocoa specific API methods. Use SWT Listeners - * instead in order to use this class in SWT only applications. - * - * </p> - * <p> - * This code was influenced by the <a - * href="http://www.transparentech.com/opensource/cocoauienhancer" - * >CocoaUIEnhancer - Connect the About, Preferences and Quit menus in Mac OS X - * Cocoa SWT and JFace applications</a>. - * </p> - * <p> - * This class works with both the 32-bit and 64-bit versions of the SWT Cocoa - * bindings. - * <p> - * <p> - * This class is released under the Eclipse Public License (<a - * href="http://www.eclipse.org/legal/epl-v10.html">EPL</a>). - */ -public class CocoaUIEnhancer { - static final Logger log = LoggerFactory.getLogger(CocoaUIEnhancer.class); - - private static final long kAboutMenuItem = 0; - private static final long kPreferencesMenuItem = 2; - // private static final long kServicesMenuItem = 4; - private static final long kHideApplicationMenuItem = 6; - private static final long kQuitMenuItem = 10; - - static long sel_toolbarButtonClicked_; - static long sel_preferencesMenuItemSelected_; - static long sel_aboutMenuItemSelected_; - static long sel_hideApplicationMenuItemSelected_; - - static Callback proc3Args; - - /** - * Class invoked via the Callback object to run the about and preferences - * actions. - */ - private static class MenuHookObject { - - final Listener about; - final Listener pref; - - public MenuHookObject(final Listener aboutListener, - final Listener preferencesListener) { - this.about = aboutListener; - this.pref = preferencesListener; - } - - /** - * Will be called on 32bit SWT. - * @param id - * @param sel - * @param arg0 - * @return x - */ - @SuppressWarnings("unused") - public int actionProc(final int id, final int sel, final int arg0) { - return (int) this.actionProc((long) id, (long) sel, (long) arg0); - } - - /** - * Will be called on 64bit SWT. - * @param id - * @param sel - * @param arg0 - * @return x - */ - public long actionProc(final long id, final long sel, final long arg0) { - if (sel == sel_aboutMenuItemSelected_) { - if (log.isDebugEnabled()) { - log.debug("[MenuHookObject - actionProc] : About"); - this.about.handleEvent(null); - } - } else if (sel == sel_preferencesMenuItemSelected_) { - if (log.isDebugEnabled()) { - log.debug("[MenuHookObject - actionProc] : Preferences"); - } - this.pref.handleEvent(null); - - } else { - if (log.isDebugEnabled()) { - log.debug("[MenuHookObject - actionProc] : Unknow selection!"); - } - } - // Return value is not used. - return 99; - } - - // Getters and setters - @SuppressWarnings("unused") - public Listener getAbout() { - return this.about; - } - - @SuppressWarnings("unused") - public Listener getPref() { - return this.pref; - } - } - - /** - * Hook the given Listener to the Mac OS X application Quit menu and the - * IActions to the About and Preferences menus. - * - * @param display - * The Display to use. - * @param quitListener - * The listener to invoke when the Quit menu is invoked. - * @param aboutListener - * The listener to invoke when the About menu is invoked. - * @param preferencesListener - * The listener to invoke when the Preferences menu is invoked. - */ - public static void hookApplicationMenu(final Display display, - final Listener quitListener, final Listener aboutListener, - final Listener preferencesListener) { - // This is our callbackObject whose 'actionProc' method will be called - // when the About or - // Preferences menuItem is invoked. - final MenuHookObject target = new MenuHookObject(aboutListener, - preferencesListener); - - try { - // Initialize the menuItems. - initialize(target); - } catch (final Exception e) { - throw new IllegalStateException(e); - } - - // Connect the quit/exit menu. - if (!display.isDisposed()) { - display.addListener(SWT.Close, quitListener); - } - - // Schedule disposal of callback object - display.disposeExec(() -> { - CocoaUIEnhancer.invoke(proc3Args, "dispose"); - }); - } - - private static void initialize(final Object callbackObject) throws Exception { - - final Class<?> osCls = classForName("org.eclipse.swt.internal.cocoa.OS"); - - // Register names in objective-c. - if (sel_toolbarButtonClicked_ == 0) { - // sel_toolbarButtonClicked_ = registerName( osCls, "toolbarButtonClicked:" ); - sel_preferencesMenuItemSelected_ = registerName(osCls, - "preferencesMenuItemSelected:"); - sel_aboutMenuItemSelected_ = registerName(osCls, - "aboutMenuItemSelected:"); - } - - // Create an SWT Callback object that will invoke the actionProc method - // of our internal - // callbackObject. - proc3Args = new Callback(callbackObject, "actionProc", 3); - final Method getAddress = Callback.class.getMethod("getAddress", - new Class[0]); - Object object = getAddress.invoke(proc3Args, (Object[]) null); - final long proc3 = convertToLong(object); - if (proc3 == 0) { - SWT.error(SWT.ERROR_NO_MORE_CALLBACKS); - } - - final Class<?> nsmenuCls = classForName("org.eclipse.swt.internal.cocoa.NSMenu"); - final Class<?> nsmenuitemCls = classForName("org.eclipse.swt.internal.cocoa.NSMenuItem"); - final Class<?> nsstringCls = classForName("org.eclipse.swt.internal.cocoa.NSString"); - final Class<?> nsapplicationCls = classForName("org.eclipse.swt.internal.cocoa.NSApplication"); - - // Instead of creating a new delegate class in objective-c, - // just use the current SWTApplicationDelegate. An instance of this - // is a field of the Cocoa Display object and is already the target - // for the menuItems. So just get this class and add the new methods - // to it. - object = invoke(osCls, "objc_lookUpClass", - new Object[] { "SWTApplicationDelegate" }); - final long cls = convertToLong(object); - - // Add the action callbacks for Preferences and About menu items. - invoke(osCls, "class_addMethod", new Object[] { wrapPointer(cls), - wrapPointer(sel_preferencesMenuItemSelected_), - wrapPointer(proc3), "@:@" }); - invoke(osCls, "class_addMethod", new Object[] { wrapPointer(cls), - wrapPointer(sel_aboutMenuItemSelected_), wrapPointer(proc3), - "@:@" }); - - // Get the Mac OS X Application menu. - final Object sharedApplication = invoke(nsapplicationCls, - "sharedApplication"); - final Object mainMenu = invoke(sharedApplication, "mainMenu"); - final Object mainMenuItem = invoke(nsmenuCls, mainMenu, "itemAtIndex", - new Object[] { wrapPointer(0) }); - final Object appMenu = invoke(mainMenuItem, "submenu"); - - // Create the About <application-name> menu command - final Object aboutMenuItem = invoke(nsmenuCls, appMenu, "itemAtIndex", - new Object[] { wrapPointer(kAboutMenuItem) }); - final Object nsStrAbout = invoke(nsstringCls, "stringWith", - new Object[] { Messages.formatString("main.about", Constants.APP_NAME) }); - invoke(nsmenuitemCls, aboutMenuItem, "setTitle", - new Object[] { nsStrAbout }); - // Rename the quit action. - final Object quitMenuItem = invoke(nsmenuCls, appMenu, - "itemAtIndex", new Object[] { wrapPointer(kQuitMenuItem) }); - final Object nsStrQuit = invoke(nsstringCls, "stringWith", - new Object[] { Messages.formatString("main.quit", Constants.APP_NAME) }); - invoke(nsmenuitemCls, quitMenuItem, "setTitle", - new Object[] { nsStrQuit }); - - // Rename the hide action. - final Object hideMenuItem = invoke(nsmenuCls, appMenu, - "itemAtIndex", - new Object[] { wrapPointer(kHideApplicationMenuItem) }); - final Object nsStrHide = invoke(nsstringCls, "stringWith", - new Object[] { Messages.formatString("main.hide", Constants.APP_NAME) }); - invoke(nsmenuitemCls, hideMenuItem, "setTitle", - new Object[] { nsStrHide }); - - // Enable the Preferences menuItem. - final Object prefMenuItem = invoke(nsmenuCls, appMenu, "itemAtIndex", - new Object[] { wrapPointer(kPreferencesMenuItem) }); - invoke(nsmenuitemCls, prefMenuItem, "setEnabled", new Object[] { true }); - - // Set the action to execute when the About or Preferences menuItem is - // invoked. - - // We don't need to set the target here as the current target is the - // SWTApplicationDelegate - // and we have registerd the new selectors on it. So just set the new - // action to invoke the - // selector. - invoke(nsmenuitemCls, prefMenuItem, "setAction", - new Object[] { wrapPointer(sel_preferencesMenuItemSelected_) }); - invoke(nsmenuitemCls, aboutMenuItem, "setAction", - new Object[] { wrapPointer(sel_aboutMenuItemSelected_) }); - } - - private static long registerName(final Class<?> osCls, final String name) - throws IllegalArgumentException, SecurityException { - final Object object = invoke(osCls, "sel_registerName", - new Object[] { name }); - return convertToLong(object); - } - - private static long convertToLong(final Object object) { - if (object instanceof Integer) { - final Integer i = (Integer) object; - return i.longValue(); - } - if (object instanceof Long) { - final Long l = (Long) object; - return l.longValue(); - } - return 0; - } - - private static Object wrapPointer(final long value) { - final Class<?> PTR_CLASS = C.PTR_SIZEOF == 8 ? long.class : int.class; - if (PTR_CLASS == long.class) { - return Long.valueOf(value); - } - return Integer.valueOf((int) value); - } - - private static Object invoke(final Class<?> clazz, final String methodName, - final Object[] args) { - return invoke(clazz, null, methodName, args); - } - - private static Object invoke(final Class<?> clazz, final Object target, - final String methodName, final Object[] args) { - try { - final Class<?>[] signature = new Class<?>[args.length]; - for (int i = 0; i < args.length; i++) { - final Class<?> thisClass = args[i].getClass(); - if (thisClass == Integer.class) { - signature[i] = int.class; - } else if (thisClass == Long.class) { - signature[i] = long.class; - } else if (thisClass == Byte.class) { - signature[i] = byte.class; - } else if (thisClass == Boolean.class) { - signature[i] = boolean.class; - } else { - signature[i] = thisClass; - } - } - final Method method = clazz.getMethod(methodName, signature); - return method.invoke(target, args); - } catch (final Exception e) { - throw new IllegalStateException(e); - } - } - - private static Class<?> classForName(final String classname) { - try { - final Class<?> cls = Class.forName(classname); - return cls; - } catch (final ClassNotFoundException e) { - throw new IllegalStateException(e); - } - } - - private static Object invoke(final Class<?> cls, final String methodName) { - return invoke(cls, methodName, (Class<?>[]) null, (Object[]) null); - } - - private static Object invoke(final Class<?> cls, final String methodName, - final Class<?>[] paramTypes, final Object... arguments) { - try { - final Method m = cls.getDeclaredMethod(methodName, paramTypes); - return m.invoke(null, arguments); - } catch (final Exception e) { - throw new IllegalStateException(e); - } - } - - static Object invoke(final Object obj, final String methodName) { - return invoke(obj, methodName, (Class<?>[]) null, (Object[]) null); - } - - private static Object invoke(final Object obj, final String methodName, - final Class<?>[] paramTypes, final Object... arguments) { - try { - final Method m = obj.getClass().getDeclaredMethod(methodName, - paramTypes); - return m.invoke(obj, arguments); - } catch (final Exception e) { - throw new IllegalStateException(e); - } - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/FileUploadSource.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/FileUploadSource.java deleted file mode 100644 index b0ff16ea..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/FileUploadSource.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.utils; - -// Imports -import java.io.IOException; -import java.io.InputStream; - -import org.apache.commons.httpclient.methods.multipart.PartSource; - -import at.asit.pdfover.signer.DocumentSource; - -/** - * - */ -public class FileUploadSource implements PartSource { - - private DocumentSource source; - - /** - * Constructor - * - * @param source - * the source - */ - public FileUploadSource(DocumentSource source) { - this.source = source; - } - - @Override - public long getLength() { - return this.source.getLength(); - } - - @Override - public String getFileName() { - return "sign.pdf"; - } - - @Override - public InputStream createInputStream() throws IOException { - return this.source.getInputStream(); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/LocaleSerializer.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/LocaleSerializer.java deleted file mode 100644 index 5d90ae6f..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/LocaleSerializer.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.utils; - -// Imports -import java.util.Locale; - -import javax.annotation.Nonnull; - -import at.asit.pdfover.commons.Constants; - -/** - * - */ -public class LocaleSerializer { - /** - * Parse a locale from a string - * @param localeString the string - * @return the locale - */ - public static Locale parseFromString(String localeString) { - - if(localeString == null || localeString.isEmpty()) { - return null; - } - - Locale targetLocale = null; - Locale[] locale = Locale.getAvailableLocales(); - for(int i = 0; i < locale.length; i++) { - if(locale[i].toString().equals(localeString)) { - targetLocale = locale[i]; - break; - } - } - return targetLocale; - } - - /** - * creates a parsable string for a locale - * @param locale the locale - * @return the parsable string - */ - public static @Nonnull String getParsableString(Locale locale) { - return Constants.ISNOTNULL(locale.toString()); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/SWTUtils.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/SWTUtils.java deleted file mode 100644 index 22e52467..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/SWTUtils.java +++ /dev/null @@ -1,235 +0,0 @@ -package at.asit.pdfover.gui.utils; - -import java.awt.Desktop; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.function.Consumer; - -import javax.annotation.Nullable; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.custom.ScrolledComposite; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.events.SelectionAdapter; -import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.events.SelectionListener; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.FontData; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.FormAttachment; -import org.eclipse.swt.layout.FormData; -import org.eclipse.swt.program.Program; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Event; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Messages; - -public final class SWTUtils { - - private static final Logger log = LoggerFactory.getLogger(SWTUtils.class); - - /* oh how i miss C++, and compile-time safety; this would be so much cleaner as a templated function */ - private static void genericSetText(Object swtObj, String text) { - try { - Method m = swtObj.getClass().getMethod("setText", String.class); - m.invoke(swtObj, text); - } catch (NoSuchMethodException | IllegalAccessException e) { - log.error("Attempted to setLocalizedText on object of type {}, which does not have an accessible setText method", swtObj.getClass().getSimpleName(), e); - } catch (InvocationTargetException e) { - log.error("Failed to setLocalizedText on object of type {}", swtObj.getClass().getSimpleName(), e); - } - - try { - // request re-layout if possible, changing the text content will change the bounding box - Method m = swtObj.getClass().getMethod("requestLayout"); - m.invoke(swtObj); - } catch (NoSuchMethodException | IllegalAccessException e) { - // do nothing, this may not exist on every control we use - } catch (InvocationTargetException e) { - log.error("Failed to re-layout {}", swtObj.getClass().getSimpleName(), e); - } - } - public static void setLocalizedText(Object o, String messageKey) { genericSetText(o, Messages.getString(messageKey)); } - public static void setLocalizedText(Object o, String formatMessageKey, Object... formatArgs) { genericSetText(o, Messages.formatString(formatMessageKey, formatArgs)); } - - private static void genericSetToolTipText(Object swtObj, String text) { - try { - Method m = swtObj.getClass().getMethod("setToolTipText", String.class); - m.invoke(swtObj, text); - } catch (NoSuchMethodException | IllegalAccessException e) { - log.error("Attempted to setLocalizedToolTipText on object of type {}, which does not have an accessible setToolTipText method", swtObj.getClass().getSimpleName(), e); - } catch (InvocationTargetException e) { - log.error("Failed to setLocalizedToolTipText on object of type {}", swtObj.getClass().getSimpleName(), e); - } - } - public static void setLocalizedToolTipText(Object o, String messageKey) { genericSetToolTipText(o, Messages.getString(messageKey));} - - public static void disableEventDefault(Control c, int event) { - c.addListener(event, (Event e) -> { e.doit = false; }); - } - - public static void scrollPassthrough(Control c) { - c.addListener(SWT.MouseVerticalWheel, (Event e) -> { - // disable default handling - e.doit = false; - - // find containing ScrolledComposite - Composite target = c.getParent(); - while ((target != null) && !(target instanceof ScrolledComposite)) - target = target.getParent(); - - if (target == null) - return; - - // scroll containing ScrolledComposite - ScrolledComposite sTarget = (ScrolledComposite)target; - Point origin = sTarget.getOrigin(); - origin.y -= (e.count * 10); - sTarget.setOrigin(origin); - }); - } - - public static void setFontHeight(Control c, int height) { - FontData[] fD = c.getFont().getFontData(); - fD[0].setHeight(height); - Font font = new Font(c.getDisplay(), fD[0]); - c.setFont(font); - } - - public static void setFontStyle(Control c, int style) { - FontData[] fD = c.getFont().getFontData(); - fD[0].setStyle(style); - Font font = new Font(c.getDisplay(), fD[0]); - c.setFont(font); - } - - public static class AnchorSetter { - private final Control c; - private final FormData fd; - private AnchorSetter(Control c, boolean isNew) - { - this.c = c; - if (isNew) { - this.fd = new FormData(); - this.c.setLayoutData(this.fd); - } else { - Object layoutData = this.c.getLayoutData(); - try { - this.fd = (FormData)layoutData; - } catch (ClassCastException e) { - log.error("Tried to reanchor() object with layout data of type {} (not FormData)", layoutData.getClass().getSimpleName(), e); - throw new RuntimeException("Invalid reanchor() use"); - } - } - } - - public AnchorSetter height(int h) { fd.height = h; return this; } - public AnchorSetter width(int w) { fd.width = w; return this; } - - public AnchorSetter top(FormAttachment a) { fd.top = a; return this; } - public AnchorSetter left(FormAttachment a) { fd.left = a; return this; } - public AnchorSetter right(FormAttachment a) { fd.right = a; return this; } - public AnchorSetter bottom(FormAttachment a) { fd.bottom = a; return this; } - - public AnchorSetter top(Control control, int offset, int alignment) { return top(new FormAttachment(control, offset, alignment)); } - public AnchorSetter top(Control control, int offset) { return top(new FormAttachment(control, offset)); } - public AnchorSetter top(Control control) { return top(new FormAttachment(control)); } - public AnchorSetter top(int num, int offset) { return top(new FormAttachment(num, offset)); } - public AnchorSetter top(int num) { return top(new FormAttachment(num)); } - - public AnchorSetter left(Control control, int offset, int alignment) { return left(new FormAttachment(control, offset, alignment)); } - public AnchorSetter left(Control control, int offset) { return left(new FormAttachment(control, offset)); } - public AnchorSetter left(Control control) { return left(new FormAttachment(control)); } - public AnchorSetter left(int num, int offset) { return left(new FormAttachment(num, offset)); } - public AnchorSetter left(int num) { return left(new FormAttachment(num)); } - - public AnchorSetter right(Control control, int offset, int alignment) { return right(new FormAttachment(control, offset, alignment)); } - public AnchorSetter right(Control control, int offset) { return right(new FormAttachment(control, offset)); } - public AnchorSetter right(Control control) { return right(new FormAttachment(control)); } - public AnchorSetter right(int num, int offset) { return right(new FormAttachment(num, offset)); } - public AnchorSetter right(int num) { return right(new FormAttachment(num)); } - - public AnchorSetter bottom(Control control, int offset, int alignment) { return bottom(new FormAttachment(control, offset, alignment)); } - public AnchorSetter bottom(Control control, int offset) { return bottom(new FormAttachment(control, offset)); } - public AnchorSetter bottom(Control control) { return bottom(new FormAttachment(control)); } - public AnchorSetter bottom(int num, int offset) { return bottom(new FormAttachment(num, offset)); } - public AnchorSetter bottom(int num) { return bottom(new FormAttachment(num)); } - } - public static AnchorSetter anchor(Control c) { return new AnchorSetter(c, true); } - public static AnchorSetter reanchor(Control c) { return new AnchorSetter(c, false); } - - /** - * functional-interface wrapper around swtObj.addSelectionListener - * @param swtObj SWT widget supporting addSelectionListener - * @param callback widgetSelected method - */ - public static void addSelectionListener(Object swtObj, Consumer<SelectionEvent> callback) { - try { - Method m = swtObj.getClass().getMethod("addSelectionListener", SelectionListener.class); - m.invoke(swtObj, new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { callback.accept(e); } }); - } catch (NoSuchMethodException | IllegalAccessException e) { - log.error("Attempted to pass object of type {} to addSelectionListener; object does not have an accessible addSelectionListener method", swtObj.getClass().getSimpleName(), e); - } catch (InvocationTargetException e) { - log.error("Failed to add selection listener on object of type {}", swtObj.getClass().getSimpleName(), e); - } - } - - /** - * @see SWTUtils#addSelectionListener(Object, Consumer) - */ - public static void addSelectionListener(Object swtObj, Runnable callback) { - addSelectionListener(swtObj, (e) -> { callback.run(); }); - } - - /** - * functional-interface wrapper around swtObj.addMouseListener - * @param swtObj SWT widget supporting addMouseListener - * @param callback mouseDown method - */ - public static void addMouseDownListener(Object swtObj, Consumer<MouseEvent> callback) { - try { - Method m = swtObj.getClass().getMethod("addMouseListener", MouseListener.class); - m.invoke(swtObj, new MouseAdapter() { @Override public void mouseDown (MouseEvent e) { callback.accept(e); } }); - } catch (NoSuchMethodException | IllegalAccessException e) { - log.error("Attempted to pass object of type {} to addMouseDownListener; object does not have an accessible addMouseListener method", swtObj.getClass().getSimpleName(), e); - } catch (InvocationTargetException e) { - log.error("Failed to add selection listeer on object of type {}", swtObj.getClass().getSimpleName(), e); - } - } - - /** - * @see SWTUtils#addMouseDownListener(Object, Consumer) - */ - public static void addMouseDownListener(Object swtObj, Runnable callback) { - addMouseDownListener(swtObj, (e) -> { callback.run(); }); - } - - public static void openURL(@Nullable URI uri) { - try { - if (uri == null) return; - if (Desktop.isDesktopSupported()) { - Desktop.getDesktop().browse(uri); - } else { - Program.launch(uri.toURL().toExternalForm()); - } - } catch (Exception e) { - log.warn("Failed to open URI: {}", uri, e); - } - } - - public static void openURL(@Nullable String uri) { - if (uri == null) return; - try { - openURL(new URI(uri)); - } catch (URISyntaxException e) { - log.warn("Failed to open URI: {}", uri, e); - } - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/UpdateCheckManager.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/UpdateCheckManager.java deleted file mode 100644 index 168f5b18..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/UpdateCheckManager.java +++ /dev/null @@ -1,110 +0,0 @@ -package at.asit.pdfover.gui.utils; - -import java.util.ArrayList; -import java.util.function.Consumer; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.bku.BKUHelper; -import at.asit.pdfover.gui.controls.Dialog; -import at.asit.pdfover.gui.controls.Dialog.BUTTONS; -import at.asit.pdfover.gui.controls.Dialog.ICON; - -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.methods.GetMethod; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Shell; - -public final class UpdateCheckManager { - private static final Logger log = LoggerFactory.getLogger(UpdateCheckManager.class); - private static Thread updateCheckThread = null; - private static boolean needsCheck = false; - - public enum Status { NOT_CHECKED, CHECKING, OUTDATED, UP_TO_DATE, FAILED }; - private static Status currentStatus = Status.NOT_CHECKED; - public static Status getCurrentStatus() { - synchronized (UpdateCheckManager.class) { - return currentStatus; - } - } - - private static ArrayList<Consumer<Status>> statusCallbacks = new ArrayList<>(); - public static void registerStatusCallback(Consumer<Status> f) { - synchronized (UpdateCheckManager.class) { - statusCallbacks.add(f); - f.accept(currentStatus); - } - } - - private static void setStatus(Status status) { - synchronized(UpdateCheckManager.class) { - currentStatus = status; - for (Consumer<Status> f : statusCallbacks) - f.accept(status); - } - } - - private static String latestVersionNotified = null; - private static Status runCheck(Shell shell) { - HttpClient client = (HttpClient) BKUHelper.getHttpClient(); - GetMethod method = new GetMethod(Constants.CURRENT_RELEASE_URL); - try { - client.executeMethod(method); - final String version = method.getResponseBodyAsString().trim(); - if (!VersionComparator.before(Constants.APP_VERSION, version)) - return Status.UP_TO_DATE; - - if ((latestVersionNotified == null) || VersionComparator.before(latestVersionNotified, version)) { - latestVersionNotified = version; - // invoke GUI message in main thread - shell.getDisplay().asyncExec(() -> { - Dialog info = new Dialog(shell, - Messages.getString("version_check.UpdateTitle"), - Messages.formatString("version_check.UpdateText", version), - BUTTONS.OK_CANCEL, ICON.INFORMATION); - - if (info.open() == SWT.OK) - SWTUtils.openURL(Constants.UPDATE_URL); - }); - } - - return Status.OUTDATED; - } catch (Exception e) { - log.error("Error downloading update information: ", e); - return Status.FAILED; - } - } - - public static void checkNow(Shell shell) { - if (Constants.APP_VERSION == null) - return; - - synchronized (UpdateCheckManager.class) { - if (updateCheckThread != null) - return; - - needsCheck = true; - updateCheckThread = new Thread(() -> { - synchronized(UpdateCheckManager.class) { - setStatus(Status.CHECKING); - } - while (true) { - Status status = runCheck(shell); - synchronized (UpdateCheckManager.class) { - if (!UpdateCheckManager.needsCheck) { - setStatus(status); - UpdateCheckManager.updateCheckThread = null; - return; - } - UpdateCheckManager.needsCheck = false; - setStatus(Status.CHECKING); - } - } - }); - updateCheckThread.start(); - } - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/VersionComparator.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/VersionComparator.java deleted file mode 100644 index 9d06dfb1..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/VersionComparator.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.utils; - -// Imports -import java.util.Comparator; - -/** - * - */ -public class VersionComparator implements Comparator<String> { - /* (non-Javadoc) - * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object) - */ - @Override - public int compare(String v1, String v2) { - String[] v1Parts = v1.split("\\.|-"); - String[] v2Parts = v2.split("\\.|-"); - - int length = Math.max(v1Parts.length, v2Parts.length); - for (int i = 0; i < length; ++i) { - int v1Part = 0; - try { - if (i < v1Parts.length) - v1Part = Integer.parseInt(v1Parts[i]); - } catch (NumberFormatException e) { - if (v1Parts[i].equals("SNAPSHOT")) - v1Part = Integer.MAX_VALUE; - } - - int v2Part = 0; - try { - if (i < v2Parts.length) - v2Part = Integer.parseInt(v2Parts[i]); - } catch (NumberFormatException e) { - if (v2Parts[i].equals("SNAPSHOT")) - v2Part = Integer.MAX_VALUE; - } - - if (v1Part < v2Part) - return -1; - if (v1Part > v2Part) - return 1; - } - return 0; - } - - /** - * Compare two version strings (static version) - * @param v1 version 1 - * @param v2 version 2 - * @return -1 if v1 < v2, 0 if v1 = v2, 1 if v1 > v2 - */ - public static int compare_s(String v1, String v2) { - VersionComparator vc = new VersionComparator(); - return vc.compare(v1, v2); - } - - /** - * Check two version strings for equality - * @param v1 version 1 - * @param v2 version 2 - * @return v1 == v2 - */ - public static boolean equals(String v1, String v2) { - return compare_s(v1, v2) == 0; - } - - /** - * Check two version strings for order - * @param v1 version 1 - * @param v2 version 2 - * @return v1 < v2 - */ - public static boolean before(String v1, String v2) { - return compare_s(v1, v2) < 0; - } - - /** - * Check two version strings for order - * @param v1 version 1 - * @param v2 version 2 - * @return v1 > v2 - */ - public static boolean after(String v1, String v2) { - return compare_s(v1, v2) > 0; - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/Zipper.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/Zipper.java deleted file mode 100644 index a25de58a..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/utils/Zipper.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.utils; - -// Imports -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URI; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; -import java.util.zip.ZipOutputStream; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Zipper/unzipper to backup/extract configuration - */ -public class Zipper { - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(Zipper.class); - - /** - * Compresses the source path to Zip File output stream - * @param sourcePath - * @param os - * @throws IOException - */ - public static void zip(String sourcePath, OutputStream os) throws IOException { - zip(sourcePath, os, false); - } - - /** - * Compresses the source path to Zip File output stream - * @param sourcePath - * @param os - * @param doDelete whether to delete content after compression - * @throws IOException - */ - public static void zip(String sourcePath, OutputStream os, boolean doDelete) throws IOException { - ZipOutputStream zos = new ZipOutputStream(os); - File dir = new File(sourcePath); - zip(dir, dir.toURI(), zos, doDelete); - zos.close(); - } - - private static void zip(File f, URI root, ZipOutputStream zos, boolean doDelete) throws IOException { - if (f.isDirectory()) { - File[] subDirs = f.listFiles(); - for (File subDir : subDirs) { - zip(subDir, root, zos, doDelete); - if (doDelete && !f.toURI().equals(root)) - subDir.delete(); - } - } else { - URI path = root.relativize(f.toURI()); - ZipEntry entry = new ZipEntry(path.toString()); - zos.putNextEntry(entry); - byte[] buffer = new byte[1024]; - int len; - BufferedInputStream is = new BufferedInputStream(new FileInputStream(f)); - while ((len = is.read(buffer)) >= 0) - zos.write(buffer, 0, len); - is.close(); - zos.closeEntry(); - if (doDelete) - f.delete(); - } - } - - /** - * Extracts Zip File input stream to target path - * @param is - * @param targetPath - * @throws IOException - */ - public static void unzip(InputStream is, String targetPath) throws IOException { - ZipInputStream zis = new ZipInputStream(is); - ZipEntry entry; - // while there are entries I process them - while ((entry = zis.getNextEntry()) != null) { - log.debug("entry: " + entry.getName() + ", " //// - + entry.getSize()); - // consume all the data from this entry - - if (entry.isDirectory()) { - log.debug("Extracting directory: " + entry.getName()); - - File nDir = new File(targetPath + File.separator + entry.getName()); - if(!nDir.exists()) { - if(!nDir.mkdir()) { - throw new IOException("Failed to create dir: " + entry.getName()); - } - } - continue; - } - byte[] buffer = new byte[1024]; - int len; - BufferedOutputStream out = new BufferedOutputStream( - new FileOutputStream(targetPath + File.separator + entry.getName())); - while ((len = zis.read(buffer)) >= 0) - out.write(buffer, 0, len); - - out.close(); - } - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StateMachine.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StateMachine.java deleted file mode 100644 index b5df6ff3..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StateMachine.java +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.workflow; - -//Imports -import java.lang.reflect.Constructor; - -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Shell; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.MainWindow; -import at.asit.pdfover.gui.composites.StateComposite; -import at.asit.pdfover.gui.controls.Dialog.BUTTONS; -import at.asit.pdfover.gui.controls.ErrorDialog; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.workflow.config.ConfigurationManager; -import at.asit.pdfover.gui.workflow.states.PrepareConfigurationState; -import at.asit.pdfover.gui.workflow.states.State; - -/** - * Workflow holds logical state of signing process and updates the current - * logical state - */ -public class StateMachine { - - private static final Logger log = LoggerFactory.getLogger(StateMachine.class); - - public final Status status; - public final ConfigurationManager configProvider; - public final String[] cmdLineArgs; - - /** - * Default constructor - * - * @param cmdLineArgs - */ - public StateMachine(String[] cmdLineArgs) { - this.status = new Status(); - this.status.setCurrentState(new PrepareConfigurationState(this)); - this.configProvider = new ConfigurationManager(); - this.cmdLineArgs = cmdLineArgs; - } - - /** - * Sets the workflow state - * This method should be used to let the user jump - * around between states. This Method also resets certain properties defined - * by later states then state - * - * @param state - */ - public void jumpToState(State state) { - this.status.setCurrentState(state); - this.invokeUpdate(); - } - - /** - * Update workflow logic and let state machine do its job... - */ - public synchronized void update() { - State next = null; - while (this.status.getCurrentState() != null) { - State current = this.status.getCurrentState(); - try { - current.run(); - } catch (Exception e) { - log.error("StateMachine update: ", e); - ErrorDialog errorState = new ErrorDialog(this.getMainShell(), - Messages.getString("error.Unexpected"), BUTTONS.OK); - //errorState.setException(e); - //jumpToState(errorState); - errorState.open(); - this.exit(); - } - - if (this.exit) { - // exit request ignore - next = null; - this.status.setCurrentState(next); - } else { - - if (this.mainWindow != null && !this.mainWindow.getShell().isDisposed()) { - log.debug("Allowing MainWindow to update its state for " + current); - current.updateMainWindowBehavior(); - this.mainWindow.applyBehavior(); - this.mainWindow.doLayout(); - } - - // TODO: i really want this to be a return value from run() - next = current.nextState(); - if (next == current) { - break; - } - - if (next == null) { - log.info("Next state is null -> exit"); - this.status.setCurrentState(next); - break; - } - - log.debug("Changing state from: " - + current + " to " - + next.toString()); - this.status.setCurrentState(next); - } - } - } - - /** - * Invoke Update in UI (Main) Thread - */ - public void invokeUpdate() { - if (this.display != null) { - this.display.asyncExec(() -> { - this.update(); - }); - } - } - - private Display display = null; - - private Shell shell = null; - - private Composite container = null; - - private MainWindow mainWindow = null; - - /* - * (non-Javadoc) - * - * @see - * at.asit.pdfover.gui.workflow.StateMachine#display(org.eclipse.swt.widgets - * .Composite) - */ - public void display(StateComposite composite) { - this.mainWindow.setTopControl(composite); - } - - private void createMainWindow() { - try { - - this.display = Display.getDefault(); - - this.mainWindow = new MainWindow(this); - this.mainWindow.open(); - - this.shell = this.mainWindow.getShell(); - - this.container = this.mainWindow.getContainer(); - - this.shell.open(); - this.shell.layout(); - } catch (Exception e) { - log.warn("Main-Window creation FAILED.", e); - this.display = null; - this.mainWindow = null; - this.shell = null; - this.container = null; - throw e; - } - } - - /** - * Gets the Shell for drawing the ui - * - * @return Composite - */ - public synchronized Composite getComposite() { - // Main window will be built on first call - // returns SWT Composite container for states to draw their GUI - - if (this.container == null) { - this.createMainWindow(); - } - - return this.container; - } - - public <T> T createComposite(Class<T> compositeClass, int style, State state) { - T composite = null; - try { - Constructor<T> constructor = compositeClass.getDeclaredConstructor( - Composite.class, int.class, State.class); - composite = constructor.newInstance(getComposite(), style, state); - } catch (Exception e) { - log.error("Could not create Composite for Class " - + compositeClass.getName(), e); - } - return composite; - } - - /** - * Only returns a shell if one was already created ... - * - * @return - */ - private Shell nonCreatingGetShell() { - return this.shell; - } - - private boolean exit = false; - - /** - * Exists the Workflow - */ - public void exit() { - this.exit = true; - if (this.shell != null) { - this.shell.dispose(); - } - } - - /** - * Only returns a shell if one was already created ... - * - * @return - */ - private Display nonCreatingGetDisplay() { - return this.display; - } - - /** - * Workflow main entrance point - */ - public void start() { - - // Call update to start processing ... - update(); - - // if a user interaction is required we have a shell ... - Shell shell = nonCreatingGetShell(); - Display display = nonCreatingGetDisplay(); - - if (this.status.getCurrentState() == null) { - if (shell != null) { - this.shell.dispose(); - } - } - - if (shell != null && display != null) { - while (!shell.isDisposed()) { - if (!display.readAndDispatch()) { - display.sleep(); - } - } - display.dispose(); - } - } - - - public synchronized Shell getMainShell() { - if(this.shell == null) { - this.createMainWindow(); - } - - return this.shell; - } - - public void reloadResources() { - this.mainWindow.reloadLocalization(); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/Status.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/Status.java deleted file mode 100644 index ba5e5fd5..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/Status.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.workflow; - -// Imports -import java.io.File; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.BKUs; -import at.asit.pdfover.gui.MainWindowBehavior; -import at.asit.pdfover.gui.workflow.states.State; -import at.asit.pdfover.signer.SignResult; -import at.asit.pdfover.signer.SignaturePosition; -import at.asit.pdfover.signer.pdfas.PdfAs4SigningState; - -public class Status { - private static final Logger log = LoggerFactory.getLogger(Status.class); - - public File document = null; - - public SignaturePosition signaturePosition = null; - - public BKUs bku = BKUs.NONE; - - private State currentState = null; - - private State previousState = null; - - public PdfAs4SigningState signingState = null; - - public SignResult signResult = null; - - public final MainWindowBehavior behavior; - - public boolean searchForPlacehoderSignature = false; - - public Status() { - this.behavior = new MainWindowBehavior(); - } - - public State getCurrentState() { - return this.currentState; - } - - public void setCurrentState(State newState) { - log.debug("Changing from " + currentState + " to " + newState); - - if ((previousState != null) && (previousState != currentState) && (previousState != newState)) - { - // Reference to previous state will be lost - perform cleanup - log.debug("Cleaning up " + previousState); - previousState.cleanUp(); - } - - this.previousState = currentState; - this.currentState = newState; - } - - public State getPreviousState() { - return this.previousState; - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/config/ConfigurationDataInMemory.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/config/ConfigurationDataInMemory.java deleted file mode 100644 index adf03913..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/config/ConfigurationDataInMemory.java +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.workflow.config; - -// Imports -import java.io.File; -import java.io.FileNotFoundException; -import java.util.Locale; -import java.util.Objects; - -import javax.annotation.CheckForNull; -import javax.annotation.Nonnull; - -import at.asit.pdfover.commons.Profile; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.widgets.Display; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.BKUs; -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.gui.bku.mobile.MobileBKUValidator; -import at.asit.pdfover.gui.exceptions.InvalidEmblemFile; -import at.asit.pdfover.gui.exceptions.InvalidPortException; - -import static at.asit.pdfover.commons.Constants.ISNOTNULL; - -/** - * Implementation of the configuration container - */ -public class ConfigurationDataInMemory { - /** - * SLF4J Logger instance - **/ - @SuppressWarnings("unused") - private static final Logger log = LoggerFactory.getLogger(ConfigurationDataInMemory.class); - - /** the emblem size (in mm) for logo only signatures */ - public double logoOnlyTargetSize = Constants.DEFAULT_LOGO_ONLY_SIZE; - - /** the emblem File */ - protected String emblemFile = null; - public String getEmblemPath() { return this.emblemFile; } - public void setEmblem(String emblemFile) throws InvalidEmblemFile { - if (emblemFile == null || emblemFile.trim().isEmpty()) { - // Ok to set no file ... - } else { - File imageFile = new File(emblemFile); - if (!imageFile.exists()) { - throw new InvalidEmblemFile(imageFile, - new FileNotFoundException(emblemFile)); - } - - try { - Image img = new Image(Display.getDefault(), new ImageData( - emblemFile)); - - img.dispose(); - } catch (Exception ex) { - throw new InvalidEmblemFile(imageFile, ex); - } - } - - this.emblemFile = emblemFile; - } - - /** The mobile phone number */ - protected @CheckForNull String mobileNumber = null; - public @CheckForNull String getMobileNumber() { return this.mobileNumber; } - public void setMobileNumber(String number) { - if(number == null || number.trim().isEmpty()) { - this.mobileNumber = null; - return; - } - this.mobileNumber = MobileBKUValidator.normalizeMobileNumber(number); - } - - /** The mobile phone password */ - public @CheckForNull String mobilePassword = null; - - public boolean rememberPassword = false; - - /** Holds the proxy host */ - public @CheckForNull String proxyHost = null; - - /** Holds the proxy port number */ - protected int proxyPort = -1; - public int getProxyPort() { return this.proxyPort; } - public void setProxyPort(int port) throws InvalidPortException { - if(port > 0 && port <= 0xFFFF) { - this.proxyPort = port; - return; - } - if(port == -1) { - this.proxyPort = -1; - return; - } - throw new InvalidPortException(port); - } - - /** Holds the proxy username */ - public @CheckForNull String proxyUser = null; - - /** Holds the proxy password */ - public @CheckForNull String proxyPass = null; - - /** Holds the default BKU to use */ - public @Nonnull BKUs defaultBKU = BKUs.NONE; - - /** Holds the output folder */ - public @CheckForNull String outputFolder = null; - - /** Holds the signatureNote */ - public @CheckForNull String signatureNote = null; - - /** Holds the locale */ - public @CheckForNull Locale interfaceLocale = null; - - /** Holds the signature locale */ - public @CheckForNull Locale signatureLocale = null; - - /** Holds the PDF/A compatibility setting */ - public boolean signaturePDFACompat = false; - - /** Holds the default signature position */ - public boolean autoPositionSignature = false; - - /** Keystore signing options */ - public enum KeyStorePassStorageType { MEMORY, DISK }; - public @CheckForNull Boolean keystoreEnabled = null; - public @CheckForNull String keystoreFile = null; - public @CheckForNull String keystoreType = null; - public @CheckForNull String keystoreAlias = null; - public @CheckForNull KeyStorePassStorageType keystorePassStorageType = null; - public @CheckForNull String keystoreStorePass = null; - public @CheckForNull String keystoreKeyPass = null; - - /** Whether to automatically check for updates */ - public boolean updateCheck = true; - - /** Holds the main window size - * - * @IMPORTANT this must always be valid and non-null, even if configuration failed to load for whatever reason (it is used by error handlers!) - */ - public @Nonnull Point mainWindowSize = new Point(Constants.DEFAULT_MAINWINDOW_WIDTH, Constants.DEFAULT_MAINWINDOW_HEIGHT); - - /** Whether to skip the output state */ - public boolean skipFinish = false; - - /** Whether to use an existing signature marker. */ - protected boolean useMarker = false; - public boolean getUseMarker() { return this.useMarker; } - public void setUseMarker(boolean useMarker) { - this.useMarker = useMarker; - if (useMarker) setUseSignatureFields(false); - } - - /** Either QR-Code or signature fields as marker */ - protected boolean useSignatureFields = false; - public boolean getUseSignatureFields() { return this.useSignatureFields; } - public void setUseSignatureFields(boolean useFields) { - this.useSignatureFields = useFields; - if (useFields) setUseMarker(false); - } - - /** describes if the placeholder search is enabled */ - public boolean enabledPlaceholderUsage = false; - - /** The Signature Profile */ - protected @CheckForNull Profile signatureProfile = null; - public @Nonnull Profile getSignatureProfile() { - return ISNOTNULL(Objects.requireNonNullElse(this.signatureProfile, Profile.SIGNATURBLOCK_SMALL)); - } - public void setSignatureProfile(Profile profile) { this.signatureProfile = profile; } - - public @Nonnull String saveFilePostFix = Constants.DEFAULT_POSTFIX; - - /** whether fido2 authentication should be selected by default */ - public boolean fido2ByDefault = false; - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/config/ConfigurationManager.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/config/ConfigurationManager.java deleted file mode 100644 index 39071667..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/config/ConfigurationManager.java +++ /dev/null @@ -1,919 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.workflow.config; - -// Imports -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.Locale; -import java.util.Properties; - -import javax.annotation.CheckForNull; -import javax.annotation.Nonnull; - -import at.asit.pdfover.commons.Profile; - -import org.apache.commons.io.FileUtils; -import org.eclipse.swt.graphics.Point; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.BKUs; -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.gui.exceptions.InvalidEmblemFile; -import at.asit.pdfover.gui.exceptions.InvalidPortException; -import at.asit.pdfover.gui.utils.LocaleSerializer; -import at.asit.pdfover.gui.workflow.config.ConfigurationDataInMemory.KeyStorePassStorageType; -import at.asit.pdfover.commons.Messages; - -import static at.asit.pdfover.commons.Constants.ISNOTNULL; - -/** - * Implementation of the configuration provider and manipulator - */ -public class ConfigurationManager { - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(ConfigurationManager.class); - - private String configurationFile = Constants.DEFAULT_CONFIG_FILENAME; - - private boolean loaded = false; - - // The persistent configuration read from the config file - private ConfigurationDataInMemory configuration; - - // The configuration overlay built from the cmd line args - private ConfigurationDataInMemory configurationOverlay; - - // whether the configuration screen should crash on startup (for debugging purposes) - public boolean crashOnConfig = false; - - /** - * Constructor - */ - public ConfigurationManager() { - this.configuration = new ConfigurationDataInMemory(); - this.configurationOverlay = new ConfigurationDataInMemory(); - } - - static public void factoryResetPersistentConfig() { - // tell logback to close all file handles - ((ch.qos.logback.classic.LoggerContext)LoggerFactory.getILoggerFactory()).stop(); - - File configDirectory = new File(Constants.CONFIG_DIRECTORY); - File backupDirectory = new File(Constants.CONFIG_BACKUP_DIRECTORY); - - // delete existing backup, if any - FileUtils.deleteQuietly(backupDirectory); - - // attempt 1: try to move the old config directory to a backup location - try { - FileUtils.moveDirectory( - configDirectory, - backupDirectory - ); - } catch (Exception e) { - System.out.println("Failed move config directory to backup location:"); - e.printStackTrace(); - - // attempt 2: try to simply force delete the config directory - try { - FileUtils.forceDelete(configDirectory); - } catch (Exception e2) { - System.out.println("Failed to delete config directory:"); - e2.printStackTrace(); - - // attempt 3: try to schedule the config directory for force deletion on JVM exit - try { - FileUtils.forceDeleteOnExit(configDirectory); - } catch (Exception e3) { - System.out.println("Failed to schedule config directory for deletion:"); - e3.printStackTrace(); - } - } - } - } - - /* load from disk */ - public void loadFromDisk() throws IOException { - if (loaded) - throw new RuntimeException("ConfigProvider double load?"); - - Properties diskConfig = new Properties(); - - diskConfig.load(new FileInputStream(Constants.CONFIG_DIRECTORY + File.separator + getConfigurationFileName())); - - { /* for testing of error handlers */ - String crashProperty = diskConfig.getProperty("CRASH"); - if ("startup".equalsIgnoreCase(crashProperty)) - throw new RuntimeException("A robot must obey the orders given it by human beings except where such orders would conflict with the First Law.\n(CRASH=startup is set.)"); - else if ("config".equalsIgnoreCase(crashProperty)) - this.crashOnConfig = true; - else if (crashProperty != null) - log.warn("Unknown value '{}' for CRASH property -- you want 'startup' or 'config'.", crashProperty); - } - - setDefaultEmblemPersistent(diskConfig.getProperty(Constants.CFG_EMBLEM)); - try { - String strProp = diskConfig.getProperty(Constants.CFG_LOGO_ONLY_SIZE); - if (strProp != null) - setLogoOnlyTargetSizePersistent(Double.parseDouble(strProp)); - } catch (NumberFormatException e) { log.info("Invalid value for CFG_LOGO_ONLY_SIZE ignored.", e); } - - setDefaultMobileNumberPersistent(diskConfig.getProperty(Constants.CFG_MOBILE_NUMBER)); - setRememberMobilePasswordPersistent(Constants.TRUE.equals(diskConfig.getProperty(Constants.CFG_MOBILE_PASSWORD_REMEMBER))); - - setProxyHostPersistent(diskConfig.getProperty(Constants.CFG_PROXY_HOST)); - setProxyUserPersistent(diskConfig.getProperty(Constants.CFG_PROXY_USER)); - setProxyPassPersistent(diskConfig.getProperty(Constants.CFG_PROXY_PASS)); - - setDefaultOutputFolderPersistent(diskConfig.getProperty(Constants.CFG_OUTPUT_FOLDER)); - - String postFix = diskConfig.getProperty(Constants.CFG_POSTFIX); - if (postFix == null) - setSaveFilePostFixPersistent(Constants.DEFAULT_POSTFIX); - else - setSaveFilePostFixPersistent(postFix); - - String localeString = diskConfig.getProperty(Constants.CFG_LOCALE); - - Locale targetLocale = LocaleSerializer.parseFromString(localeString); - if (targetLocale != null) - setInterfaceLocalePersistent(targetLocale); - - String signatureLocaleString = diskConfig.getProperty(Constants.CFG_SIGNATURE_LOCALE); - - Locale signatureTargetLocale = LocaleSerializer.parseFromString(signatureLocaleString); - if (signatureTargetLocale != null) - setSignatureLocalePersistent(signatureTargetLocale); - - String useMarker = diskConfig.getProperty(Constants.CFG_USE_MARKER); - if (useMarker != null) - setUseMarkerPersistent(useMarker.equalsIgnoreCase(Constants.TRUE)); - - String useSignatureFields = diskConfig.getProperty(Constants.CFG_USE_SIGNATURE_FIELDS); - if (useSignatureFields != null) - setUseSignatureFieldsPersistent(useSignatureFields.equalsIgnoreCase(Constants.TRUE)); - - String enablePlaceholder = diskConfig.getProperty(Constants.CFG_ENABLE_PLACEHOLDER); - if (enablePlaceholder != null) - setEnablePlaceholderUsagePersistent(enablePlaceholder.equalsIgnoreCase(Constants.TRUE)); - - String signatureProfileName = diskConfig.getProperty(Constants.SIGNATURE_PROFILE); - if (signatureProfileName != null) - setSignatureProfilePersistent(Profile.getProfile(signatureProfileName)); - - if (diskConfig.containsKey(Constants.CFG_SIGNATURE_NOTE)) - setSignatureNotePersistent(diskConfig.getProperty(Constants.CFG_SIGNATURE_NOTE)); - else - setSignatureNotePersistent(getSignatureProfile().getDefaultSignatureBlockNote(getSignatureLocale())); - - String compat = diskConfig.getProperty(Constants.CFG_SIGNATURE_PDFA_COMPAT); - if (compat != null) - setSignaturePdfACompatPersistent(compat.equalsIgnoreCase(Constants.TRUE)); - - String proxyPortString = diskConfig.getProperty(Constants.CFG_PROXY_PORT); - if (proxyPortString != null && !proxyPortString.trim().isEmpty()) - { - int port = Integer.parseInt(proxyPortString); - - if (port > 0 && port <= 0xFFFF) - setProxyPortPersistent(port); - else - log.warn("Proxy port is out of range!: " + port); - } - - // Set Default BKU - String bkuString = diskConfig.getProperty(Constants.CFG_BKU); - BKUs defaultBKU = BKUs.NONE; - if (bkuString != null) { - try { - defaultBKU = BKUs.valueOf(bkuString); - } catch (IllegalArgumentException ex) { - log.error("Invalid BKU config value " + bkuString + " using none!"); - defaultBKU = BKUs.NONE; - } catch (NullPointerException ex) { - log.error("Invalid BKU config value " + bkuString + " using none!"); - defaultBKU = BKUs.NONE; - } - } - setDefaultBKUPersistent(defaultBKU); - - // Set MainWindow size - int width = Constants.DEFAULT_MAINWINDOW_WIDTH; - int height = Constants.DEFAULT_MAINWINDOW_HEIGHT; - String size = diskConfig.getProperty(Constants.CFG_MAINWINDOW_SIZE); - parse: { - if (size == null) - break parse; - int pos = size.indexOf(','); - if (pos <= 0) - break parse; - - try { - width = Integer.parseInt(size.substring(0, pos).trim()); - height = Integer.parseInt(size.substring(pos + 1).trim()); - } catch (NumberFormatException e) { - log.debug("Couldn't parse main window size", e); - // ignore parsing exception - } - } - this.configuration.mainWindowSize = new Point(width, height); - - // Set Signature Position - String signaturePositionStr = diskConfig.getProperty(Constants.CFG_SIGNATURE_POSITION); - setAutoPositionSignaturePersistent(signaturePositionStr != null && signaturePositionStr.trim().equals("auto")); - - //Set keystore stuff - String keystoreEnabled = diskConfig.getProperty(Constants.CFG_KEYSTORE_ENABLED); - if (keystoreEnabled != null) - setKeyStoreEnabledPersistent(keystoreEnabled.equalsIgnoreCase(Constants.TRUE)); - setKeyStoreFilePersistent(diskConfig.getProperty(Constants.CFG_KEYSTORE_FILE)); - setKeyStoreTypePersistent(diskConfig.getProperty(Constants.CFG_KEYSTORE_TYPE)); - setKeyStoreAliasPersistent(diskConfig.getProperty(Constants.CFG_KEYSTORE_ALIAS)); - setKeyStoreStorePassPersistent(diskConfig.getProperty(Constants.CFG_KEYSTORE_STOREPASS)); - setKeyStoreKeyPassPersistent(diskConfig.getProperty(Constants.CFG_KEYSTORE_KEYPASS)); - String storeTypeOnDisk = diskConfig.getProperty(Constants.CFG_KEYSTORE_PASSSTORETYPE); - if (storeTypeOnDisk == null) /* auto-detect based on old config */ - { - String oldKeyPass = getKeyStoreKeyPassPersistent(); - String oldStorePass = getKeyStoreStorePassPersistent(); - if ((oldKeyPass != null && !oldKeyPass.trim().isEmpty()) || (oldStorePass != null && !oldStorePass.trim().isEmpty())) /* previously stored password exists */ - storeTypeOnDisk = "disk"; - else - storeTypeOnDisk = "memory"; - } - if ("disk".equals(storeTypeOnDisk)) - setKeyStorePassStorageTypePersistent(KeyStorePassStorageType.DISK); - else if ("memory".equals(storeTypeOnDisk)) - setKeyStorePassStorageTypePersistent(KeyStorePassStorageType.MEMORY); - else - setKeyStorePassStorageTypePersistent(null); - - // Set update check - String updateCheck = diskConfig.getProperty(Constants.CFG_UPDATE_CHECK); - if (updateCheck != null) - setUpdateCheckPersistent(!updateCheck.equalsIgnoreCase(Constants.FALSE)); - - setFido2ByDefaultPersistent(Constants.TRUE.equalsIgnoreCase(diskConfig.getProperty(Constants.CFG_FIDO2_BY_DEFAULT))); - - log.info("Successfully loaded config from: " + getConfigurationFileName()); - loaded = true; - } - - private void setProperty(@Nonnull Properties props, @Nonnull String key, @Nonnull String value) { props.setProperty(key, value); } - private void setPropertyIfNotNull(@Nonnull Properties props, @Nonnull String key, @CheckForNull String value) { if (value != null) setProperty(props, key, value); } - private void setPropertyIfNotBlank(@Nonnull Properties props, @Nonnull String key, @Nonnull String value) { if (!value.isEmpty()) setProperty(props, key, value); } - /* save to file */ - public void saveToDisk() throws IOException { - String filename = this.getConfigurationFileName(); - File configFile = new File(Constants.CONFIG_DIRECTORY + File.separator + filename); - - Properties props = new Properties(); - props.clear(); - - setProperty(props, Constants.CFG_BKU, ISNOTNULL(getDefaultBKUPersistent().name())); - - setPropertyIfNotNull(props, Constants.CFG_PROXY_HOST, getProxyHostPersistent()); - int proxyPort = getProxyPortPersistent(); - if (proxyPort != -1) - setProperty(props, Constants.CFG_PROXY_PORT, ISNOTNULL(Integer.toString(proxyPort))); - setPropertyIfNotNull(props, Constants.CFG_PROXY_USER, getProxyUserPersistent()); - setPropertyIfNotNull(props, Constants.CFG_PROXY_PASS, getProxyPassPersistent()); - - setPropertyIfNotNull(props, Constants.CFG_EMBLEM, getDefaultEmblemPersistent()); - setProperty(props, Constants.CFG_LOGO_ONLY_SIZE, ISNOTNULL(Double.toString(getLogoOnlyTargetSize()))); - - setPropertyIfNotNull(props, Constants.CFG_SIGNATURE_NOTE, getSignatureNote()); - setPropertyIfNotNull(props, Constants.CFG_MOBILE_NUMBER, getDefaultMobileNumberPersistent()); - if (getRememberMobilePassword()) - setProperty(props, Constants.CFG_MOBILE_PASSWORD_REMEMBER, Constants.TRUE); - setPropertyIfNotNull(props, Constants.CFG_OUTPUT_FOLDER, getDefaultOutputFolderPersistent()); - setProperty(props, Constants.CFG_POSTFIX, getSaveFilePostFix()); - - Point size = this.configuration.mainWindowSize; - setProperty(props, Constants.CFG_MAINWINDOW_SIZE, size.x + "," + size.y); - - Locale configLocale = getInterfaceLocale(); - if(configLocale != null) { - setProperty(props, Constants.CFG_LOCALE, LocaleSerializer.getParsableString(configLocale)); - } - - Locale signatureLocale = this.getSignatureLocale(); - if(signatureLocale != null) { - setProperty(props, Constants.CFG_SIGNATURE_LOCALE, LocaleSerializer.getParsableString(signatureLocale)); - } - - if (getUseMarker()) - setProperty(props, Constants.CFG_USE_MARKER, Constants.TRUE); - - if (getUseSignatureFields()) { - setProperty(props, Constants.CFG_USE_SIGNATURE_FIELDS, Constants.TRUE); - } - - if (getEnablePlaceholderUsage()) { - setProperty(props, Constants.CFG_ENABLE_PLACEHOLDER, Constants.TRUE); - } - - if (getSignaturePdfACompat()) - setProperty(props, Constants.CFG_SIGNATURE_PDFA_COMPAT, Constants.TRUE); - - if (!getAutoPositionSignaturePersistent()) - setProperty(props, Constants.CFG_SIGNATURE_POSITION, ""); - else - setProperty(props, Constants.CFG_SIGNATURE_POSITION, "auto"); - - if (Constants.THEME != Constants.Themes.DEFAULT) - setProperty(props, Constants.CFG_THEME, ISNOTNULL(Constants.THEME.name())); - - if (getKeyStoreEnabledPersistent()) - setProperty(props, Constants.CFG_KEYSTORE_ENABLED, Constants.TRUE); - setPropertyIfNotBlank(props, Constants.CFG_KEYSTORE_FILE, getKeyStoreFilePersistent()); - setPropertyIfNotBlank(props, Constants.CFG_KEYSTORE_TYPE, getKeyStoreTypePersistent()); - setPropertyIfNotBlank(props, Constants.CFG_KEYSTORE_ALIAS, getKeyStoreAliasPersistent()); - - KeyStorePassStorageType keystorePassStorageType = getKeyStorePassStorageType(); - if (keystorePassStorageType == null) - setProperty(props, Constants.CFG_KEYSTORE_PASSSTORETYPE, "none"); - else if (keystorePassStorageType == KeyStorePassStorageType.MEMORY) - setProperty(props, Constants.CFG_KEYSTORE_PASSSTORETYPE, "memory"); - else if (keystorePassStorageType == KeyStorePassStorageType.DISK) - setProperty(props, Constants.CFG_KEYSTORE_PASSSTORETYPE, "disk"); - - if (keystorePassStorageType == KeyStorePassStorageType.DISK) - { - String keystoreStorePass = getKeyStoreStorePassPersistent(); - if (keystoreStorePass == null) - keystoreStorePass = ""; - setProperty(props, Constants.CFG_KEYSTORE_STOREPASS, keystoreStorePass); - String keystoreKeyPass = getKeyStoreKeyPassPersistent(); - if (keystoreKeyPass == null) - keystoreKeyPass = ""; - setProperty(props, Constants.CFG_KEYSTORE_KEYPASS, keystoreKeyPass); - } - - if (!getUpdateCheck()) - setProperty(props, Constants.CFG_UPDATE_CHECK, Constants.FALSE); - - if (getFido2ByDefault()) - setProperty(props, Constants.CFG_FIDO2_BY_DEFAULT, Constants.TRUE); - - setProperty(props, Constants.SIGNATURE_PROFILE, ISNOTNULL(getSignatureProfile().name())); - - - FileOutputStream outputstream = new FileOutputStream(configFile, false); - - props.store(outputstream, "Configuration file was generated!"); - - log.info("Configuration file saved to " + configFile.getAbsolutePath()); - } - - static private <T> T fallThroughOnNull(T one, T two) { return (one != null) ? one : two; } - - public void setConfigurationFileName(String configurationFile) - { - if (this.configurationFile.equals(configurationFile)) - return; - if (this.loaded) - throw new RuntimeException("Cannot change configuration file path after it has been loaded"); - this.configurationFile = configurationFile; - } - public String getConfigurationFileName() { return this.configurationFile; } - - public void setDefaultBKUPersistent(@Nonnull BKUs bku) { - this.configuration.defaultBKU = bku; - } - - public void setDefaultBKUOverlay(@Nonnull BKUs bku) { - this.configurationOverlay.defaultBKU = bku; - } - - public @Nonnull BKUs getDefaultBKU() { - BKUs bku = this.configurationOverlay.defaultBKU; - if (bku == BKUs.NONE) - bku = getDefaultBKUPersistent(); - return bku; - } - - public @Nonnull BKUs getDefaultBKUPersistent() { - return this.configuration.defaultBKU; - } - - public void setAutoPositionSignaturePersistent(boolean state) { - this.configuration.autoPositionSignature = state; - } - - public void setAutoPositionSignatureOverlay() { - this.configurationOverlay.autoPositionSignature = true; - } - - public boolean getAutoPositionSignature() { - return this.configurationOverlay.autoPositionSignature || getAutoPositionSignaturePersistent(); - } - - public boolean getAutoPositionSignaturePersistent() { - return this.configuration.autoPositionSignature; - } - - public void setDefaultMobileNumberPersistent(String number) { - if (number == null || number.trim().isEmpty()) { - this.configuration.setMobileNumber(null); - } else { - this.configuration.setMobileNumber(number); - } - } - - public void setDefaultMobileNumberOverlay(String number) { - if (number == null || number.trim().isEmpty()) { - this.configurationOverlay.setMobileNumber(null); - } else { - this.configurationOverlay.setMobileNumber(number); - } - } - - public @CheckForNull String getDefaultMobileNumber() { - return fallThroughOnNull(this.configurationOverlay.getMobileNumber(), getDefaultMobileNumberPersistent()); - } - - public @CheckForNull String getDefaultMobileNumberPersistent() { - return this.configuration.getMobileNumber(); - } - - public void setDefaultMobilePasswordOverlay(String password) { - if (password == null || password.trim().isEmpty()) { - this.configurationOverlay.mobilePassword = null; - } else { - this.configurationOverlay.mobilePassword = password; - } - } - - public @CheckForNull String getDefaultMobilePassword() { - /* this does not exist as a permanent config variable */ - return this.configurationOverlay.mobilePassword; - } - - public boolean getRememberMobilePassword() { - return this.configuration.rememberPassword; - } - - public void setRememberMobilePasswordPersistent(boolean state) { - this.configuration.rememberPassword = state; - } - - public void setDefaultEmblemPersistent(String emblem) { - try { - if (emblem == null || emblem.trim().isEmpty()) { - this.configuration.setEmblem(null); - } else { - this.configuration.setEmblem(emblem); - } - } catch (InvalidEmblemFile e) { - log.error("Error setting emblem file", e); - try { - this.configuration.setEmblem(null); - } catch (InvalidEmblemFile e1) { - // Ignore - } - } - } - - public void setDefaultEmblemOverlay(String emblem) { - try { - if (emblem == null || emblem.trim().isEmpty()) { - this.configurationOverlay.setEmblem(null); - } else { - this.configurationOverlay.setEmblem(emblem); - } - } catch (InvalidEmblemFile e) { - log.error("Error setting emblem file", e); - try { - this.configurationOverlay.setEmblem(null); - } catch (InvalidEmblemFile e1) { - // Ignore - } - } - } - - public @CheckForNull String getDefaultEmblemPath() { - return fallThroughOnNull(this.configurationOverlay.getEmblemPath(), getDefaultEmblemPersistent()); - } - - public @CheckForNull String getDefaultEmblemPersistent() { - return this.configuration.getEmblemPath(); - } - - public void setLogoOnlyTargetSizePersistent(double v) { - this.configuration.logoOnlyTargetSize = v; - } - - public double getLogoOnlyTargetSize() { - return this.configuration.logoOnlyTargetSize; - } - - public void setProxyHostPersistent(String host) { - if (host == null || host.trim().isEmpty()) { - this.configuration.proxyHost = null; - } else { - this.configuration.proxyHost = host; - } - } - - public void setProxyHostOverlay(String host) { - if (host == null || host.trim().isEmpty()) { - this.configurationOverlay.proxyHost = null; - } else { - this.configurationOverlay.proxyHost = host; - } - } - - public @CheckForNull String getProxyHost() { - return fallThroughOnNull(this.configurationOverlay.proxyHost, getProxyHostPersistent()); - } - - public @CheckForNull String getProxyHostPersistent() { - return this.configuration.proxyHost; - } - - public void setProxyPortPersistent(int port) { - try { - this.configuration.setProxyPort(port); - } catch (InvalidPortException e) { - log.error("Error setting proxy port" , e); - // ignore - } - } - - public void setProxyPortOverlay(int port) { - try { - this.configurationOverlay.setProxyPort(port); - } catch (InvalidPortException e) { - log.error("Error setting proxy port" , e); - // ignore - } - } - - public int getProxyPort() { - int port = this.configurationOverlay.getProxyPort(); - if (port == -1) // TODO -1 is a terrible, no good, very bad hack - port = getProxyPortPersistent(); - return port; - } - - public int getProxyPortPersistent() { - return this.configuration.getProxyPort(); - } - - public void setProxyUserPersistent(String user) { - if (user == null || user.trim().isEmpty()) { - this.configuration.proxyUser = null; - } else { - this.configuration.proxyUser = user; - } - } - - public void setProxyUserOverlay(String user) { - if (user == null || user.trim().isEmpty()) { - this.configurationOverlay.proxyUser = null; - } else { - this.configurationOverlay.proxyUser = user; - } - } - - public @CheckForNull String getProxyUser() { - return fallThroughOnNull(this.configurationOverlay.proxyUser, getProxyUserPersistent()); - } - - public @CheckForNull String getProxyUserPersistent() { - return this.configuration.proxyUser; - } - - public void setProxyPassPersistent(String pass) { - if (pass == null || pass.trim().isEmpty()) { - this.configuration.proxyPass = null; - } else { - this.configuration.proxyPass = pass; - } - } - - public void setProxyPassOverlay(String pass) { - if (pass == null || pass.trim().isEmpty()) { - this.configurationOverlay.proxyPass = null; - } else { - this.configurationOverlay.proxyPass = pass; - } - } - - public @CheckForNull String getProxyPass() { - return fallThroughOnNull(this.configurationOverlay.proxyPass, getProxyPassPersistent()); - } - - public @CheckForNull String getProxyPassPersistent() { - return this.configuration.proxyPass; - } - - public void setDefaultOutputFolderPersistent(String outputFolder) { - if (outputFolder == null || outputFolder.trim().isEmpty()) { - this.configuration.outputFolder = null; - } else { - this.configuration.outputFolder = outputFolder; - } - } - - public void setDefaultOutputFolderOverlay(String outputFolder) { - if (outputFolder == null || outputFolder.trim().isEmpty()) { - this.configurationOverlay.outputFolder = null; - } else { - this.configurationOverlay.outputFolder = outputFolder; - } - } - - public @CheckForNull String getDefaultOutputFolder() { - return fallThroughOnNull(this.configurationOverlay.outputFolder, getDefaultOutputFolderPersistent()); - } - - public @CheckForNull String getDefaultOutputFolderPersistent() { - return this.configuration.outputFolder; - } - - public void setSignatureNotePersistent(String note) { - if (note == null || note.trim().isEmpty()) { - this.configuration.signatureNote = null; - } else { - this.configuration.signatureNote = note; - } - } - - public @CheckForNull String getSignatureNote() { - return this.configuration.signatureNote; - } - - public void setInterfaceLocalePersistent(Locale locale) { - if(locale == null) { - this.configuration.interfaceLocale = Messages.getDefaultLocale(); - } else { - this.configuration.interfaceLocale = locale; - Locale.setDefault(locale); - Messages.setLocale(locale); - } - } - - public @Nonnull Locale getInterfaceLocale() { - Locale locale = this.configuration.interfaceLocale; - if (locale == null) - locale = Messages.getDefaultLocale(); - return locale; - } - - public void setSignatureLocalePersistent(Locale locale) { - if(locale == null) { - this.configuration.signatureLocale = Messages.getDefaultLocale(); - } else { - this.configuration.signatureLocale = locale; - } - } - - public @Nonnull Locale getSignatureLocale() { - Locale locale = this.configuration.signatureLocale; - if (locale == null) - locale = Messages.getDefaultLocale(); - return locale; - } - - public void setSignaturePdfACompatPersistent(boolean compat) { - this.configuration.signaturePDFACompat = compat; - } - - public boolean getSignaturePdfACompat() { - return this.configuration.signaturePDFACompat; - } - - public void setKeyStoreEnabledPersistent(Boolean enabled) { - this.configuration.keystoreEnabled = enabled; - } - - public void setKeyStoreEnabledOverlay(Boolean enabled) { - this.configurationOverlay.keystoreEnabled = enabled; - } - - public boolean getKeyStoreEnabled() { - return ISNOTNULL(fallThroughOnNull(this.configurationOverlay.keystoreEnabled, getKeyStoreEnabledPersistent())); - } - - public boolean getKeyStoreEnabledPersistent() { - return ISNOTNULL(fallThroughOnNull(this.configuration.keystoreEnabled, Boolean.FALSE)); - } - - public void setKeyStoreFilePersistent(@CheckForNull String file) { - if (file == null || file.trim().isEmpty()) { - this.configuration.keystoreFile = ""; - } else { - this.configuration.keystoreFile = file; - } - } - - public void setKeyStoreFileOverlay(@CheckForNull String file) { - if (file == null || file.trim().isEmpty()) { - this.configurationOverlay.keystoreFile = null; - } else { - this.configurationOverlay.keystoreFile = file; - } - } - - public @Nonnull String getKeyStoreFile() { - return ISNOTNULL(fallThroughOnNull(this.configurationOverlay.keystoreFile, getKeyStoreFilePersistent())); - } - - public @Nonnull String getKeyStoreFilePersistent() { - return ISNOTNULL(this.configuration.keystoreFile); - } - - public void setKeyStoreTypePersistent(@CheckForNull String type) { - if (type == null || type.trim().isEmpty()) { - this.configuration.keystoreType = ""; - } else { - this.configuration.keystoreType = type; - } - } - - public void setKeyStoreTypeOverlay(@CheckForNull String type) { - if (type == null || type.trim().isEmpty()) { - this.configurationOverlay.keystoreType = null; - } else { - this.configurationOverlay.keystoreType = type; - } - } - - public @Nonnull String getKeyStoreType() { - return ISNOTNULL(fallThroughOnNull(this.configurationOverlay.keystoreType, getKeyStoreTypePersistent())); - } - - public @Nonnull String getKeyStoreTypePersistent() { - return ISNOTNULL(this.configuration.keystoreType); - } - - public void setKeyStoreAliasPersistent(@CheckForNull String alias) { - if (alias == null || alias.trim().isEmpty()) { - this.configuration.keystoreAlias = ""; - } else { - this.configuration.keystoreAlias = alias; - } - } - - public void setKeyStoreAliasOverlay(@CheckForNull String alias) { - if (alias == null || alias.trim().isEmpty()) { - this.configurationOverlay.keystoreAlias = null; - } else { - this.configurationOverlay.keystoreAlias = alias; - } - } - - public @Nonnull String getKeyStoreAlias() { - return ISNOTNULL(fallThroughOnNull(this.configurationOverlay.keystoreAlias, getKeyStoreAliasPersistent())); - } - - public @Nonnull String getKeyStoreAliasPersistent() { - return ISNOTNULL(this.configuration.keystoreAlias); - } - - public void setKeyStorePassStorageTypePersistent(@CheckForNull KeyStorePassStorageType type) { - this.configuration.keystorePassStorageType = type; - } - - public @CheckForNull KeyStorePassStorageType getKeyStorePassStorageType() { - return this.configuration.keystorePassStorageType; - } - - public void setKeyStoreStorePassPersistent(@CheckForNull String storePass) { - this.configuration.keystoreStorePass = storePass; - } - - public void setKeyStoreStorePassOverlay(@CheckForNull String storePass) { - this.configurationOverlay.keystoreStorePass = storePass; - } - - public @CheckForNull String getKeyStoreStorePass() { - String storePass = this.configurationOverlay.keystoreStorePass; - if (storePass != null) - return storePass; - if (getKeyStorePassStorageType() != KeyStorePassStorageType.DISK) - return null; - return getKeyStoreStorePassPersistent(); - } - - public @CheckForNull String getKeyStoreStorePassPersistent() { - return this.configuration.keystoreStorePass; - } - - public void setKeyStoreKeyPassPersistent(@CheckForNull String keyPass) { - this.configuration.keystoreKeyPass = keyPass; - } - - public void setKeyStoreKeyPassOverlay(@CheckForNull String keyPass) { - this.configurationOverlay.keystoreKeyPass = keyPass; - } - - public @CheckForNull String getKeyStoreKeyPass() { - String keyPass = this.configurationOverlay.keystoreKeyPass; - if (keyPass != null) - return keyPass; - if (getKeyStorePassStorageType() != KeyStorePassStorageType.DISK) - return null; - return getKeyStoreKeyPassPersistent(); - } - - public @CheckForNull String getKeyStoreKeyPassPersistent() { - return this.configuration.keystoreKeyPass; - } - - public void setUpdateCheckPersistent(boolean checkUpdate) { - this.configuration.updateCheck = checkUpdate; - } - - public boolean getUpdateCheck() { - return this.configuration.updateCheck; - } - - public void setMainWindowSizePersistent(@Nonnull Point size) { - this.configuration.mainWindowSize = size; - } - - public @Nonnull Point getMainWindowSize() { - return this.configuration.mainWindowSize; - } - - public boolean getSkipFinish() { - return this.configurationOverlay.skipFinish; - } - - public void setSkipFinishOverlay(boolean skipFinish) { - this.configurationOverlay.skipFinish = skipFinish; - } - - public boolean getUseSignatureFields() { - return this.configuration.getUseSignatureFields(); - } - - public void setUseSignatureFieldsPersistent(boolean useFields) { - this.configuration.setUseSignatureFields(useFields); - if (useFields) setUseMarkerPersistent(false); - } - - public boolean getUseMarker() { - return this.configuration.getUseMarker(); - } - - public void setUseMarkerPersistent(boolean useMarker) { - this.configuration.setUseMarker(useMarker); - if (useMarker) setUseSignatureFieldsPersistent(false); - } - - public void setSaveFilePostFixPersistent(@Nonnull String postFix) { - this.configuration.saveFilePostFix = postFix; - } - - public @Nonnull String getSaveFilePostFix(){ - return this.configuration.saveFilePostFix; - } - - public @Nonnull Profile getSignatureProfile() { - return ISNOTNULL(fallThroughOnNull(this.configuration.signatureProfile, Profile.SIGNATURBLOCK_SMALL)); - } - - public void setSignatureProfilePersistent(Profile profile) { - this.configuration.signatureProfile = profile; - } - - public void setEnablePlaceholderUsagePersistent(boolean bool) { - this.configuration.enabledPlaceholderUsage = bool; - } - - public boolean getEnablePlaceholderUsage() { - return this.configuration.enabledPlaceholderUsage; - } - - public void setFido2ByDefaultPersistent(boolean bool) { - this.configuration.fido2ByDefault = bool; - } - - public boolean getFido2ByDefault() { - return this.configuration.fido2ByDefault; - } - -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/BKUSelectionState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/BKUSelectionState.java deleted file mode 100644 index d1bdfe0d..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/BKUSelectionState.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.workflow.states; - -//Imports -import java.io.File; - -import org.eclipse.swt.SWT; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.MainWindow.Buttons; -import at.asit.pdfover.gui.bku.LocalBKUConnector; -import at.asit.pdfover.commons.BKUs; -import at.asit.pdfover.gui.MainWindowBehavior; -import at.asit.pdfover.gui.composites.BKUSelectionComposite; -import at.asit.pdfover.gui.workflow.StateMachine; -import at.asit.pdfover.gui.workflow.Status; - -/** - * Decides which BKU to use (preconfigured or let user choose) - */ -public class BKUSelectionState extends State { - - /** - * @param stateMachine - */ - public BKUSelectionState(StateMachine stateMachine) { - super(stateMachine); - } - - /** - * SLF4J Logger instance - **/ - @SuppressWarnings("unused") - private static final Logger log = LoggerFactory.getLogger(BKUSelectionState.class); - - private BKUSelectionComposite selectionComposite = null; - private BKUSelectionComposite getSelectionComposite() { - if (this.selectionComposite == null) { - this.selectionComposite = - getStateMachine().createComposite(BKUSelectionComposite.class, SWT.RESIZE, this); - } - - return this.selectionComposite; - } - - private boolean isKeystoreEnabled() { - if (getStateMachine().configProvider.getKeyStoreEnabled()) { - File ks = new File(getStateMachine().configProvider.getKeyStoreFile()); - return ks.exists(); - } else - return false; - } - - @Override - public void run() { - Status status = getStateMachine().status; - State previousState = status.getPreviousState(); - - final boolean hasLocalBKU = LocalBKUConnector.IsAvailable(); - final boolean hasKeystore = isKeystoreEnabled(); - if ( - (previousState instanceof OpenState) || - (previousState instanceof PositioningState) - ) { - if (!hasLocalBKU && !hasKeystore) - status.bku = BKUs.MOBILE; - } else if (!(previousState instanceof BKUSelectionState)) { - status.bku = BKUs.NONE; - } - - if(status.bku == BKUs.NONE) { - BKUSelectionComposite selection = this.getSelectionComposite(); - selection.setLocalBKUEnabled(hasLocalBKU); - selection.setKeystoreEnabled(hasKeystore); - - getStateMachine().display(selection); - selection.layout(); - - status.bku = selection.getSelected(); - - if(status.bku == BKUs.NONE) { - return; - } - } - this.setNextState(new PrepareSigningState(getStateMachine())); - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() - */ - @Override - public void cleanUp() { - if (this.selectionComposite != null) - this.selectionComposite.dispose(); - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() - */ - @Override - public void updateMainWindowBehavior() { - MainWindowBehavior behavior = getStateMachine().status.behavior; - behavior.reset(); - behavior.setEnabled(Buttons.CONFIG, true); - behavior.setEnabled(Buttons.OPEN, true); - behavior.setEnabled(Buttons.POSITION, true); - behavior.setActive(Buttons.OPEN, true); - behavior.setActive(Buttons.POSITION, true); - behavior.setActive(Buttons.SIGN, true); - } - - @Override - public String toString() { - return this.getClass().getName(); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/ConfigurationUIState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/ConfigurationUIState.java deleted file mode 100644 index 7393f13e..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/ConfigurationUIState.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.workflow.states; - -// Imports -import org.eclipse.swt.SWT; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.MainWindowBehavior; -import at.asit.pdfover.gui.MainWindow.Buttons; -import at.asit.pdfover.gui.composites.ConfigurationComposite; -import at.asit.pdfover.gui.controls.ErrorDialog; -import at.asit.pdfover.gui.controls.Dialog.BUTTONS; -import at.asit.pdfover.gui.workflow.StateMachine; -import at.asit.pdfover.gui.workflow.Status; -import at.asit.pdfover.gui.workflow.config.ConfigurationManager; - -/** - * - */ -public class ConfigurationUIState extends State { - private static final Logger log = LoggerFactory.getLogger(ConfigurationUIState.class); - - private ConfigurationComposite configurationComposite = null; - - private ConfigurationComposite getConfigurationComposite() { - if (this.configurationComposite == null) { - this.configurationComposite = - getStateMachine().createComposite(ConfigurationComposite.class, SWT.RESIZE, this); - this.configurationComposite.setConfigProvider(getStateMachine().configProvider); - } - - return this.configurationComposite; - } - - /** - * @param stateMachine - */ - public ConfigurationUIState(StateMachine stateMachine) { - super(stateMachine); - } - - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.workflow.states.State#run() - */ - @Override - public void run() { - Status status = getStateMachine().status; - - ConfigurationComposite config; - try { - config = this.getConfigurationComposite(); - getStateMachine().display(config); - } catch (Exception e) { - log.error("Failed to initialize config UI", e); - ErrorDialog error = new ErrorDialog( - getStateMachine().getMainShell(), - Messages.getString("error.ConfigInitialization"), - BUTTONS.YES_NO - ); - - int selection = error.open(); - if (selection == SWT.YES) - { - ConfigurationManager.factoryResetPersistentConfig(); - getStateMachine().exit(); - return; - } - - throw e; - } - - if(config.isUserDone()) - { - this.reloadResources(); - State previousState = status.getPreviousState(); - if (previousState instanceof OutputState) - this.setNextState(new OpenState(getStateMachine())); - else - this.setNextState(previousState); // TODO do we need to tell a previous state to refresh from config settings? (positioning preview) - } - } - - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() - */ - @Override - public void cleanUp() { - if(this.configurationComposite != null) - this.configurationComposite.dispose(); - } - - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.workflow.states.State#updateMainWindowBehavior() - */ - @Override - public void updateMainWindowBehavior() { - // Leave the state as it is - MainWindowBehavior behavior = getStateMachine().status.behavior; - behavior.setEnabled(Buttons.CONFIG, false); - behavior.setMainBarVisible(false); - } - - /** - * Triggers to reload the resources - */ - public void reloadResources() { - getStateMachine().reloadResources(); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/KSState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/KSState.java deleted file mode 100644 index 42a2f605..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/KSState.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.workflow.states; - -// Imports -import java.io.File; -import java.security.Key; -import java.security.KeyStore; -import java.security.UnrecoverableKeyException; - -import org.eclipse.swt.SWT; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.MainWindow.Buttons; -import at.asit.pdfover.gui.MainWindowBehavior; -import at.asit.pdfover.gui.controls.Dialog.BUTTONS; -import at.asit.pdfover.gui.keystore.KeystoreUtils; -import at.asit.pdfover.gui.controls.ErrorDialog; -import at.asit.pdfover.gui.controls.PasswordInputDialog; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.workflow.StateMachine; -import at.asit.pdfover.gui.workflow.Status; -import at.asit.pdfover.gui.workflow.config.ConfigurationManager; -import at.asit.pdfover.gui.workflow.config.ConfigurationDataInMemory.KeyStorePassStorageType; -import at.asit.pdfover.signer.SignatureException; -import at.asit.pdfover.signer.pdfas.PdfAs4SigningState; - -/** - * Logical state for performing the BKU Request to a local BKU - */ -public class KSState extends State { - - /** - * SLF4J Logger instance - **/ - static final Logger log = LoggerFactory.getLogger(KSState.class); - - /** - * Constructor - * @param stateMachine the StateMachine - */ - public KSState(StateMachine stateMachine) { - super(stateMachine); - } - - private void showError(String messageKey, Object... args) - { - new ErrorDialog(getStateMachine().getMainShell(), Messages.formatString(messageKey, args), BUTTONS.OK).open(); - } - - private boolean askShouldRetry(String messageKey, Object... args) - { - return SWT.RETRY == (new ErrorDialog(getStateMachine().getMainShell(), Messages.formatString(messageKey, args), BUTTONS.RETRY_CANCEL).open()); - } - - /* - * (non-Javadoc) - * - * @see - * at.asit.pdfover.gui.workflow.WorkflowState#update(at.asit.pdfover.gui - * .workflow.Workflow) - */ - @Override - public void run() { - Status status = getStateMachine().status; - - PdfAs4SigningState signingState = status.signingState; - ConfigurationManager config = getStateMachine().configProvider; - - try { - String file = config.getKeyStoreFile(); - File f = new File(file); - if (!f.isFile()) { - log.error("Keystore not found"); - if (askShouldRetry("error.KeyStoreFileNotExist", f.getName())) - this.run(); - else - this.setNextState(new BKUSelectionState(getStateMachine())); - return; - } - String type = config.getKeyStoreType(); - KeyStore keyStore = null; - String storePass = config.getKeyStoreStorePass(); - while (keyStore == null) { - if (storePass == null) - { - storePass = new PasswordInputDialog( - getStateMachine().getMainShell(), - Messages.getString("keystore_config.KeystoreStorePass"), - Messages.getString("keystore.KeystoreStorePassEntry")).open(); - - if (storePass == null) - { - this.setNextState(new BKUSelectionState(getStateMachine())); - return; - } - } - - try { - keyStore = KeystoreUtils.tryLoadKeystore(f, type, storePass); - } catch (UnrecoverableKeyException e) { - showError("error.KeyStoreStorePass"); - storePass = null; - } catch (Exception e) { - throw new SignatureException("Failed to load keystore", e); - } - } - - /* we've successfully unlocked the key store, save the entered password if requested */ - if (config.getKeyStorePassStorageType() == KeyStorePassStorageType.DISK) - { - /* only save to disk if the current keystore file is the one saved to disk */ - /* (might not be true if overridden from CLI) */ - if (file.equals(config.getKeyStoreFilePersistent())) - config.setKeyStoreStorePassPersistent(storePass); - else - config.setKeyStoreStorePassOverlay(storePass); - } - else if (config.getKeyStorePassStorageType() == KeyStorePassStorageType.MEMORY) - config.setKeyStoreStorePassOverlay(storePass); - - /* next, try to load the key from the now-unlocked keystore */ - String alias = config.getKeyStoreAlias(); - Key key = null; - String keyPass = config.getKeyStoreKeyPass(); - while (key == null) { - if (keyPass == null) { - keyPass = new PasswordInputDialog( - getStateMachine().getMainShell(), - Messages.getString("keystore_config.KeystoreKeyPass"), - Messages.getString("keystore.KeystoreKeyPassEntry")).open(); - - if (keyPass == null) - { - this.setNextState(new BKUSelectionState(getStateMachine())); - return; - } - } - - try { - key = keyStore.getKey(alias, keyPass.toCharArray()); - if (key == null) /* alias does not exist */ - { - if (!askShouldRetry("error.KeyStoreAliasExist", alias)) - { - this.setNextState(new BKUSelectionState(getStateMachine())); - return; - } - continue; - } - } catch (UnrecoverableKeyException e) { - showError("error.KeyStoreKeyPass"); - keyPass = null; - } catch (Exception e) { - throw new SignatureException("Failed to load key from store", e); - } - } - - if (config.getKeyStorePassStorageType() == KeyStorePassStorageType.DISK) - { - if (file.equals(config.getKeyStoreFilePersistent())) - config.setKeyStoreKeyPassPersistent(keyPass); - else - config.setKeyStoreKeyPassOverlay(keyPass); - } - else if (config.getKeyStorePassStorageType() == KeyStorePassStorageType.MEMORY) - config.setKeyStoreKeyPassOverlay(keyPass); - - signingState.setKeystoreSigner(file, alias, storePass, keyPass, type); - } catch (SignatureException e) { - log.error("Error loading keystore", e); - if (askShouldRetry("error.KeyStore")) - this.run(); /* recurse */ - else - this.setNextState(new BKUSelectionState(getStateMachine())); - return; - } - - // OK - this.setNextState(new at.asit.pdfover.gui.workflow.states.SigningState(getStateMachine())); - } - - /* - * (non-Javadoc) - * - * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() - */ - @Override - public void cleanUp() { - // No composite - no cleanup necessary - } - - /* - * (non-Javadoc) - * - * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() - */ - @Override - public void updateMainWindowBehavior() { - MainWindowBehavior behavior = getStateMachine().status.behavior; - behavior.reset(); - behavior.setActive(Buttons.OPEN, true); - behavior.setActive(Buttons.POSITION, true); - behavior.setActive(Buttons.SIGN, true); - } - - @Override - public String toString() { - return this.getClass().getName(); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/LocalBKUState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/LocalBKUState.java deleted file mode 100644 index f1bfa5b9..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/LocalBKUState.java +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.workflow.states; - -// Imports -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.HttpException; -import org.apache.commons.httpclient.HttpMethod; -import org.apache.commons.httpclient.HttpStatus; -import org.apache.commons.httpclient.methods.PostMethod; -import org.eclipse.swt.SWT; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.gui.MainWindow.Buttons; -import at.asit.pdfover.gui.MainWindowBehavior; -import at.asit.pdfover.gui.bku.BKUHelper; -import at.asit.pdfover.gui.bku.LocalBKUConnector; -import at.asit.pdfover.gui.controls.Dialog.BUTTONS; -import at.asit.pdfover.gui.controls.ErrorDialog; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.workflow.StateMachine; -import at.asit.pdfover.gui.workflow.Status; -import at.asit.pdfover.signer.pdfas.PdfAs4SigningState; - -/** - * Logical state for performing the BKU Request to a local BKU - */ -public class LocalBKUState extends State { - - /** - * SLF4J Logger instance - **/ - static final Logger log = LoggerFactory.getLogger(LocalBKUState.class); - - /** - * HTTP Response server HEADER - */ - public final static String BKU_RESPONSE_HEADER_SERVER = "server"; - - /** - * HTTP Response user-agent HEADER - */ - public final static String BKU_RESPONSE_HEADER_USERAGENT = "user-agent"; - - /** - * HTTP Response SignatureLayout HEADER - */ - public final static String BKU_RESPONSE_HEADER_SIGNATURE_LAYOUT = "SignatureLayout"; - - Exception threadException = null; - - /** Whether to use Base64 or FileUpload Request */ - boolean useBase64Request = false; - - /** - * Null-Operation SL-Request - */ - private final static String NULL_OPERATION_REQUEST = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + - "<sl:NullOperationRequest xmlns:sl=\"http://www.buergerkarte.at/namespaces/securitylayer/1.2#\"/>"; - - /** - * Constructor - * @param stateMachine the StateMachine - */ - public LocalBKUState(StateMachine stateMachine) { - super(stateMachine); - } - - /** - * - */ - private final class SignLocalBKUThread implements Runnable { - - private LocalBKUState state; - private PdfAs4SigningState signingState; - - - /** - * @param localBKUState - * @param signingState - */ - public SignLocalBKUThread(LocalBKUState localBKUState, PdfAs4SigningState signingState) { - this.state = localBKUState; - this.signingState = signingState; - } - - @Override - public void run() { - try { - - HttpClient client = (HttpClient) BKUHelper.getHttpClient(); - - PostMethod method = new PostMethod(Constants.LOCAL_BKU_URL); - - String sl_request = NULL_OPERATION_REQUEST; - method.addParameter("XMLRequest", sl_request); - int returnCode = client.executeMethod(method); - - if (returnCode != HttpStatus.SC_OK) { - this.state.threadException = new HttpException( - method.getResponseBodyAsString()); - } else { - String server = getResponseHeader(method, BKU_RESPONSE_HEADER_SERVER); - if ((server != null) && (server.contains("trustDeskbasic") || server.contains("asignSecurityLayer"))) - LocalBKUState.this.useBase64Request = true; - - this.signingState.signatureResponse = method.getResponseBodyAsString(); - this.signingState.useBase64Request = LocalBKUState.this.useBase64Request; - } - } catch (Exception e) { - log.error("SignLocalBKUThread: ", e); - - this.state.threadException = e; - } finally { - this.state.updateStateMachine(); - } - } - - /** - * Returns the value corresponding to the given header name - * @param method the HTTP method - * @param headerName the header name - * @return the header value (or null if not found) - */ - private String getResponseHeader(HttpMethod method, String headerName) { - if (method.getResponseHeader(headerName) == null) - return null; - return method.getResponseHeader(headerName).getValue(); - } - } - - /* - * (non-Javadoc) - * - * @see - * at.asit.pdfover.gui.workflow.WorkflowState#update(at.asit.pdfover.gui - * .workflow.Workflow) - */ - @Override - public void run() { - Status status = getStateMachine().status; - - PdfAs4SigningState signingState = status.signingState; - - if ((signingState.signatureResponse == null) - && this.threadException == null) { - Thread t = new Thread(new SignLocalBKUThread(this, signingState)); - t.start(); - return; - } - signingState.bkuConnector = new LocalBKUConnector(); - - if (this.threadException != null) { - ErrorDialog dialog = new ErrorDialog( - getStateMachine().getMainShell(), - Messages.getString("error.LocalBKU"), - BUTTONS.RETRY_CANCEL); - if (dialog.open() != SWT.RETRY) { - //getStateMachine().exit(); - this.setNextState(new BKUSelectionState(getStateMachine())); - return; - } - this.threadException = null; - this.run(); - return; - } - - // OK - this.setNextState(new at.asit.pdfover.gui.workflow.states.SigningState(getStateMachine())); - } - - /* - * (non-Javadoc) - * - * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() - */ - @Override - public void cleanUp() { - // No composite - no cleanup necessary - } - - /* - * (non-Javadoc) - * - * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() - */ - @Override - public void updateMainWindowBehavior() { - MainWindowBehavior behavior = getStateMachine().status.behavior; - behavior.reset(); - behavior.setActive(Buttons.OPEN, true); - behavior.setActive(Buttons.POSITION, true); - behavior.setActive(Buttons.SIGN, true); - } - - @Override - public String toString() { - return this.getClass().getName(); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/MobileBKUState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/MobileBKUState.java deleted file mode 100644 index d858c067..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/MobileBKUState.java +++ /dev/null @@ -1,668 +0,0 @@ -/*
- * Copyright 2012 by A-SIT, Secure Information Technology Center Austria
- *
- * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by
- * the European Commission - subsequent versions of the EUPL (the "Licence");
- * You may not use this work except in compliance with the Licence.
- * You may obtain a copy of the Licence at:
- * http://joinup.ec.europa.eu/software/page/eupl
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the Licence is distributed on an "AS IS" basis,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the Licence for the specific language governing permissions and
- * limitations under the Licence.
- */
-package at.asit.pdfover.gui.workflow.states;
-
-import java.io.IOException;
-import java.net.ConnectException;
-import java.net.URI;
-import java.net.UnknownHostException;
-
-import javax.annotation.CheckForNull;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-
-// Imports
-import at.asit.pdfover.signer.UserCancelledException;
-import at.asit.pdfover.signer.pdfas.PdfAs4SigningState;
-import at.asit.webauthn.PublicKeyCredential;
-import at.asit.webauthn.responsefields.AuthenticatorAssertionResponse;
-
-import org.apache.hc.client5.http.classic.methods.HttpGet;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
-import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse;
-import org.apache.hc.client5.http.impl.classic.HttpClients;
-import org.apache.hc.core5.http.io.entity.EntityUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import at.asit.pdfover.gui.MainWindow.Buttons;
-import at.asit.pdfover.gui.MainWindowBehavior;
-import at.asit.pdfover.gui.bku.MobileBKUConnector;
-import at.asit.pdfover.gui.composites.WaitingComposite;
-import at.asit.pdfover.gui.composites.mobilebku.MobileBKUEnterNumberComposite;
-import at.asit.pdfover.gui.composites.mobilebku.MobileBKUEnterTANComposite;
-import at.asit.pdfover.gui.composites.mobilebku.MobileBKUFido2Composite;
-import at.asit.pdfover.gui.composites.mobilebku.MobileBKUFingerprintComposite;
-import at.asit.pdfover.gui.composites.mobilebku.MobileBKUQRComposite;
-import at.asit.pdfover.gui.composites.mobilebku.WaitingForAppComposite;
-import at.asit.pdfover.gui.controls.Dialog.BUTTONS;
-import at.asit.pdfover.gui.controls.Dialog.ICON;
-import at.asit.pdfover.gui.controls.Dialog;
-import at.asit.pdfover.gui.controls.ErrorDialog;
-import at.asit.pdfover.commons.Messages;
-import at.asit.pdfover.gui.workflow.StateMachine;
-
-import static at.asit.pdfover.commons.Constants.ISNOTNULL;
-
-/**
- * Logical state for performing the BKU Request to the A-Trust Mobile BKU
- */
-public class MobileBKUState extends State {
- static final Logger log = LoggerFactory.getLogger(MobileBKUState.class);
-
- PdfAs4SigningState signingState;
-
- public Exception threadException = null;
-
- public MobileBKUState(StateMachine stateMachine) {
- super(stateMachine);
- }
-
- MobileBKUEnterTANComposite mobileBKUEnterTANComposite = null;
-
- WaitingForAppComposite waitingForAppComposite = null;
- WaitingForAppComposite getWaitingForAppComposite() {
- if (this.waitingForAppComposite == null) {
- this.waitingForAppComposite = getStateMachine()
- .createComposite(WaitingForAppComposite.class, SWT.RESIZE, this);
- }
-
- return this.waitingForAppComposite;
- }
-
- WaitingComposite waitingComposite = null;
- WaitingComposite getWaitingComposite() {
- if (this.waitingComposite == null) {
- this.waitingComposite = getStateMachine()
- .createComposite(WaitingComposite.class, SWT.RESIZE, this);
- }
-
- return this.waitingComposite;
- }
-
- MobileBKUEnterTANComposite getMobileBKUEnterTANComposite() {
- if (this.mobileBKUEnterTANComposite == null) {
- this.mobileBKUEnterTANComposite = getStateMachine()
- .createComposite(MobileBKUEnterTANComposite.class, SWT.RESIZE, this);
- }
-
- return this.mobileBKUEnterTANComposite;
- }
-
- MobileBKUQRComposite mobileBKUQRComposite = null;
- MobileBKUQRComposite getMobileBKUQRComposite() {
- if (this.mobileBKUQRComposite == null) {
- this.mobileBKUQRComposite = getStateMachine()
- .createComposite(MobileBKUQRComposite.class, SWT.RESIZE, this);
- }
-
- return this.mobileBKUQRComposite;
- }
-
- MobileBKUEnterNumberComposite mobileBKUEnterNumberComposite = null;
- MobileBKUEnterNumberComposite getMobileBKUEnterNumberComposite() {
- if (this.mobileBKUEnterNumberComposite == null) {
- this.mobileBKUEnterNumberComposite = getStateMachine()
- .createComposite(MobileBKUEnterNumberComposite.class, SWT.RESIZE, this);
- }
-
- return this.mobileBKUEnterNumberComposite;
- }
-
- MobileBKUFingerprintComposite mobileBKUFingerprintComposite = null;
- MobileBKUFingerprintComposite getMobileBKUFingerprintComposite() {
- if (this.mobileBKUFingerprintComposite == null) {
- this.mobileBKUFingerprintComposite = getStateMachine()
- .createComposite(MobileBKUFingerprintComposite.class, SWT.RESIZE, this);
- }
-
- return this.mobileBKUFingerprintComposite;
- }
-
- MobileBKUFido2Composite mobileBKUFido2Composite = null;
- MobileBKUFido2Composite getMobileBKUFido2Composite() {
- if (this.mobileBKUFido2Composite == null) {
- this.mobileBKUFido2Composite = getStateMachine()
- .createComposite(MobileBKUFido2Composite.class, SWT.RESIZE, this);
- }
-
- return this.mobileBKUFido2Composite;
- }
-
- /**
- * @return the signingState
- */
- public PdfAs4SigningState getSigningState() {
- return this.signingState;
- }
-
- /**
- * Display an error message
- *
- * @param e
- * the exception
- */
- public void displayError(Exception e) {
- String message = null;
- if (e instanceof UnknownHostException)
- {
- log.error("Failed to resolve hostname", e);
- message = Messages.formatString("error.CouldNotResolveHostname", e.getMessage());
- } else if (e instanceof ConnectException) {
- log.error("Failed to connect", e);
- message = Messages.formatString("error.FailedToConnect", e.getMessage());
- } else {
- message = Messages.getString("error.Unexpected");
- log.error(message, e);
- String errormsg = e.getLocalizedMessage();
- if (errormsg != null && !errormsg.isEmpty())
- message += ": " + errormsg;
- }
- displayError(message);
- }
-
- /**
- * Display an error message
- *
- * @param message
- * the error message
- */
- public void displayError(final String message) {
- log.error(message);
- Display.getDefault().syncExec(() -> {
- ErrorDialog error = new ErrorDialog(getStateMachine().getMainShell(), message, BUTTONS.OK);
- error.open();
- });
- }
-
- public void showInformationMessage(final @Nonnull String message) throws UserCancelledException {
- Display.getDefault().syncCall(() -> {
- Dialog dialog = new Dialog(getStateMachine().getMainShell(), Messages.getString("common.info"), message, BUTTONS.OK, ICON.INFORMATION);
- int result = dialog.open();
- if (result == SWT.CANCEL)
- throw new UserCancelledException();
- return true; /* dummy return to keep java happy */
- });
- }
-
- /**
- * Show an error message to the user with "retry" or "cancel" as options
- * returns normally on "retry", throws UserCancelledException on "cancel"
- */
- public void showRecoverableError(final @Nonnull String errorMessage) throws UserCancelledException {
- Display.getDefault().syncCall(() -> {
- ErrorDialog error = new ErrorDialog(getStateMachine().getMainShell(), errorMessage, BUTTONS.RETRY_CANCEL);
- int result = error.open();
- if (result == SWT.CANCEL)
- throw new UserCancelledException();
- return true; /* dummy return */
- });
- }
-
- /**
- * Show an error message to the user with only an "ok" option;
- * throws UserCancelledException afterwards
- */
- public void showUnrecoverableError(final @Nonnull String errorMessage) throws UserCancelledException {
- Display.getDefault().syncCall(() -> {
- ErrorDialog error = new ErrorDialog(getStateMachine().getMainShell(), errorMessage, BUTTONS.OK);
- error.open();
- throw new UserCancelledException();
- });
- }
-
- public static class UsernameAndPassword {
- public @CheckForNull String username;
- public @CheckForNull String password;
- public UsernameAndPassword() {}
- public UsernameAndPassword(@Nullable String u, @Nullable String p) { this.username = u; this.password = p; }
- }
- public @Nonnull UsernameAndPassword getRememberedCredentials() {
- UsernameAndPassword r = new UsernameAndPassword();
- storeRememberedCredentialsTo(r);
- return r;
- }
- public void storeRememberedCredentialsTo(@Nonnull UsernameAndPassword output) {
- output.username = getStateMachine().configProvider.getDefaultMobileNumber();
- output.password = getStateMachine().configProvider.getDefaultMobilePassword();
- }
-
- public void rememberCredentialsIfNecessary(@Nullable String username, @Nullable String password) {
- if (getStateMachine().configProvider.getRememberMobilePassword())
- {
- getStateMachine().configProvider.setDefaultMobileNumberPersistent(username);
- getStateMachine().configProvider.setDefaultMobilePasswordOverlay(password);
- }
- }
- public void rememberCredentialsIfNecessary(@Nonnull UsernameAndPassword credentials) {
- rememberCredentialsIfNecessary(credentials.username, credentials.password);
- }
-
- public void clearRememberedPassword() {
- getStateMachine().configProvider.setDefaultMobilePasswordOverlay(null);
- }
-
- public @Nonnull UsernameAndPassword getCredentialsFromUser(@Nullable String currentUsername, @Nullable String errorMessage) throws UserCancelledException {
- UsernameAndPassword r = new UsernameAndPassword(currentUsername, null);
- getCredentialsFromUserTo(r, errorMessage);
- return r;
- }
-
- private void updateRememberPasswordSetting(boolean enabled, boolean allowEnabling) {
- final var config = getStateMachine().configProvider;
- if (enabled == config.getRememberMobilePassword()) /* nothing to do here */
- return;
- if (enabled && !allowEnabling) /* do not allow "cancel" to set the remember checkbox */
- return;
- config.setRememberMobilePasswordPersistent(enabled);
- if (!enabled) { /* clear remembered info */
- config.setDefaultMobileNumberPersistent(null);
- config.setDefaultMobilePasswordOverlay(null);
- }
- }
-
- public void getCredentialsFromUserTo(@Nonnull UsernameAndPassword credentials, @Nullable String errorMessage) throws UserCancelledException {
- Display.getDefault().syncCall(() -> {
- MobileBKUEnterNumberComposite ui = this.getMobileBKUEnterNumberComposite();
-
- if (!ui.userAck) { // We need number and password => show UI!
-
- if (errorMessage != null)
- ui.setErrorMessage(errorMessage);
- else
- ui.setErrorMessage(Messages.getString("mobileBKU.aTrustDisclaimer"));
-
- if ((ui.getMobileNumber() == null) || ui.getMobileNumber().isEmpty()) {
- // set possible phone number
- ui.setMobileNumber(credentials.username);
- }
-
- ui.setRememberPassword(getStateMachine().configProvider.getRememberMobilePassword());
-
- ui.enableButton();
- getStateMachine().display(ui);
-
- Display display = getStateMachine().getMainShell().getDisplay();
- while (!ui.userAck && !ui.userCancel) {
- if (!display.readAndDispatch()) {
- display.sleep();
- }
- }
- }
-
- updateRememberPasswordSetting(ui.isRememberPassword(), !ui.userCancel);
-
- if (ui.userCancel) {
- ui.userCancel = false;
- throw new UserCancelledException();
- }
-
- // user hit ok
- ui.userAck = false;
-
- // get number and password from UI
- credentials.username = ui.getMobileNumber();
- credentials.password = ui.getMobilePassword();
-
- // show waiting composite
- getStateMachine().display(this.getWaitingComposite());
-
- return true; /* dummy return for lambda type deduction */
- });
- }
-
- public static class SMSTanResult {
- public static enum ResultType { TO_FIDO2, SMSTAN };
- public final @Nonnull ResultType type;
- public final @CheckForNull String smsTan;
-
- private SMSTanResult(@Nullable String smsTan) { this.type = ResultType.SMSTAN; this.smsTan = smsTan; }
- private SMSTanResult(@Nonnull ResultType type) { this.type = type; this.smsTan = null; }
- }
-
- public @Nonnull SMSTanResult getSMSTanFromUser(final @Nonnull String referenceValue, final @Nullable URI signatureDataURI, final boolean showFido2, final @Nullable String errorMessage) throws UserCancelledException {
- return ISNOTNULL(Display.getDefault().syncCall(() -> {
- MobileBKUEnterTANComposite tan = getMobileBKUEnterTANComposite();
-
- tan.reset();
- tan.setRefVal(referenceValue);
- tan.setSignatureDataURI(signatureDataURI);
- tan.setErrorMessage(errorMessage);
- tan.setFIDO2Enabled(showFido2);
- getStateMachine().display(tan);
-
- Display display = getStateMachine().getMainShell().getDisplay();
- while (!tan.isDone()) {
- if (!display.readAndDispatch()) {
- display.sleep();
- }
- }
- getStateMachine().display(getWaitingComposite());
-
- if (tan.isUserCancel())
- throw new UserCancelledException();
-
- if (tan.isUserFido2())
- return new SMSTanResult(SMSTanResult.ResultType.TO_FIDO2);
-
- return new SMSTanResult(tan.getTan());
- }));
- }
-
- /**
- * start showing the QR code at the indicated URI
- * this method will return immediately */
- public void showQRCode(final @Nonnull String referenceValue, @Nonnull URI qrCodeURI, @Nullable URI signatureDataURI, final boolean showSmsTan, final boolean showFido2, final @Nullable String errorMessage) {
- byte[] qrCode;
- try (final CloseableHttpClient httpClient = HttpClients.createDefault()) {
- try (final CloseableHttpResponse response = httpClient.execute(new HttpGet(qrCodeURI))) {
- qrCode = EntityUtils.toByteArray(response.getEntity());
- }
- } catch (IOException e) {
- log.warn("Failed to load QR code.");
- qrCode = null;
- }
-
- final byte[] qrCodeCopy = qrCode; /* because java is silly */
- Display.getDefault().syncExec(() -> {
- MobileBKUQRComposite qr = getMobileBKUQRComposite();
- qr.reset();
-
- qr.setRefVal(referenceValue);
- qr.setSignatureDataURI(signatureDataURI);
- qr.setErrorMessage(errorMessage);
- qr.setQR(qrCodeCopy);
- qr.setSMSEnabled(showSmsTan);
- qr.setFIDO2Enabled(showFido2);
- getStateMachine().display(qr);
- });
- }
-
- public enum QRResult {
- /* the user has pressed the FIDO2 button */
- TO_FIDO2,
- /* the user has pressed the SMS button */
- TO_SMS,
- /* signalQRScanned has been called; this indicates that we should refresh the page */
- UPDATE
- };
-
- public @Nonnull QRResult waitForQRCodeResult() throws UserCancelledException {
- return ISNOTNULL(Display.getDefault().syncCall(() -> {
- MobileBKUQRComposite qr = getMobileBKUQRComposite();
-
- Display display = getStateMachine().getMainShell().getDisplay();
- while (!qr.isDone()) {
- if (!display.readAndDispatch()) {
- display.sleep();
- }
- }
-
- getStateMachine().display(this.getWaitingComposite());
-
- if (qr.wasCancelClicked()) {
- clearRememberedPassword();
- throw new UserCancelledException();
- }
-
- if (qr.wasSMSClicked())
- return QRResult.TO_SMS;
-
- if (qr.wasFIDO2Clicked())
- return QRResult.TO_FIDO2;
-
- return QRResult.UPDATE;
- }));
- }
-
- /**
- * indicate that the long polling operation completed
- * (any ongoing waitForQRCodeResult call will then return)
- */
- public void signalQRScanned() {
- getMobileBKUQRComposite().signalPollingDone();
- }
-
- /**
- * start showing the "waiting for app" screen
- * this method will return immediately */
- public void showWaitingForAppOpen(final @Nonnull String referenceValue, @Nullable URI signatureDataURI, final boolean showSmsTan, final boolean showFido2) {
- Display.getDefault().syncExec(() -> {
- WaitingForAppComposite wfa = getWaitingForAppComposite();
- wfa.reset();
-
- // TODO composite does not currently support: refval, signature data
- wfa.setSMSEnabled(showSmsTan);
- wfa.setFIDO2Enabled(showFido2);
- getStateMachine().display(wfa);
- });
- }
-
- public enum AppOpenResult {
- /* the user has pressed the FIDO2 button */
- TO_FIDO2,
- /* the user has pressed the SMS button */
- TO_SMS,
- /* signalAppOpened has been called; this indicates that we should refresh the page */
- UPDATE
- };
-
- public @Nonnull AppOpenResult waitForAppOpen() throws UserCancelledException {
- return ISNOTNULL(Display.getDefault().syncCall(() -> {
- WaitingForAppComposite wfa = getWaitingForAppComposite();
-
- Display display = wfa.getDisplay();
- while (!wfa.isDone()) {
- if (!display.readAndDispatch())
- display.sleep();
- }
-
- getStateMachine().display(this.getWaitingComposite());
-
- if (wfa.wasCancelClicked()) {
- clearRememberedPassword();
- throw new UserCancelledException();
- }
-
- if (wfa.wasSMSClicked())
- return AppOpenResult.TO_SMS;
-
- if (wfa.wasFIDO2Clicked())
- return AppOpenResult.TO_FIDO2;
-
- return AppOpenResult.UPDATE;
- }));
- }
-
- /**
- * indicate that the long polling operation completed
- * (any ongoing waitForAppOpen call will then return)
- */
- public void signalAppOpened() {
- getWaitingForAppComposite().signalPollingDone();
- }
-
- public void showWaitingForAppBiometry(final @Nonnull String referenceValue, @Nullable URI signatureDataURI, final boolean showSmsTan, final boolean showFido2) {
- Display.getDefault().syncExec(() -> {
- MobileBKUFingerprintComposite bio = getMobileBKUFingerprintComposite();
- bio.reset();
-
- bio.setRefVal(referenceValue);
- bio.signatureDataURI = signatureDataURI;
- bio.setErrorMessage(null); // TODO
- bio.setSMSEnabled(showSmsTan);
- bio.setFIDO2Enabled(showFido2);
- getStateMachine().display(bio);
- });
- }
-
- // TODO can we maybe deduplicate the various waiting screens' logic?
-
- public enum AppBiometryResult {
- /* the user has pressed the FIDO2 button */
- TO_FIDO2,
- /* the user has pressed the SMS button */
- TO_SMS,
- /* signalAppBiometryDone has been called; this indicates that we should refresh the page */
- UPDATE
- };
-
- public @Nonnull AppBiometryResult waitForAppBiometry() throws UserCancelledException {
- return ISNOTNULL(Display.getDefault().syncCall(() -> {
- MobileBKUFingerprintComposite bio = getMobileBKUFingerprintComposite();
-
- Display display = bio.getDisplay();
- while (!bio.isDone()) {
- if (!display.readAndDispatch())
- display.sleep();
- }
-
- getStateMachine().display(this.getWaitingComposite());
-
- if (bio.wasCancelClicked()) {
- clearRememberedPassword();
- throw new UserCancelledException();
- }
-
- if (bio.wasSMSClicked())
- return AppBiometryResult.TO_SMS;
-
- if (bio.wasFIDO2Clicked())
- return AppBiometryResult.TO_FIDO2;
-
- return AppBiometryResult.UPDATE;
- }));
- }
-
- public void signalAppBiometryDone() {
- getMobileBKUFingerprintComposite().signalPollingDone();
- }
-
- public static class FIDO2Result {
- public static enum ResultType { TO_SMS, CREDENTIAL };
- public final @Nonnull ResultType type;
- public final @Nullable PublicKeyCredential<AuthenticatorAssertionResponse> credential;
-
- private FIDO2Result(@Nonnull ResultType type) { this.type = type; this.credential = null; }
- private FIDO2Result(@Nonnull PublicKeyCredential<AuthenticatorAssertionResponse> cred) { this.type = ResultType.CREDENTIAL; this.credential = cred; }
- }
-
- /**
- * prompts user for fido2 auth and blocks until result is available
- * @param fido2Options JSON data from A-Trust
- * @return
- * @throws UserCancelledException
- */
- public @Nonnull FIDO2Result promptUserForFIDO2Auth(final @Nonnull String fido2Options, @Nullable URI signatureDataURI, final boolean showSmsTan) throws UserCancelledException {
- return ISNOTNULL(Display.getDefault().syncCall(() -> {
- MobileBKUFido2Composite fido2 = getMobileBKUFido2Composite();
- fido2.initialize(fido2Options);
- fido2.setSMSEnabled(showSmsTan);
- fido2.setSignatureDataURI(signatureDataURI);
-
- getStateMachine().display(fido2);
-
- Display display = fido2.getDisplay();
- while (!fido2.isDone()) {
- if (!display.readAndDispatch())
- display.sleep();
- }
-
- getStateMachine().display(this.getWaitingComposite());
-
- if (fido2.wasUserCancelClicked())
- throw new UserCancelledException();
-
- if (fido2.wasUserSMSClicked())
- return new FIDO2Result(FIDO2Result.ResultType.TO_SMS);
-
- return new FIDO2Result(ISNOTNULL(fido2.getResultingCredential()));
- }));
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * at.asit.pdfover.gui.workflow.WorkflowState#update(at.asit.pdfover.gui
- * .workflow.Workflow)
- */
- @Override
- public void run() {
- this.signingState = getStateMachine().status.signingState;
-
- this.signingState.bkuConnector = new MobileBKUConnector(this);
- this.signingState.useBase64Request = false;
-
- if (this.threadException != null) {
- displayError(this.threadException);
- return;
- }
-
- getStateMachine().display(
- this.getWaitingComposite());
-
- this.setNextState(new SigningState(getStateMachine()));
- }
-
- /*
- * (non-Javadoc)
- *
- * @see at.asit.pdfover.gui.workflow.states.State#cleanUp()
- */
- @Override
- public void cleanUp() {
- if (this.mobileBKUEnterNumberComposite != null)
- this.mobileBKUEnterNumberComposite.dispose();
- if (this.mobileBKUEnterTANComposite != null)
- this.mobileBKUEnterTANComposite.dispose();
- if (this.waitingComposite != null)
- this.waitingComposite.dispose();
- if (this.waitingForAppComposite != null)
- this.waitingForAppComposite.dispose();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior()
- */
- @Override
- public void updateMainWindowBehavior() {
- MainWindowBehavior behavior = getStateMachine().status.behavior;
- behavior.reset();
- behavior.setActive(Buttons.OPEN, true);
- behavior.setActive(Buttons.POSITION, true);
- behavior.setActive(Buttons.SIGN, true);
- behavior.setEnabled(Buttons.OPEN, true);
- behavior.setEnabled(Buttons.POSITION, true);
- //behavior.setEnabled(Buttons.SIGN, true);
- }
-
- @Override
- public String toString() {
- return this.getClass().getName();
- }
-
- /**
- * invoke state machine update in main thread
- */
- public void invokeUpdate() {
- getStateMachine().invokeUpdate();
- }
-}
diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OpenState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OpenState.java deleted file mode 100644 index 12b16da7..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OpenState.java +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.workflow.states; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.List; - -import at.gv.egiz.pdfas.lib.impl.pdfbox2.placeholder.SignatureFieldsAndPlaceHolderExtractor; - -import org.apache.pdfbox.pdmodel.PDDocument; - -//Imports -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.MessageBox; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.gui.MainWindow.Buttons; -import at.asit.pdfover.gui.bku.LocalBKUConnector; -import at.asit.pdfover.gui.MainWindowBehavior; -import at.asit.pdfover.gui.PlaceholderSelectionGui; -import at.asit.pdfover.gui.composites.DataSourceSelectComposite; -import at.asit.pdfover.gui.utils.SWTUtils; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.commons.Profile; -import at.asit.pdfover.gui.workflow.StateMachine; -import at.asit.pdfover.gui.workflow.Status; -import at.asit.pdfover.gui.workflow.config.ConfigurationManager; -import at.asit.pdfover.signer.SignaturePosition; -import at.gv.egiz.pdfas.lib.impl.placeholder.SignaturePlaceholderData; - - - -import org.apache.commons.configuration.PropertiesConfiguration; -import org.apache.commons.configuration.PropertiesConfigurationLayout; - - -/** - * Selects the data source for the signature process. - */ -public class OpenState extends State { - - /** - * @param stateMachine - */ - public OpenState(StateMachine stateMachine) { - super(stateMachine); - } - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(OpenState.class); - private static final String advancedConfig = Constants.CONFIG_DIRECTORY + File.separator + "/cfg/advancedconfig.properties"; - - private DataSourceSelectComposite selectionComposite = null; - - private DataSourceSelectComposite getSelectionComposite() { - if (this.selectionComposite == null) { - this.selectionComposite = - getStateMachine().createComposite(DataSourceSelectComposite.class, SWT.RESIZE, this); - } - return this.selectionComposite; - } - - @Override - public void run() { - ConfigurationManager config = getStateMachine().configProvider; - Status status = getStateMachine().status; - if (!(status.getPreviousState() instanceof PrepareConfigurationState) - && !(status.getPreviousState() instanceof OpenState)) { - status.bku = config.getDefaultBKU(); - status.document = null; - status.signaturePosition = ((config.getSignatureProfile() == Profile.INVISIBLE) || config.getAutoPositionSignature()) ? (new SignaturePosition()) : null; - - /* ensure that files get closed */ - status.getPreviousState().cleanUp(); - } - - /* force static initialization and start polling */ - LocalBKUConnector.IsAvailable(); - - if (status.document == null) { - DataSourceSelectComposite selection = this.getSelectionComposite(); - - getStateMachine().display(selection); - selection.layout(); - - status.document = selection.getSelected(); - - if (status.document == null) { - // Not selected yet - return; - } - } - log.debug("Got Datasource: " + getStateMachine().status.document.getAbsolutePath()); - - // scan for signature placeholders - // - see if we want to scan for placeholders in the settings - if (config.getEnablePlaceholderUsage()) { - try (PDDocument pddocument = PDDocument.load(getStateMachine().status.document)) { - // - scan for placeholders - boolean useSignatureFields = config.getUseSignatureFields(); - boolean useMarker = config.getUseMarker(); - log.debug("Placeholder usage enabled. Signature fields: {}, QR Markers: {}", useSignatureFields, useMarker); - //first check the signature fields placeholder - if (useSignatureFields) { - - List<String> fields = SignatureFieldsAndPlaceHolderExtractor.findEmptySignatureFields(pddocument); - - if (fields.size() > 0) { - while (true) - { - // create a dialog with ok and cancel buttons and a question - // icon - MessageBox dialog = new MessageBox(getStateMachine().getMainShell(), - SWT.ICON_QUESTION | SWT.YES | SWT.NO | SWT.CANCEL); - SWTUtils.setLocalizedText(dialog, "dataSourceSelection.usePlaceholderTitle"); - dialog.setMessage(Messages.getString("dataSourceSelection.usePlaceholderText")); - - // open dialog and await user selection - int result = dialog.open(); - if (result == SWT.YES) { - - if (fields.size() == 1) { - addPlaceholderSelectionToConfig(fields.get(0)); - this.setNextState(new BKUSelectionState(getStateMachine())); - return; - - } else if (fields.size() > 1) { - - PlaceholderSelectionGui gui = new PlaceholderSelectionGui( - getStateMachine().getMainShell(), 65570, "text", - "select the fields", fields); - int res = gui.open(); - if (res != -1) { - getStateMachine().status.searchForPlacehoderSignature = true; - addPlaceholderSelectionToConfig(fields.get(res)); - this.setNextState(new BKUSelectionState(getStateMachine())); - } - else - continue; - } - - } else if (result == SWT.NO) { - getStateMachine().status.searchForPlacehoderSignature = false; - } else { - status.document = null; - return; - } - break; - } - } - // second check if qr code placeholder search is enabled - } else if (useMarker) { - - SignaturePlaceholderData signaturePlaceholderData = SignatureFieldsAndPlaceHolderExtractor.getNextUnusedSignaturePlaceHolder(pddocument); - - if (null != signaturePlaceholderData) { - - // create a dialog with ok and cancel buttons and a question icon - MessageBox dialog = new MessageBox(getStateMachine().getMainShell(), - SWT.ICON_QUESTION | SWT.YES | SWT.NO | SWT.CANCEL); - SWTUtils.setLocalizedText(dialog, "dataSourceSelection.usePlaceholderTitle"); - dialog.setMessage(Messages.getString("dataSourceSelection.usePlaceholderText")); - - // open dialog and await user selection - int result = dialog.open(); - if (result == SWT.YES) { - - // if the user chooses to use the signature placeholder - // - fill the position information so that we skip to - // the - // next stages without breaking stuff - status.signaturePosition = new SignaturePosition( - signaturePlaceholderData.getTablePos().getPosX(), - signaturePlaceholderData.getTablePos().getPosY(), - signaturePlaceholderData.getTablePos().getPage()); - - getStateMachine().status.searchForPlacehoderSignature = true; - - } else if (result == SWT.NO) { - getStateMachine().status.searchForPlacehoderSignature = false; - } else { - status.document = null; - return; - } - // TODO: why does this use a different logic (via PositioningState) than the signature placeholders? - } - - } else { - // Do nothing - } - - } catch (IOException e) { - // fail silently. In case we got here no dialog has been shown. - // Just - // proceed with the usual process. - } - } - - this.setNextState(new PositioningState(getStateMachine())); - } - - /** - * The selected placeholder is added to the configuration file - * @param selection - */ - private void addPlaceholderSelectionToConfig(String selection) { - try { - PropertiesConfiguration config = new PropertiesConfiguration(); - PropertiesConfigurationLayout layout = new PropertiesConfigurationLayout(config); - layout.load(new InputStreamReader(new FileInputStream(advancedConfig))); - - config.setProperty(Constants.SIGNATURE_FIELD_NAME_CONF, selection); - layout.save(new FileWriter(advancedConfig, false)); - - } catch (Exception e) { - log.error("Failed to add placeholder selection to config", e); - } - - } - - /** - * Open the input document selection dialog - */ - public void openFileDialog() { - if (this.selectionComposite != null) - this.selectionComposite.openFileDialog(); - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() - */ - @Override - public void cleanUp() { - if (this.selectionComposite != null) - this.selectionComposite.dispose(); - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() - */ - @Override - public void updateMainWindowBehavior() { - MainWindowBehavior behavior = getStateMachine().status.behavior; - behavior.reset(); - behavior.setEnabled(Buttons.CONFIG, true); - behavior.setEnabled(Buttons.OPEN, true); - behavior.setActive(Buttons.OPEN, true); - } - - @Override - public String toString() { - return this.getClass().getName(); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OutputState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OutputState.java deleted file mode 100644 index 308b7d5a..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OutputState.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.workflow.states; - -//Imports -import java.io.File; - -import org.eclipse.swt.SWT; - -import at.asit.pdfover.gui.MainWindow.Buttons; -import at.asit.pdfover.gui.MainWindowBehavior; -import at.asit.pdfover.gui.composites.OutputComposite; -import at.asit.pdfover.gui.controls.ErrorDialog; -import at.asit.pdfover.gui.controls.Dialog.BUTTONS; -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.workflow.StateMachine; -import at.asit.pdfover.gui.workflow.Status; -import at.asit.pdfover.gui.workflow.config.ConfigurationManager; - -/** - * Produces the output of the signature process. (save file, open file) - */ -public class OutputState extends State { - - private OutputComposite outputComposite = null; - - /** - * @param stateMachine - */ - public OutputState(StateMachine stateMachine) { - super(stateMachine); - } - - private OutputComposite getOutputComposite() { - if (this.outputComposite == null) { - this.outputComposite = getStateMachine() - .createComposite(OutputComposite.class, SWT.RESIZE, this); - - ConfigurationManager config = getStateMachine().configProvider; - Status status = getStateMachine().status; - - File tmpDir = new File(Constants.CONFIG_DIRECTORY + File.separator + "tmp"); - - if(!tmpDir.exists()) { - tmpDir.mkdir(); - } - - this.outputComposite.setOutputDir(config.getDefaultOutputFolder()); - this.outputComposite.setSaveFilePostFix(config.getSaveFilePostFix()); - this.outputComposite.setTempDir(tmpDir.getAbsolutePath()); - this.outputComposite.setInputFile(status.document); - - this.outputComposite.setSignedDocument(status.signResult.getSignedDocument()); - - // Save signed document - this.outputComposite.saveDocument(); - - if (config.getSkipFinish() && this.outputComposite.getSaveSuccessful()) { - getStateMachine().exit(); - } - } - - return this.outputComposite; - } - - @Override - public void run() { - Status status = getStateMachine().status; - - if (status.signResult == null) { - ErrorDialog error = new ErrorDialog(getStateMachine().getMainShell(), - Messages.getString("error.Signatur"), BUTTONS.RETRY_CANCEL); - if(error.open() == SWT.RETRY) { - this.setNextState(new PrepareSigningState(getStateMachine())); - } else { - this.setNextState(new BKUSelectionState(getStateMachine())); - } - return; - } - - OutputComposite outputComposite = this.getOutputComposite(); - - // Display dialog - getStateMachine().display(outputComposite); - } - - /* - * (non-Javadoc) - * - * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() - */ - @Override - public void cleanUp() { - - getStateMachine().status.signResult = null; - - if (this.outputComposite != null) - this.outputComposite.dispose(); - } - - /* - * (non-Javadoc) - * - * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() - */ - @Override - public void updateMainWindowBehavior() { - MainWindowBehavior behavior = getStateMachine().status.behavior; - behavior.reset(); - behavior.setEnabled(Buttons.CONFIG, true); - behavior.setEnabled(Buttons.OPEN, true); - behavior.setEnabled(Buttons.POSITION, true); - behavior.setEnabled(Buttons.SIGN, true); - behavior.setActive(Buttons.OPEN, true); - behavior.setActive(Buttons.POSITION, true); - behavior.setActive(Buttons.SIGN, true); - behavior.setActive(Buttons.FINAL, true); - } - - @Override - public String toString() { - return this.getClass().getName(); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PositioningState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PositioningState.java deleted file mode 100644 index b56fb6d7..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PositioningState.java +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.workflow.states; - -//Imports -import java.io.File; -import java.io.IOException; - -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException; -import org.eclipse.swt.SWT; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.MainWindow.Buttons; -import at.asit.pdfover.gui.MainWindowBehavior; -import at.asit.pdfover.gui.composites.PositioningComposite; -import at.asit.pdfover.gui.controls.Dialog.BUTTONS; -import at.asit.pdfover.gui.controls.ErrorDialog; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.workflow.StateMachine; -import at.asit.pdfover.gui.workflow.Status; -import at.asit.pdfover.gui.workflow.config.ConfigurationManager; -import at.asit.pdfover.signer.Emblem; -import at.asit.pdfover.signer.SignaturePosition; -import at.asit.pdfover.signer.pdfas.PdfAs4SignatureParameter; -import at.asit.pdfover.signer.pdfas.PdfAs4SignaturePlaceholder; - -/** - * Decides where to position the signature block - */ -public class PositioningState extends State { - - /** - * @param stateMachine - */ - public PositioningState(StateMachine stateMachine) { - super(stateMachine); - } - - /** - * SLF4J Logger instance - **/ - private static final Logger log = LoggerFactory.getLogger(PositioningState.class); - - private PositioningComposite positionComposite = null; - - private SignaturePosition previousPosition = null; - - - private File loadedDocumentPath = null; - private PDDocument document = null; - - private void closePDFDocument() { - - if (this.document != null) - { - try { this.document.close(); } catch (IOException e) { log.warn("Failed to close PDF", e); } - this.document = null; - } - this.loadedDocumentPath = null; - } - - private void openPDFDocument() throws IOException { - closePDFDocument(); - File documentPath = getStateMachine().status.document; - PDDocument pdf = null; - try - { - pdf = PDDocument.load(documentPath); - if (pdf.getNumberOfPages() > 0) - pdf.getPage(0); - else - throw new IOException(); - } - catch (InvalidPasswordException e) { - throw new IOException(Messages.getString("error.PDFPwdProtected"), e); - } - catch (IOException e) { - throw new IOException(Messages.getString("error.MayNotBeAPDF"), e); - } - this.document = pdf; - this.loadedDocumentPath = documentPath; - } - - private PositioningComposite getPositioningComposite(PDDocument document) { - StateMachine stateMachine = getStateMachine(); - if (this.positionComposite == null) { - this.positionComposite = - stateMachine.createComposite(PositioningComposite.class, SWT.RESIZE, this); - log.debug("Displaying " + stateMachine.status.document); - this.positionComposite.displayDocument(document); - } - - ConfigurationManager config = stateMachine.configProvider; - - PdfAs4SignatureParameter param = new PdfAs4SignatureParameter(); - param.signatureProfile = config.getSignatureProfile(); - - String emblemPath = config.getDefaultEmblemPath(); - if (emblemPath != null && !emblemPath.trim().isEmpty()) - param.emblem = new Emblem(emblemPath); - if (config.getSignatureNote() != null && !config.getSignatureNote().isEmpty()) - param.signatureNote = config.getSignatureNote(); - - param.signatureLanguage = config.getSignatureLocale().getLanguage(); - param.enablePDFACompat = config.getSignaturePdfACompat(); - param.targetLogoSize = Math.min(120.0, config.getLogoOnlyTargetSize()); // TODO WORKAROUND FOR #117 - - PdfAs4SignaturePlaceholder.For(param, (p) -> { - if (p.hasImage()) - this.positionComposite.setPlaceholder(p.getAWTImage()); - }); - - if (this.previousPosition != null && !this.previousPosition.useAutoPositioning()) - { - this.positionComposite.setPosition( - this.previousPosition.getX(), - this.previousPosition.getY(), - this.previousPosition.getPage()); - } - - return this.positionComposite; - } - - @Override - public void run() { - Status status = getStateMachine().status; - if (!(status.getPreviousState() instanceof PositioningState) && - !(status.getPreviousState() instanceof OpenState)) - { - this.previousPosition = status.signaturePosition; - status.signaturePosition = null; - } - - if ((this.document == null) || - (this.loadedDocumentPath != getStateMachine().status.document)) { - log.debug("Checking PDF document for encryption"); - try { - openPDFDocument(); - } catch (IOException e) { - this.positionComposite = null; - log.error("Failed to display PDF document", e); - String message = e.getLocalizedMessage(); - if (message == null) - message = Messages.getString("error.IOError"); - ErrorDialog dialog = new ErrorDialog( - getStateMachine().getMainShell(), - message, BUTTONS.RETRY_CANCEL); - if(dialog.open() == SWT.RETRY) { - run(); - } else { - setNextState(new OpenState(getStateMachine())); - } - return; - } - } - - if (status.signaturePosition == null) { - PositioningComposite position = null; - try { - position = this.getPositioningComposite(this.document); - } catch(Exception ex) { - log.error("Failed to create composite (probably a mac...)", ex); - ErrorDialog dialog = new ErrorDialog( - getStateMachine().getMainShell(), - Messages.getString("error.PositioningNotPossible"), BUTTONS.OK); - dialog.open(); - status.signaturePosition = new SignaturePosition(); - this.setNextState(new BKUSelectionState(getStateMachine())); - return; - } - - getStateMachine().display(position); - - status.signaturePosition = position.getPosition(); - - if(status.signaturePosition != null) { - this.setNextState(new BKUSelectionState(getStateMachine())); - } - - this.positionComposite.requestFocus(); - } else { - this.setNextState(new BKUSelectionState(getStateMachine())); - } - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() - */ - @Override - public void cleanUp() { - if (this.positionComposite != null) - this.positionComposite.dispose(); - closePDFDocument(); - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() - */ - @Override - public void updateMainWindowBehavior() { - MainWindowBehavior behavior = getStateMachine().status.behavior; - behavior.reset(); - behavior.setEnabled(Buttons.CONFIG, true); - behavior.setEnabled(Buttons.OPEN, true); - behavior.setActive(Buttons.OPEN, true); - behavior.setActive(Buttons.POSITION, true); - } - - @Override - public String toString() { - return this.getClass().getName(); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareConfigurationState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareConfigurationState.java deleted file mode 100644 index 87693c19..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareConfigurationState.java +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.workflow.states; - -//Imports -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; - - -import org.eclipse.swt.SWT; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.commons.Constants; -import at.asit.pdfover.gui.cliarguments.*; -import at.asit.pdfover.gui.controls.Dialog.BUTTONS; -import at.asit.pdfover.gui.controls.ErrorDialog; -import at.asit.pdfover.gui.exceptions.InitializationException; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.utils.UpdateCheckManager; -import at.asit.pdfover.gui.utils.VersionComparator; -import at.asit.pdfover.gui.utils.Zipper; -import at.asit.pdfover.gui.workflow.StateMachine; -import at.asit.pdfover.gui.workflow.Status; -import at.asit.pdfover.gui.workflow.config.ConfigurationManager; -import at.asit.pdfover.signer.SignaturePosition; - -/** - * Starting state of workflow proccess - * - * Reads configuration, command arguments and initializes configured variables - */ -public class PrepareConfigurationState extends State { - - /** SLF4J Logger instance **/ - static final Logger log = LoggerFactory.getLogger(PrepareConfigurationState.class); - - private ArgumentHandler handler; - - private ArgumentHandler configFileHandler; - - /** - * @param stateMachine - */ - public PrepareConfigurationState(StateMachine stateMachine) { - super(stateMachine); - this.handler = new ArgumentHandler(getStateMachine()); - this.handler.addCLIArgument(HelpArgument.class); - this.handler.addCLIArgument(InputDocumentArgument.class); - this.handler.addCLIArgument(OutputFolderArgument.class); - this.handler.addCLIArgument(BKUArgument.class); - this.handler.addCLIArgument(PhoneNumberArgument.class); - this.handler.addCLIArgument(PasswordArgument.class); - this.handler.addCLIArgument(KeystoreFileArgument.class); - this.handler.addCLIArgument(KeystoreTypeArgument.class); - this.handler.addCLIArgument(KeystoreStorePassArgument.class); - this.handler.addCLIArgument(KeystoreAliasArgument.class); - this.handler.addCLIArgument(KeystoreKeyPassArgument.class); - this.handler.addCLIArgument(ProxyHostArgument.class); - this.handler.addCLIArgument(ProxyPortArgument.class); - this.handler.addCLIArgument(ProxyUserArgument.class); - this.handler.addCLIArgument(ProxyPassArgument.class); - this.handler.addCLIArgument(EmblemArgument.class); - this.handler.addCLIArgument(AutomaticPositioningArgument.class); - this.handler.addCLIArgument(SkipFinishArgument.class); - // adding config file argument to this handler so it appears in help - this.handler.addCLIArgument(ConfigFileArgument.class); - this.handler.addCLIArgument(InvisibleProfile.class); - - this.configFileHandler = new ArgumentHandler(getStateMachine()); - this.configFileHandler.addCLIArgument(ConfigFileArgument.class); - } - - private void initializeFromConfigurationFile() throws InitializationException { - try { - getStateMachine().configProvider.loadFromDisk(); - } catch (IOException ex) { - throw new InitializationException("Failed to read configuration from config file", ex); - } - } - - private void initializeFromArguments(String[] args, ArgumentHandler handler) throws InitializationException { - handler.handleArguments(args); - - if (handler.doesRequireExit()) { - getStateMachine().exit(); - } - } - - private void ensurePdfOverConfigExists() throws InitializationException { - try { - File pdfOverConfig = new File(Constants.CONFIG_DIRECTORY + File.separator + Constants.DEFAULT_CONFIG_FILENAME); - if (!pdfOverConfig.exists()) - pdfOverConfig.createNewFile(); - } catch (Exception e) { - log.error("Failed to create PDF-Over config file", e); - throw new InitializationException("Failed to create PDF-Over config file", e); - } - } - - private void unzipPdfAsConfig(File configDir) throws InitializationException { - InputStream is = getClass().getResourceAsStream(Constants.RES_CFG_ZIP); - - try { - Zipper.unzip(is, configDir.getAbsolutePath()); - } catch (IOException e) { - log.error( - "Failed to create local configuration directory!", e); - throw new InitializationException( - "Failed to create local configuration directory!", - e); - } - } - - private static void updateVersionFile(File configDir) throws InitializationException { - File versionFile = new File(configDir, Constants.CONFIG_VERSION_FILENAME); - try { - BufferedWriter versionWriter = new BufferedWriter(new FileWriter(versionFile)); - String version = Constants.APP_VERSION == null ? "Unknown" : Constants.APP_VERSION; - versionWriter.write(version); - versionWriter.close(); - } catch (IOException e) { - log.error( - "Failed to create configuration version file!", e); - throw new InitializationException( - "Failed to create configuration version file!", - e); - } - } - - private void createConfiguration(File configDir) throws InitializationException { - boolean allOK = false; - - log.info("Creating configuration directory"); - if (!configDir.exists()) { - configDir.mkdir(); - } - - try { - ensurePdfOverConfigExists(); - unzipPdfAsConfig(configDir); - updateVersionFile(configDir); - - allOK = true; - } finally { - if (!allOK) { - configDir.delete(); - } - } - } - - /** - * @return The first valid (not empty, non comment) line of the version file - * or null if version file cannot be read or does not contain - * such a line. - */ - private static String getVersion(File versionFile) { - if (versionFile.exists() && versionFile.canRead()) { - BufferedReader versionReader = null; - try { - versionReader = new BufferedReader(new FileReader(versionFile)); - String version; - while ((version = versionReader.readLine()) != null) { - version = version.trim(); - if (version.length() > 0 && !version.startsWith("#")) { - log.trace("configuration version from " + versionFile - + ": " + version); - return version; - } - } - } catch (IOException ex) { - log.error("failed to read configuration version from " - + versionFile, ex); - } finally { - try { - if (versionReader != null) - versionReader.close(); - } catch (IOException ex) { - // ignore - } - } - } - log.debug("unknown configuration version"); - return null; - } - - /** - * Backup old configuration, create new - * @param configDir - * @throws InitializationException - */ - private void backupAndCreatePdfAsConfiguration(File configDir) throws InitializationException { - try { - File backup = File.createTempFile(Constants.PDF_AS_CONFIG_BACKUP_FILENAME, ".zip"); - OutputStream os = new FileOutputStream(backup); - Zipper.zip(configDir + File.separator + "cfg", os, true); - os.close(); - unzipPdfAsConfig(configDir); - File b = new File(configDir, Constants.PDF_AS_CONFIG_BACKUP_FILENAME + ".zip"); - int i = 1; - while (b.exists()) { - b = new File(configDir, Constants.PDF_AS_CONFIG_BACKUP_FILENAME + i++ + ".zip"); - } - backup.renameTo(b); - updateVersionFile(configDir); - } catch (FileNotFoundException e) { - log.error("Backup file not found", e); - throw new InitializationException("Backup file not found", e); - } catch (IOException e) { - log.error("Error creating configuration backup", e); - throw new InitializationException("Error creating configuration backup", e); - } - } - - @Override - public void run() { - // Read config file - try { - StateMachine stateMachine = getStateMachine(); - ConfigurationManager config = stateMachine.configProvider; - File configDir = new File(Constants.CONFIG_DIRECTORY); - File configFile = new File(configDir, Constants.DEFAULT_CONFIG_FILENAME); - if (!configDir.exists() || !configFile.exists()) { - log.debug("Creating configuration file"); - createConfiguration(configDir); - } else { - log.debug("Configuration directory exists!"); - // Check PDF-AS config version - File versionFile = new File(configDir, Constants.CONFIG_VERSION_FILENAME); - String configVersion = getVersion(versionFile); - if (configVersion == null || VersionComparator.before(configVersion, Constants.MIN_PDF_AS_CONFIG_VERSION)) - backupAndCreatePdfAsConfiguration(configDir); - } - - - // Read cli arguments for config file location first - try { - initializeFromArguments(stateMachine.cmdLineArgs, this.configFileHandler); - } catch (InitializationException e) { - log.error("Error in cmd line arguments: ", e); - ErrorDialog error = new ErrorDialog(stateMachine.getMainShell(), - Messages.getString("error.CmdLineArgs") + "\n" + - e.getMessage(), - BUTTONS.OK); - error.open(); - stateMachine.exit(); - } - - // initialize from config file - initializeFromConfigurationFile(); - - // Read cli arguments - try { - initializeFromArguments(stateMachine.cmdLineArgs, this.handler); - } catch (InitializationException e) { - log.error("Error in cmd line arguments: ", e); - ErrorDialog error; - - if (e.getCause() instanceof FileNotFoundException) { - error = new ErrorDialog(stateMachine.getMainShell(), - String.format( - Messages.getString("error.FileNotExist"), - e.getCause().getMessage()), - BUTTONS.OK); - } else { - error = new ErrorDialog(stateMachine.getMainShell(), - Messages.getString("error.CmdLineArgs") + "\n" + - e.getMessage(), - BUTTONS.OK); - } - error.open(); - stateMachine.exit(); - } - - // Check for updates - if (config.getUpdateCheck()) - UpdateCheckManager.checkNow(stateMachine.getMainShell()); - - // Create PDF Signer - Status status = stateMachine.status; - status.bku = getStateMachine().configProvider.getDefaultBKU(); - status.signaturePosition = getStateMachine().configProvider.getAutoPositionSignature() ? (new SignaturePosition()) : null; - - setNextState(new OpenState(stateMachine)); - - } catch (Exception e) { - log.error("Failed to initialize: ", e); - ErrorDialog error = new ErrorDialog( - getStateMachine().getMainShell(), - Messages.getString("error.Initialization"), - BUTTONS.YES_NO - ); - // error.setException(e); - // setNextState(error); - int selection = error.open(); - if (selection == SWT.YES) - ConfigurationManager.factoryResetPersistentConfig(); - - getStateMachine().exit(); - } - } - - /* - * (non-Javadoc) - * - * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() - */ - @Override - public void cleanUp() { - // No composite - no cleanup necessary - } - - /* - * (non-Javadoc) - * - * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() - */ - @Override - public void updateMainWindowBehavior() { - // no behavior necessary yet - } - - @Override - public String toString() { - return getClass().getName(); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareSigningState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareSigningState.java deleted file mode 100644 index 1669f2f8..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareSigningState.java +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.workflow.states; - -//Imports -import java.net.Authenticator; -import java.net.PasswordAuthentication; - -import org.eclipse.swt.SWT; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.MainWindow.Buttons; -import at.asit.pdfover.gui.MainWindowBehavior; -import at.asit.pdfover.gui.composites.WaitingComposite; -import at.asit.pdfover.gui.controls.Dialog.BUTTONS; -import at.asit.pdfover.gui.controls.ErrorDialog; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.workflow.StateMachine; -import at.asit.pdfover.gui.workflow.Status; -import at.asit.pdfover.gui.workflow.config.ConfigurationManager; -import at.asit.pdfover.signer.Emblem; -import at.asit.pdfover.signer.PDFFileDocumentSource; -import at.asit.pdfover.signer.pdfas.PdfAs4SignatureParameter; -import at.asit.pdfover.signer.pdfas.PdfAs4Signer; -import at.asit.pdfover.signer.pdfas.PdfAs4SigningState; - -/** - * User waiting state, wait for PDF Signator library to prepare document for - * signing. - */ -public class PrepareSigningState extends State { - - /** - * @param stateMachine - */ - public PrepareSigningState(StateMachine stateMachine) { - super(stateMachine); - } - - private final class PrepareDocumentThread implements Runnable { - - private PrepareSigningState state; - - /** - * Default constructor - * - * @param state - */ - public PrepareDocumentThread(PrepareSigningState state) { - this.state = state; - } - - @Override - public void run() { - try { - - Status status = this.state.getStateMachine().status; - - ConfigurationManager configuration = this.state.getStateMachine().configProvider; - - // SET PROXY HOST and PORT settings - final String proxyHost = configuration.getProxyHost(); - final int proxyPort = configuration.getProxyPort(); - final String proxyUser = configuration.getProxyUser(); - final String proxyPass = configuration.getProxyPass(); - - if (proxyHost != null && !proxyHost.isEmpty()) { - log.debug("Setting proxy host to " + proxyHost); - System.setProperty("http.proxyHost", proxyHost); - System.setProperty("https.proxyHost", proxyHost); - } - - if (proxyPort > 0 && proxyPort <= 0xFFFF) { - String port = Integer.toString(proxyPort); - log.debug("Setting proxy port to " + port); - System.setProperty("http.proxyPort", port); - System.setProperty("https.proxyPort", port); - } - - if (proxyUser != null && !proxyUser.isEmpty()) { - log.debug("Setting proxy username to " + proxyUser); - System.setProperty("http.proxyUser", proxyUser); - System.setProperty("https.proxyUser", proxyUser); - } - - if (proxyPass != null) { - log.debug("Setting proxy password"); - System.setProperty("http.proxyPassword", proxyPass); - System.setProperty("https.proxyPassword", proxyPass); - } - - if (proxyUser != null && !proxyUser.isEmpty() && - proxyPass != null && !proxyPass.isEmpty()) { - log.debug("Enabling proxy authentication"); - Authenticator.setDefault(new Authenticator() { - /* (non-Javadoc) - * @see java.net.Authenticator#getPasswordAuthentication() - */ - @Override - protected PasswordAuthentication getPasswordAuthentication() { - if (getRequestorType() == RequestorType.PROXY) { - if (getRequestingHost().equalsIgnoreCase(proxyHost) && - (getRequestingPort() == proxyPort)) { - return new PasswordAuthentication(proxyUser, - proxyPass.toCharArray()); - } - } - return super.getPasswordAuthentication(); - } - }); - } - - if (this.state.signatureParameter == null) { - this.state.signatureParameter = new PdfAs4SignatureParameter(); - } - - this.state.signatureParameter.inputDocument = new PDFFileDocumentSource(status.document); - this.state.signatureParameter.signatureDevice = status.bku; - if (status.signaturePosition != null) { - this.state.signatureParameter.signaturePosition = status.signaturePosition; - } - - if (configuration.getDefaultEmblemPath() != null && !configuration.getDefaultEmblemPath().isEmpty()) { - this.state.signatureParameter.emblem = new Emblem(configuration.getDefaultEmblemPath()); - } - - if (configuration.getSignatureNote() != null && !configuration.getSignatureNote().isEmpty()) { - this.state.signatureParameter.signatureNote = configuration.getSignatureNote(); - } - - this.state.signatureParameter.searchForPlaceholderSignatures = getStateMachine().status.searchForPlacehoderSignature; - this.state.signatureParameter.signatureLanguage = configuration.getSignatureLocale().getLanguage(); - this.state.signatureParameter.enablePDFACompat = configuration.getSignaturePdfACompat(); - this.state.signatureParameter.signatureProfile = configuration.getSignatureProfile(); - this.state.signatureParameter.targetLogoSize = configuration.getLogoOnlyTargetSize(); - - this.state.signingState = PdfAs4Signer.prepare(this.state.signatureParameter); - - } catch (Exception e) { - log.error("PrepareDocumentThread: ", e); - this.state.threadException = e; - } finally { - this.state.updateStateMachine(); - } - } - } - - /** - * SLF4J Logger instance - **/ - static final Logger log = LoggerFactory.getLogger(PrepareSigningState.class); - - PdfAs4SignatureParameter signatureParameter; - - private WaitingComposite waitingComposite = null; - - private WaitingComposite getSelectionComposite() { - if (this.waitingComposite == null) { - this.waitingComposite = getStateMachine() - .createComposite(WaitingComposite.class, SWT.RESIZE, this); - } - - return this.waitingComposite; - } - - PdfAs4SigningState signingState = null; - - Exception threadException = null; - - @Override - public void run() { - WaitingComposite waiting = this.getSelectionComposite(); - - getStateMachine().display(waiting); - - Status status = getStateMachine().status; - - if (this.signatureParameter == null) { - this.signatureParameter = new PdfAs4SignatureParameter(); - } - - if (this.signingState == null && this.threadException == null) { - Thread t = new Thread(new PrepareDocumentThread(this)); - t.start(); - return; - } - - if (this.threadException != null) { - ErrorDialog error = new ErrorDialog(getStateMachine() - .getMainShell(), - Messages.getString("error.PrepareDocument"), - BUTTONS.RETRY_CANCEL); - this.threadException = null; - if (error.open() == SWT.RETRY) { - run(); - } else { - this.setNextState(new BKUSelectionState(getStateMachine())); - } - return; - } - - // We got the Request set it into status and move on to next state ... - status.signingState = this.signingState; - - switch (status.bku) - { - case LOCAL: - this.setNextState(new LocalBKUState(getStateMachine())); - break; - case MOBILE: - this.setNextState(new MobileBKUState(getStateMachine())); - break; - case KS: - this.setNextState(new KSState(getStateMachine())); - break; - default: - log.error("Invalid selected BKU Value \"{}\" in PrepareSigningState!", status.bku.name()); - this.setNextState(new BKUSelectionState(getStateMachine())); - } - } - - /* - * (non-Javadoc) - * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() - */ - @Override - public void cleanUp() { - if (this.waitingComposite != null) - this.waitingComposite.dispose(); - } - - /* - * (non-Javadoc) - * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() - */ - @Override - public void updateMainWindowBehavior() { - MainWindowBehavior behavior = getStateMachine().status.behavior; - behavior.reset(); - behavior.setActive(Buttons.OPEN, true); - behavior.setActive(Buttons.POSITION, true); - behavior.setActive(Buttons.SIGN, true); - } - - @Override - public String toString() { - return this.getClass().getName(); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/SigningState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/SigningState.java deleted file mode 100644 index cf4d6d37..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/SigningState.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.workflow.states; - -//Imports -import java.net.ConnectException; - -import org.eclipse.swt.SWT; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import at.asit.pdfover.gui.MainWindowBehavior; -import at.asit.pdfover.gui.MainWindow.Buttons; -import at.asit.pdfover.gui.controls.Dialog.BUTTONS; -import at.asit.pdfover.gui.controls.ErrorDialog; -import at.asit.pdfover.commons.Messages; -import at.asit.pdfover.gui.workflow.StateMachine; -import at.asit.pdfover.gui.workflow.Status; -import at.asit.pdfover.signer.SignatureException; -import at.asit.pdfover.signer.UserCancelledException; -import at.asit.pdfover.signer.pdfas.PdfAs4Signer; - -/** - * Logical state for signing process, usually show BKU Dialog during this state. - */ -public class SigningState extends State { - - /** - * - */ - private final class FinishSignThread implements Runnable { - - private SigningState state; - - /** - * @param signingState - */ - public FinishSignThread(SigningState signingState) { - this.state = signingState; - } - - @Override - public void run() { - try { - Status status = this.state.getStateMachine().status; - status.signResult = PdfAs4Signer.sign(status.signingState); - } catch(Exception e) { - this.state.threadException = e; - } finally { - this.state.updateStateMachine(); - } - } - } - - /** - * @param stateMachine - */ - public SigningState(StateMachine stateMachine) { - super(stateMachine); - } - - /** - * SLF4J Logger instance - **/ - static final Logger log = LoggerFactory.getLogger(SigningState.class); - - Exception threadException = null; - - @Override - public void run() { - Status status = getStateMachine().status; - - if(status.signResult == null && - this.threadException == null) { - Thread t = new Thread(new FinishSignThread(this)); - t.start(); - return; - } - - if(this.threadException != null) { - String message = Messages.getString("error.Signatur"); - if (this.threadException instanceof SignatureException) { - Throwable cause = this.threadException; - while (cause.getCause() != null) - cause = cause.getCause(); - if (cause instanceof ConnectException) - message += ": " + cause.getMessage(); - if (cause instanceof IllegalStateException) { - // TODO legacy hack - this.threadException = new UserCancelledException(); - } - } - if (this.threadException instanceof UserCancelledException) { - // don't display error, clear remembered password and go back to BKU Selection - if (this.getConfig().getRememberMobilePassword()) - this.getConfig().setDefaultMobilePasswordOverlay(null); - this.setNextState(new BKUSelectionState(getStateMachine())); - return; - } - - // if we have gotten to this point, this is an actual exception - log.error("FinishSignThread: ", this.threadException); - - ErrorDialog error = new ErrorDialog(getStateMachine().getMainShell(), - message, BUTTONS.RETRY_CANCEL); - this.threadException = null; - if(error.open() == SWT.RETRY) { - this.setNextState(new PrepareSigningState(getStateMachine())); - } else { - this.setNextState(new BKUSelectionState(getStateMachine())); - } - return; - } - - this.setNextState(new OutputState(getStateMachine())); - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.workflow.states.State#cleanUp() - */ - @Override - public void cleanUp() { - // No composite - no cleanup necessary - } - - /* (non-Javadoc) - * @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior() - */ - @Override - public void updateMainWindowBehavior() { - MainWindowBehavior behavior = getStateMachine().status.behavior; - behavior.reset(); - behavior.setActive(Buttons.OPEN, true); - behavior.setActive(Buttons.POSITION, true); - behavior.setActive(Buttons.SIGN, true); - //behavior.setEnabled(Buttons.OPEN, true); - //behavior.setEnabled(Buttons.POSITION, true); - //behavior.setEnabled(Buttons.SIGN, true); - } - - @Override - public String toString() { - return this.getClass().getName(); - } -} diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/State.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/State.java deleted file mode 100644 index c039f21a..00000000 --- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/State.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright 2012 by A-SIT, Secure Information Technology Center Austria - * - * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by - * the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * You may obtain a copy of the Licence at: - * http://joinup.ec.europa.eu/software/page/eupl - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and - * limitations under the Licence. - */ -package at.asit.pdfover.gui.workflow.states; - -//Imports -import at.asit.pdfover.gui.workflow.StateMachine; -import at.asit.pdfover.gui.workflow.config.ConfigurationManager; - -/** - * Base state class - */ -public abstract class State { - - /** - * The StateMachine - */ - private StateMachine stateMachine; - - private State nextState = null; - - /** - * Default Workflow State constructor - * @param stateMachine the State Machine - */ - public State(StateMachine stateMachine) { - this.stateMachine = stateMachine; - this.nextState = this; - } - - public ConfigurationManager getConfig() { return this.stateMachine.configProvider; } - - /** - * Gets the next logical state or null if this their is no state transition - * @return the next state (or null) - */ - public State nextState() { - return this.nextState; - } - - /** - * Sets the next logical state - * @param state - */ - protected void setNextState(State state) { - this.nextState = state; - } - - /** - * Perform main logic for this state - */ - public abstract void run(); - - /** - * Perform status cleanup - */ - public abstract void cleanUp(); - - /** - * Update the state machine - */ - public void updateStateMachine() - { - this.stateMachine.invokeUpdate(); - } - - /** - * Get the state machine - * @return the StateMachine - */ - protected StateMachine getStateMachine() - { - return this.stateMachine; - } - - /** - * Update the main window behavior of this state if necessary - * Should update this.stateMachine.status.getBehavior() - */ - public abstract void updateMainWindowBehavior(); -} |