summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortkellner <tkellner@174cde9d-5d70-4d2a-aa98-46368bc2aaf7>2013-04-10 18:53:41 +0000
committertkellner <tkellner@174cde9d-5d70-4d2a-aa98-46368bc2aaf7>2013-04-10 18:53:41 +0000
commit23ae1caefcf0cc99c2b90327afaff6376ecc552a (patch)
tree644167228a6b721760b1f024b3ddd94ede77c14e
parent7d6879d2f2ad32b79878567438bdb231cbc798d5 (diff)
downloadpdf-over-23ae1caefcf0cc99c2b90327afaff6376ecc552a.tar.gz
pdf-over-23ae1caefcf0cc99c2b90327afaff6376ecc552a.tar.bz2
pdf-over-23ae1caefcf0cc99c2b90327afaff6376ecc552a.zip
PDF-AS signature working with local BKU
git-svn-id: https://joinup.ec.europa.eu/svn/pdf-over/trunk@26 174cde9d-5d70-4d2a-aa98-46368bc2aaf7
-rw-r--r--pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/BKUSelectionComposite.java8
-rw-r--r--pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/ErrorComposite.java123
-rw-r--r--pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/OutputComposite.java221
-rw-r--r--pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StateMachineImpl.java15
-rw-r--r--pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/Status.java26
-rw-r--r--pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StatusImpl.java43
-rw-r--r--pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/ErrorState.java116
-rw-r--r--pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/LocalBKUState.java155
-rw-r--r--pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/OutputState.java40
-rw-r--r--pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/PrepareSigningState.java83
-rw-r--r--pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/SigningState.java55
-rw-r--r--pdf-over-gui/src/main/resources/log4j.properties14
-rw-r--r--pdf-over-signator/src/main/java/at/asit/pdfover/signator/DocumentSource.java4
-rw-r--r--pdf-over-signator/src/main/java/at/asit/pdfover/signator/PDFFileDocumentSource.java90
-rw-r--r--pdf-over-signator/src/main/java/at/asit/pdfover/signator/SLRequest.java15
-rw-r--r--pdf-over-signator/src/main/java/at/asit/pdfover/signator/SLResponse.java37
-rw-r--r--pdf-over-signator/src/main/java/at/asit/pdfover/signator/SigningState.java10
-rw-r--r--pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASHelper.java4
-rw-r--r--pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSLRequest.java27
-rw-r--r--pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigner.java29
-rw-r--r--pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigningState.java29
-rw-r--r--pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PdfAsSignatureParameter.java2
22 files changed, 1063 insertions, 83 deletions
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
index 24be2c5a..893b0e87 100644
--- 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
@@ -27,8 +27,6 @@ import org.eclipse.swt.widgets.Composite;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import at.asit.pdfover.gui.workflow.StateMachine;
-import at.asit.pdfover.gui.workflow.states.BKUSelectionState;
import at.asit.pdfover.gui.workflow.states.BKUSelectionState.BKUs;
import at.asit.pdfover.gui.workflow.states.State;
@@ -52,7 +50,7 @@ public class BKUSelectionComposite extends StateComposite {
@Override
public void widgetSelected(SelectionEvent e) {
- log.debug("Setting BKU to LOCAL");
+ log.debug("Setting BKU to LOCAL"); //$NON-NLS-1$
setSelected(BKUs.LOCAL);
}
@@ -76,7 +74,7 @@ public class BKUSelectionComposite extends StateComposite {
@Override
public void widgetSelected(SelectionEvent e) {
- log.debug("Setting BKU to MOBILE");
+ log.debug("Setting BKU to MOBILE"); //$NON-NLS-1$
setSelected(BKUs.MOBILE);
}
@@ -89,7 +87,7 @@ public class BKUSelectionComposite extends StateComposite {
/**
* SLF4J Logger instance
**/
- private static final Logger log = LoggerFactory
+ static final Logger log = LoggerFactory
.getLogger(BKUSelectionComposite.class);
private BKUs selected = BKUs.NONE;
diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/ErrorComposite.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/ErrorComposite.java
new file mode 100644
index 00000000..6963c6f6
--- /dev/null
+++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/ErrorComposite.java
@@ -0,0 +1,123 @@
+/*
+ * 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.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+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.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import at.asit.pdfover.gui.workflow.states.State;
+
+/**
+ *
+ */
+public class ErrorComposite extends StateComposite {
+ /**
+ *
+ */
+ private final class OkSelectionListener implements SelectionListener {
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ ErrorComposite.this.userOk = true;
+ ErrorComposite.this.state.updateStateMachine();
+ }
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // Nothing to do
+ }
+ }
+
+ /**
+ * SLF4J Logger instance
+ **/
+ private static final Logger log = LoggerFactory
+ .getLogger(ErrorComposite.class);
+
+ boolean userOk = false;
+
+ /**
+ * Checks if the user has clicked OK
+ * @return
+ */
+ public boolean isUserOk() {
+ return userOk;
+ }
+
+ private Exception exception;
+
+
+ /**
+ * Sets the Exception to present
+ * @param exception the exception
+ */
+ public void setException(Exception exception) {
+ this.exception = exception;
+ }
+
+ /**
+ * Create the composite.
+ * @param parent
+ * @param style
+ */
+ public ErrorComposite(Composite parent, int style, State state) {
+ super(parent, style, state);
+
+ this.setLayout(new FormLayout());
+
+ Label lbl_message = new Label(this, SWT.NATIVE | SWT.RESIZE);
+ FormData fd_lbl_message = new FormData();
+ fd_lbl_message.left = new FormAttachment(10, 0);
+ fd_lbl_message.right = new FormAttachment(90, 0);
+ fd_lbl_message.top = new FormAttachment(40, 0);
+ fd_lbl_message.bottom = new FormAttachment(50, 0);
+ lbl_message.setLayoutData(fd_lbl_message);
+ lbl_message.setText(this.exception.getMessage());
+
+ Button btn_ok = new Button(this, SWT.NATIVE | SWT.RESIZE);
+ btn_ok.setText("OK");
+ // Point mobile_size = btn_mobile.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+ FormData fd_btn_ok = new FormData();
+ fd_btn_ok.left = new FormAttachment(45, 0);
+ fd_btn_ok.right = new FormAttachment(55, 0);
+ fd_btn_ok.top = new FormAttachment(70, 0);
+ fd_btn_ok.bottom = new FormAttachment(75, 0);
+ btn_ok.setLayoutData(fd_btn_ok);
+ btn_ok.addSelectionListener(new OkSelectionListener());
+ }
+
+ @Override
+ protected void checkSubclass() {
+ // Disable the check that prevents subclassing of SWT components
+ }
+
+ /* (non-Javadoc)
+ * @see at.asit.pdfover.gui.composites.StateComposite#doLayout()
+ */
+ @Override
+ public void doLayout() {
+ // TODO Auto-generated method stub
+ }
+
+}
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
new file mode 100644
index 00000000..860cd095
--- /dev/null
+++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/composites/OutputComposite.java
@@ -0,0 +1,221 @@
+/*
+ * 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 org.eclipse.swt.widgets.FileDialog;
+import java.io.File;
+import java.io.FileOutputStream;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+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.Composite;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import at.asit.pdfover.gui.workflow.states.State;
+import at.asit.pdfover.signator.DocumentSource;
+
+/**
+ * GUI component for Output State
+ */
+public class OutputComposite extends StateComposite {
+
+ /**
+ * Selection Listner for save button
+ */
+ private final class SaveSelectionListener implements SelectionListener {
+
+ /**
+ * Default constructor
+ */
+ public SaveSelectionListener() {
+ // Nothing to do
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ FileDialog save = new FileDialog(OutputComposite.this.getShell(), SWT.SAVE | SWT.NATIVE);
+ save.setFilterExtensions(new String[] {"*.pdf"});
+ save.setFilterNames(new String[] {"PDF Dateien"});
+
+ String target = save.open();
+
+ File targetFile = new File(target);
+
+ DocumentSource source = OutputComposite.this
+ .getSignedDocument();
+
+ FileOutputStream outstream = new FileOutputStream(targetFile);
+ outstream.write(source.getByteArray(), 0,
+ source.getByteArray().length);
+ outstream.close();
+
+ OutputComposite.this.savedFile = targetFile;
+
+ } catch (Exception ex) {
+ log.error("SaveSelectionListener: ", ex); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // Nothing todo
+ }
+ }
+
+ /**
+ * Selection Listner for open button
+ */
+ private final class OpenSelectionListener implements SelectionListener {
+
+ /**
+ * Default constructor
+ */
+ public OpenSelectionListener() {
+ // Nothing to do
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ try {
+ DocumentSource source = OutputComposite.this
+ .getSignedDocument();
+
+ if (source != null) {
+ File open = OutputComposite.this.savedFile;
+ if (open == null) {
+ // Save as temp file ...
+ open = new File("tmp_signed.pdf");
+ FileOutputStream outstream = new FileOutputStream(open);
+ outstream.write(source.getByteArray(), 0,
+ source.getByteArray().length);
+ outstream.close();
+ }
+
+ if (open.exists()) {
+ // Desktop supported check allready done in constructor
+ Desktop.getDesktop().open(open);
+ return;
+ }
+ } else {
+ // TODO: Handle exception ...
+ }
+ } catch (Exception ex) {
+ log.error("OpenSelectionListener: ", ex); //$NON-NLS-1$
+ }
+ }
+
+ @Override
+ public void widgetDefaultSelected(SelectionEvent e) {
+ // Nothing todo
+ }
+ }
+
+ /**
+ * SLF4J Logger instance
+ **/
+ private static final Logger log = LoggerFactory
+ .getLogger(OutputComposite.class);
+
+ File savedFile = null;
+
+ private DocumentSource signedDocument;
+
+ /**
+ * 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());
+
+ Button btn_open = new Button(this, SWT.NATIVE | SWT.RESIZE);
+ btn_open.setText("OPEN");
+ // Point mobile_size = btn_mobile.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+ FormData fd_btn_open = new FormData();
+ fd_btn_open.left = new FormAttachment(40, 0);
+ fd_btn_open.right = new FormAttachment(50, 0);
+ fd_btn_open.top = new FormAttachment(45, 0);
+ fd_btn_open.bottom = new FormAttachment(55, 0);
+ btn_open.setLayoutData(fd_btn_open);
+ btn_open.addSelectionListener(new OpenSelectionListener());
+
+ if (!Desktop.isDesktopSupported()) {
+ btn_open.setEnabled(false);
+ }
+
+ Button btn_save = new Button(this, SWT.NATIVE | SWT.RESIZE);
+ btn_save.setText("SAVE");
+ // Point card_size = btn_card.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+ FormData fd_btn_save = new FormData();
+ fd_btn_save.left = new FormAttachment(50, 0);
+ fd_btn_save.right = new FormAttachment(60, 0);
+ fd_btn_save.top = new FormAttachment(45, 0);
+ fd_btn_save.bottom = new FormAttachment(55, 0);
+ btn_save.setLayoutData(fd_btn_save);
+ btn_save.addSelectionListener(new SaveSelectionListener());
+
+ this.pack();
+ }
+
+ /**
+ * 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;
+ }
+
+ @Override
+ protected void checkSubclass() {
+ // Disable the check that prevents subclassing of SWT components
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see at.asit.pdfover.gui.composites.StateComposite#doLayout()
+ */
+ @Override
+ public void doLayout() {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StateMachineImpl.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StateMachineImpl.java
index 5ad800e9..cf764a73 100644
--- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StateMachineImpl.java
+++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StateMachineImpl.java
@@ -80,7 +80,14 @@ public class StateMachineImpl implements StateMachine, GUIProvider {
State next = null;
while (this.status.getCurrentState() != null) {
State current = this.status.getCurrentState();
- current.run();
+ try
+ {
+ current.run();
+ }
+ catch(Exception e) {
+ log.error("StateMachine update: ", e); //$NON-NLS-1$
+ // TODO: GOTO generic error state!
+ }
if (this.mainWindow != null
&& !this.mainWindow.getShell().isDisposed()) {
log.debug("Allowing MainWindow to update its state for " //$NON-NLS-1$
@@ -98,11 +105,13 @@ public class StateMachineImpl implements StateMachine, GUIProvider {
+ next.toString());
this.status.setCurrentState(next);
}
+
+ // TODO: Remove following line when releasing ...
if (this.status.getCurrentState() != null) {
this.setCurrentStateMessage(this.status.getCurrentState()
.toString());
} else {
- this.setCurrentStateMessage("");
+ this.setCurrentStateMessage(""); //$NON-NLS-1$
}
}
@@ -197,7 +206,7 @@ public class StateMachineImpl implements StateMachine, GUIProvider {
composite = constructor.newInstance(getComposite(), style, state);
} catch (Exception e) {
log.error(
- "Could not create Composite for Class "
+ "Could not create Composite for Class " //$NON-NLS-1$
+ compositeClass.getName(), e);
}
return composite;
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
index e0a7b0d4..ba3c210b 100644
--- 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
@@ -20,7 +20,9 @@ import java.io.File;
import at.asit.pdfover.gui.MainWindowBehavior;
import at.asit.pdfover.gui.workflow.states.BKUSelectionState;
import at.asit.pdfover.gui.workflow.states.State;
+import at.asit.pdfover.signator.SignResult;
import at.asit.pdfover.signator.SignaturePosition;
+import at.asit.pdfover.signator.SigningState;
/**
* Interface for persistent status of state machine
@@ -79,4 +81,28 @@ public interface Status {
* @return the previous State
*/
public State getPreviousState();
+
+ /**
+ * Gets the signing state
+ * @return the signing state
+ */
+ public SigningState getSigningState();
+
+ /**
+ * Sets the signing state
+ * @param state the signing state
+ */
+ public void setSigningState(SigningState state);
+
+ /**
+ * Sets the sign result
+ * @param signResult
+ */
+ public void setSignResult(SignResult signResult);
+
+ /**
+ * Gets the sign Result
+ * @return the sign result
+ */
+ public SignResult getSignResult();
}
diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StatusImpl.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StatusImpl.java
index c8d74161..5f0f53b7 100644
--- a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StatusImpl.java
+++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/StatusImpl.java
@@ -24,7 +24,9 @@ import org.slf4j.LoggerFactory;
import at.asit.pdfover.gui.MainWindowBehavior;
import at.asit.pdfover.gui.workflow.states.State;
import at.asit.pdfover.gui.workflow.states.BKUSelectionState.BKUs;
+import at.asit.pdfover.signator.SignResult;
import at.asit.pdfover.signator.SignaturePosition;
+import at.asit.pdfover.signator.SigningState;
/**
*
@@ -33,7 +35,6 @@ public class StatusImpl implements Status {
/**
* SLF4J Logger instance
**/
- @SuppressWarnings("unused")
private static final Logger log = LoggerFactory.getLogger(StatusImpl.class);
private File document = null;
@@ -46,6 +47,10 @@ public class StatusImpl implements Status {
private State previousState = null;
+ private SigningState signingState = null;
+
+ private SignResult signResult = null;
+
private MainWindowBehavior behavior;
@@ -67,12 +72,12 @@ public class StatusImpl implements Status {
*/
public void setCurrentState(State currentState) {
if (this.previousState == this.currentState)
- log.error("Changing to same state? " + this.currentState);
+ log.error("Changing to same state? " + this.currentState); //$NON-NLS-1$
if (this.previousState != null && this.previousState != currentState)
{
//Reference to previous state will be lost - perform cleanup
- log.debug("Cleaning up " + this.previousState);
+ log.debug("Cleaning up " + this.previousState); //$NON-NLS-1$
this.previousState.cleanUp();
}
@@ -143,4 +148,36 @@ public class StatusImpl implements Status {
public MainWindowBehavior getBehavior() {
return this.behavior;
}
+
+ /* (non-Javadoc)
+ * @see at.asit.pdfover.gui.workflow.Status#getSigningState()
+ */
+ @Override
+ public SigningState getSigningState() {
+ return this.signingState;
+ }
+
+ /* (non-Javadoc)
+ * @see at.asit.pdfover.gui.workflow.Status#setSigningState(at.asit.pdfover.signator.SigningState)
+ */
+ @Override
+ public void setSigningState(SigningState state) {
+ this.signingState = state;
+ }
+
+ /* (non-Javadoc)
+ * @see at.asit.pdfover.gui.workflow.Status#setSignResult(at.asit.pdfover.signator.SignResult)
+ */
+ @Override
+ public void setSignResult(SignResult signResult) {
+ this.signResult = signResult;
+ }
+
+ /* (non-Javadoc)
+ * @see at.asit.pdfover.gui.workflow.Status#getSignResult()
+ */
+ @Override
+ public SignResult getSignResult() {
+ return this.signResult;
+ }
}
diff --git a/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/ErrorState.java b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/ErrorState.java
new file mode 100644
index 00000000..e444fbf9
--- /dev/null
+++ b/pdf-over-gui/src/main/java/at/asit/pdfover/gui/workflow/states/ErrorState.java
@@ -0,0 +1,116 @@
+/*
+ * 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.gui.composites.ErrorComposite;
+import at.asit.pdfover.gui.workflow.StateMachine;
+import at.asit.pdfover.gui.workflow.Status;
+
+/**
+ *
+ */
+public class ErrorState extends State {
+ /**
+ * @param stateMachine
+ */
+ public ErrorState(StateMachine stateMachine) {
+ super(stateMachine);
+ }
+
+ private Exception exception;
+
+ private boolean userInformed = false;
+
+ /**
+ * SLF4J Logger instance
+ **/
+ static final Logger log = LoggerFactory.getLogger(ErrorState.class);
+
+ private ErrorComposite errorComposite = null;
+
+ private ErrorComposite getComposite() {
+ if (this.errorComposite == null) {
+ this.errorComposite =
+ this.stateMachine.getGUIProvider().createComposite(ErrorComposite.class, SWT.RESIZE, this);
+ }
+
+ return this.errorComposite;
+ }
+
+ /* (non-Javadoc)
+ * @see at.asit.pdfover.gui.workflow.states.State#run()
+ */
+ @Override
+ public void run() {
+ Status status = this.stateMachine.getStatus();
+
+ if(this.errorComposite != null) {
+ this.userInformed = this.errorComposite.isUserOk();
+ }
+
+ if(this.exception != null && !this.userInformed) {
+ // Display Exception ....
+ ErrorComposite errorComposite = this.getComposite();
+ this.errorComposite.setException(this.exception);
+
+ this.userInformed = this.errorComposite.isUserOk();
+
+ this.stateMachine.getGUIProvider().display(errorComposite);
+ }
+
+ // TODO: Think should we do this? (possible infinity loop with exception ...)
+ this.setNextState(status.getPreviousState());
+ }
+
+ /* (non-Javadoc)
+ * @see at.asit.pdfover.gui.workflow.states.State#cleanUp()
+ */
+ @Override
+ public void cleanUp() {
+ // TODO
+ }
+
+ /* (non-Javadoc)
+ * @see at.asit.pdfover.gui.workflow.states.State#updateMainWindowBehavior()
+ */
+ @Override
+ public void updateMainWindowBehavior() {
+ // TODO Auto-generated method stub
+
+ }
+
+ /**
+ * Gets the Exception
+ * @return the exception
+ */
+ public Exception getException() {
+ return this.exception;
+ }
+
+ /**
+ * Sets the Exception
+ * @param exception the exception to set
+ */
+ public void setException(Exception exception) {
+ this.exception = exception;
+ }
+
+}
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
index 795090e7..c9c079a8 100644
--- 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
@@ -18,15 +18,116 @@ package at.asit.pdfover.gui.workflow.states;
// Imports
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-
+import org.apache.commons.codec.binary.Base64;
+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 at.asit.pdfover.gui.MainWindowBehavior;
import at.asit.pdfover.gui.MainWindow.Buttons;
import at.asit.pdfover.gui.workflow.StateMachine;
+import at.asit.pdfover.gui.workflow.Status;
+import at.asit.pdfover.signator.SLRequest;
+import at.asit.pdfover.signator.SLResponse;
/**
* Logical state for performing the BKU Request to a local BKU
*/
public class LocalBKUState extends State {
+
+ /**
+ * HTTP Response server HEADER
+ */
+ public final static String BKU_REPSONE_HEADER_SERVER = "server"; //$NON-NLS-1$
+
+ /**
+ * HTTP Response user-agent HEADER
+ */
+ public final static String BKU_REPSONE_HEADER_USERAGENT = "user-agent"; //$NON-NLS-1$
+
+ /**
+ * HTTP Response SignatureLayout HEADER
+ */
+ public final static String BKU_REPSONE_HEADER_SIGNATURE_LAYOUT = "SignatureLayout"; //$NON-NLS-1$
+
+
+ /**
+ *
+ */
+ private final class SignLocalBKUThread implements Runnable {
+
+ private LocalBKUState state;
+
+ /**
+ * @param localBKUState
+ */
+ public SignLocalBKUThread(LocalBKUState localBKUState) {
+ this.state = localBKUState;
+ }
+
+ @Override
+ public void run() {
+ try {
+ SLRequest request = this.state.signingState
+ .getSignatureRequest();
+
+ String b64_data = new String(Base64.encodeBase64(request
+ .getSignatureData().getByteArray()));
+
+ String sl_request = request.getRequest()
+ .replace(
+ SLRequest.DATAOBJECT_STRING,
+ "<sl:Base64Content>" + b64_data //$NON-NLS-1$
+ + "</sl:Base64Content>"); //$NON-NLS-1$
+
+ HttpClient client = new HttpClient();
+ client.getParams().setParameter("http.useragent", //$NON-NLS-1$
+ "PDF-Over 4.0"); //$NON-NLS-1$
+
+ PostMethod method = new PostMethod(
+ "http://127.0.0.1:3495/http-security-layer-request"); //$NON-NLS-1$
+ method.addParameter("XMLRequest", sl_request); //$NON-NLS-1$
+
+ int returnCode = client.executeMethod(method);
+
+ if(returnCode == HttpStatus.SC_OK)
+ {
+ String server = ""; //$NON-NLS-1$
+ String userAgent = ""; //$NON-NLS-1$
+ String signatureLayout = ""; //$NON-NLS-1$
+
+ if(method.getResponseHeader(BKU_REPSONE_HEADER_SERVER) != null)
+ {
+ server = method.getResponseHeader(BKU_REPSONE_HEADER_SERVER).getValue();
+ }
+
+ if(method.getResponseHeader(BKU_REPSONE_HEADER_USERAGENT) != null)
+ {
+ userAgent = method.getResponseHeader(BKU_REPSONE_HEADER_USERAGENT).getValue();
+ }
+
+ if(method.getResponseHeader(BKU_REPSONE_HEADER_SIGNATURE_LAYOUT) != null)
+ {
+ signatureLayout = method.getResponseHeader(BKU_REPSONE_HEADER_SIGNATURE_LAYOUT).getValue();
+ }
+
+ String response = method.getResponseBodyAsString();
+ log.debug("SL Response: " + response); //$NON-NLS-1$
+ SLResponse slResponse = new SLResponse(response, server, userAgent, signatureLayout);
+ this.state.signingState.setSignatureResponse(slResponse);
+ } else {
+ // TODO: Create HTTP exception
+ this.state.threadException = new HttpException(method.getResponseBodyAsString());
+ }
+
+ } catch (Exception e) {
+ log.error("SignLocalBKUThread: ", e); //$NON-NLS-1$
+ } finally {
+ this.state.stateMachine.invokeUpdate();
+ }
+ }
+ }
+
/**
* @param stateMachine
*/
@@ -37,34 +138,66 @@ public class LocalBKUState extends State {
/**
* SLF4J Logger instance
**/
- @SuppressWarnings("unused")
- private static final Logger log = LoggerFactory
+ static final Logger log = LoggerFactory
.getLogger(LocalBKUState.class);
- /* (non-Javadoc)
- * @see at.asit.pdfover.gui.workflow.WorkflowState#update(at.asit.pdfover.gui.workflow.Workflow)
+ at.asit.pdfover.signator.SigningState signingState;
+
+ Exception threadException = null;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * at.asit.pdfover.gui.workflow.WorkflowState#update(at.asit.pdfover.gui
+ * .workflow.Workflow)
*/
@Override
public void run() {
- // TODO Process SL Request and set SL Response
+ Status status = this.stateMachine.getStatus();
+
+ this.signingState = status.getSigningState();
+
+ if (!this.signingState.hasSignatureResponse() &&
+ this.threadException == null
+ ) {
+ Thread t = new Thread(new SignLocalBKUThread(this));
+ t.start();
+ return;
+ }
+
+ if(this.threadException != null) {
+ // TODO: Jump to error state!
+ }
+
+ if(!this.signingState.hasSignatureResponse()) {
+ // The thread should set the response or the thread exception!!!
+ // TODO: Jump to error state!
+ }
+ // OK
this.setNextState(new SigningState(this.stateMachine));
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see at.asit.pdfover.gui.workflow.states.State#cleanUp()
*/
@Override
public void cleanUp() {
// No composite - no cleanup necessary
}
-
- /* (non-Javadoc)
+
+ /*
+ * (non-Javadoc)
+ *
* @see at.asit.pdfover.gui.workflow.states.State#setMainWindowBehavior()
*/
@Override
public void updateMainWindowBehavior() {
- MainWindowBehavior behavior = this.stateMachine.getStatus().getBehavior();
+ MainWindowBehavior behavior = this.stateMachine.getStatus()
+ .getBehavior();
behavior.reset();
behavior.setActive(Buttons.OPEN, true);
behavior.setActive(Buttons.POSITION, true);
@@ -72,7 +205,7 @@ public class LocalBKUState extends State {
}
@Override
- public String toString() {
+ 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
index 7c16d559..50aee387 100644
--- 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
@@ -16,12 +16,15 @@
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.gui.MainWindow.Buttons;
import at.asit.pdfover.gui.MainWindowBehavior;
+import at.asit.pdfover.gui.composites.OutputComposite;
import at.asit.pdfover.gui.workflow.StateMachine;
+import at.asit.pdfover.gui.workflow.Status;
/**
* Procduces the output of the signature process. (save file, open file)
@@ -41,11 +44,43 @@ public class OutputState extends State {
@SuppressWarnings("unused")
private static final Logger log = LoggerFactory.getLogger(OutputState.class);
+ private OutputComposite outputComposite = null;
+
+ private OutputComposite getSelectionComposite() {
+ if (this.outputComposite == null) {
+ this.outputComposite =
+ this.stateMachine.getGUIProvider().createComposite(OutputComposite.class, SWT.RESIZE, this);
+ }
+
+ return this.outputComposite;
+ }
+
@Override
public void run() {
// TODO Preform output operations ... end workflow
- this.stateMachine.exit();
+ Status status = this.stateMachine.getStatus();
+
+ if(status.getSignResult() != null)
+ {
+ OutputComposite outputComposite = this.getSelectionComposite();
+ outputComposite.setSignedDocument(status.getSignResult().getSignedDocument());
+ this.stateMachine.getGUIProvider().display(outputComposite);
+
+ /*DocumentSource signedDocument = status.getSignResult().getSignedDocument();
+
+ FileOutputStream output;
+ try {
+ output = new FileOutputStream(new File("/tmp/test.pdf"));
+ output.write(signedDocument.getByteArray(), 0, signedDocument.getByteArray().length);
+ output.close();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }*/
+ }
+
+ //this.stateMachine.exit();
}
/* (non-Javadoc)
@@ -53,7 +88,8 @@ public class OutputState extends State {
*/
@Override
public void cleanUp() {
- // TODO
+ if (this.outputComposite != null)
+ this.outputComposite.dispose();
}
/* (non-Javadoc)
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
index db251ee6..9fc86f3b 100644
--- 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
@@ -24,7 +24,9 @@ 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.workflow.StateMachine;
+import at.asit.pdfover.gui.workflow.Status;
import at.asit.pdfover.gui.workflow.states.BKUSelectionState.BKUs;
+import at.asit.pdfover.signator.PDFFileDocumentSource;
import at.asit.pdfover.signator.SignatureParameter;
import at.asit.pdfover.signator.Signer;
@@ -40,33 +42,6 @@ public class PrepareSigningState extends State {
super(stateMachine);
}
- /**
- * Debug background thread
- */
- private final class DebugSleeperThread implements Runnable {
-
- private StateMachine workflow;
-
- /**
- * Default constructor
- * @param work
- */
- public DebugSleeperThread(final StateMachine work) {
- this.workflow = work;
- }
-
- @Override
- public void run() {
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- this.workflow.invokeUpdate();
- }
- }
-
private final class PrepareDocumentThread implements Runnable {
private PrepareSigningState state;
@@ -82,10 +57,26 @@ public class PrepareSigningState extends State {
@Override
public void run() {
try {
+ if(this.state.signer == null) {
+ this.state.signer = this.state.stateMachine.getPDFSigner().getPDFSigner();
+ }
+
+ if(this.state.signatureParameter == null) {
+ this.state.signatureParameter = this.state.signer.newParameter();
+ }
+
+ this.state.signatureParameter.setInputDocument(new PDFFileDocumentSource(this.state.stateMachine.getStatus().getDocument()));
+ this.state.signatureParameter.setSignaturePosition(this.state.stateMachine.getStatus().getSignaturePosition());
+
+ // TODO: Fill library specific signature Parameters ...
+ // TODO: setEmblem etc.
+
+ this.state.signingState = this.state.signer.prepare(this.state.signatureParameter);
} catch (Exception e) {
- log.error("PrepareDocumentThread: ", e);
+ log.error("PrepareDocumentThread: ", e); //$NON-NLS-1$
+ this.state.threadException = e;
}
finally {
this.state.stateMachine.invokeUpdate();
@@ -96,9 +87,9 @@ public class PrepareSigningState extends State {
/**
* SFL4J Logger instance
**/
- private static final Logger log = LoggerFactory.getLogger(PrepareSigningState.class);
+ static final Logger log = LoggerFactory.getLogger(PrepareSigningState.class);
- private SignatureParameter signatureParameter;
+ SignatureParameter signatureParameter;
private WaitingComposite waitingComposite = null;
@@ -111,29 +102,45 @@ public class PrepareSigningState extends State {
return this.waitingComposite;
}
- private boolean run = false;
+ at.asit.pdfover.signator.SigningState signingState = null;
+
+ Signer signer;
+
+ Exception threadException = null;
@Override
public void run() {
- // TODO SHOW BACKGROUND ACTIVITY ....
WaitingComposite waiting = this.getSelectionComposite();
this.stateMachine.getGUIProvider().display(waiting);
- Signer signer = this.stateMachine.getPDFSigner().getPDFSigner();
+ this.signer = this.stateMachine.getPDFSigner().getPDFSigner();
+
+ Status status = this.stateMachine.getStatus();
- if(signatureParameter == null) {
-// signatureParameter =
+ if(this.signatureParameter == null) {
+ this.signatureParameter = this.signer.newParameter();
}
- if(!this.run) {
+ if(this.signingState == null && this.threadException == null) {
Thread t = new Thread(new PrepareDocumentThread(this));
- this.run = true;
t.start();
return;
+ }
+
+ if(this.threadException != null) {
+ // TODO: Jump to error state!
}
- // WAIT FOR SLREQUEST and dispatch according to BKU selection
+ if(this.signingState == null || this.signingState.getSignatureRequest() == null) {
+ // This shouldnot happen!! PrepareDocumentThread allready performed, either we have a valid signingState or an exception!!
+ // TODO: Jump to error state!
+ }
+
+ // We got the Request set it into status and move on to next state ...
+ status.setSigningState(this.signingState);
+
+ log.debug("SL REQUEST: " + this.signingState.getSignatureRequest().getRequest()); //$NON-NLS-1$
if(this.stateMachine.getStatus().getBKU() == BKUs.LOCAL) {
this.setNextState(new LocalBKUState(this.stateMachine));
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
index 6b453d33..524fc868 100644
--- 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
@@ -20,6 +20,8 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import at.asit.pdfover.gui.workflow.StateMachine;
+import at.asit.pdfover.gui.workflow.Status;
+import at.asit.pdfover.signator.Signer;
/**
* Logical state for signing process, usually show BKU Dialog during this state.
@@ -27,6 +29,36 @@ import at.asit.pdfover.gui.workflow.StateMachine;
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 {
+ Signer signer = this.state.stateMachine.getPDFSigner().getPDFSigner();
+ Status status = this.state.stateMachine.getStatus();
+
+ status.setSignResult(signer.sign(status.getSigningState()));
+ } catch(Exception e) {
+ log.error("FinishSignThread: ", e); //$NON-NLS-1$
+ this.state.threadException = e;
+ } finally {
+ this.state.stateMachine.invokeUpdate();
+ }
+ }
+ }
+
+ /**
* @param stateMachine
*/
public SigningState(StateMachine stateMachine) {
@@ -36,12 +68,29 @@ public class SigningState extends State {
/**
* SFL4J Logger instance
**/
- @SuppressWarnings("unused")
- private static final Logger log = LoggerFactory.getLogger(SigningState.class);
+ static final Logger log = LoggerFactory.getLogger(SigningState.class);
+
+ Exception threadException = null;
@Override
public void run() {
- // TODO Wait until output ready and set output
+ Status status = this.stateMachine.getStatus();
+
+ if(status.getSignResult() == null &&
+ this.threadException == null) {
+ Thread t = new Thread(new FinishSignThread(this));
+ t.start();
+ return;
+ }
+
+ if(this.threadException != null) {
+ // TODO: Jump to error state
+ }
+
+ if(status.getSignResult() == null) {
+ // The thread should set the threadException or create a valid signResult
+ // TODO: Jump to error state
+ }
this.setNextState(new OutputState(this.stateMachine));
}
diff --git a/pdf-over-gui/src/main/resources/log4j.properties b/pdf-over-gui/src/main/resources/log4j.properties
index adb49d7c..715eb0af 100644
--- a/pdf-over-gui/src/main/resources/log4j.properties
+++ b/pdf-over-gui/src/main/resources/log4j.properties
@@ -4,3 +4,17 @@ log4j.rootLogger=TRACE, STDOUT
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=%-5p | %d | %t | %c %x- %m%n
+
+# DETAIL LEVELS PDF-Over
+log4j.logger.at.asit.pdfover = DEBUG
+log4j.logger.at.gv.egiz.pdfas = INFO
+log4j.logger.at.knowcenter = INFO
+log4j.logger.at.knowcenter.wag.egov.egiz.ldap = DEBUG
+log4j.logger.org.apache.commons.httpclient.HttpMethodBase = ERROR
+
+# DETAIL LEVELS PDF-AS
+log4j.logger.org.pdfbox = INFO
+log4j.logger.at.gv.egiz.pdfas = INFO
+log4j.logger.at.knowcenter = INFO
+log4j.logger.at.knowcenter.wag.egov.egiz.ldap = DEBUG
+log4j.logger.org.apache.commons.httpclient.HttpMethodBase = ERROR \ No newline at end of file
diff --git a/pdf-over-signator/src/main/java/at/asit/pdfover/signator/DocumentSource.java b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/DocumentSource.java
index 931fab41..bed9461e 100644
--- a/pdf-over-signator/src/main/java/at/asit/pdfover/signator/DocumentSource.java
+++ b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/DocumentSource.java
@@ -15,6 +15,7 @@
*/
package at.asit.pdfover.signator;
+import java.io.IOException;
import java.io.InputStream;
/**
@@ -25,8 +26,9 @@ public interface DocumentSource {
/**
* Gets Document as Input Stream
* @return InputStream of the document
+ * @throws IOException
*/
- public InputStream getInputStream();
+ public InputStream getInputStream() throws IOException;
/**
* Get Length of document
diff --git a/pdf-over-signator/src/main/java/at/asit/pdfover/signator/PDFFileDocumentSource.java b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/PDFFileDocumentSource.java
new file mode 100644
index 00000000..04fab03a
--- /dev/null
+++ b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/PDFFileDocumentSource.java
@@ -0,0 +1,90 @@
+/*
+ * 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.signator;
+
+// Imports
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ *
+ */
+public class PDFFileDocumentSource implements DocumentSource {
+ /**
+ * SLF4J Logger instance
+ **/
+ private static final Logger log = LoggerFactory
+ .getLogger(PDFFileDocumentSource.class);
+
+ private File file;
+
+ private byte[] data = null;
+
+ private int len = 0;
+
+ /**
+ * Default constructor
+ * @param file
+ */
+ public PDFFileDocumentSource(File file) {
+ this.file = file;
+ }
+
+ /* (non-Javadoc)
+ * @see at.asit.pdfover.signator.DocumentSource#getInputStream()
+ */
+ @Override
+ public InputStream getInputStream() throws IOException {
+ return new FileInputStream(this.file);
+ }
+
+ /* (non-Javadoc)
+ * @see at.asit.pdfover.signator.DocumentSource#getLength()
+ */
+ @Override
+ public int getLength() {
+ if(this.file.length() > Integer.MAX_VALUE) {
+ // TODO: Handle error somehow or use long ...
+ }
+ this.len = (int) this.file.length();
+ return this.len;
+ }
+
+ /* (non-Javadoc)
+ * @see at.asit.pdfover.signator.DocumentSource#getByteArray()
+ */
+ @Override
+ public byte[] getByteArray() {
+ if(this.data == null) {
+ try {
+ InputStream stream = this.getInputStream();
+ this.data = new byte[this.getLength()];
+ stream.read(this.data);
+ stream.close();
+ } catch(IOException ex) {
+ log.error("Failed to read file!", ex);
+ }
+ }
+ return this.data;
+ }
+
+}
diff --git a/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SLRequest.java b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SLRequest.java
index 508c42c9..abc0ff30 100644
--- a/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SLRequest.java
+++ b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SLRequest.java
@@ -19,6 +19,21 @@ package at.asit.pdfover.signator;
* Security Layer Request
*/
public interface SLRequest {
+
+ /**
+ * The String Konstant to replace the SL DATAOBJECT
+ */
+ public static final String DATAOBJECT_STRING = "##DATAOBJECT##";
+
+ /**
+ * The SL Request String
+ *
+ * In this string the DATAOBJECT_STRING has to be replaced by the reference of the Signature Data
+ * Examples are sl:Base64Content, sl:LocRefContent
+ * @return
+ */
+ public String getRequest();
+
/**
* Gets the signature data for this request
* @return The document source
diff --git a/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SLResponse.java b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SLResponse.java
index 98328c07..84b5242f 100644
--- a/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SLResponse.java
+++ b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SLResponse.java
@@ -27,16 +27,51 @@ public class SLResponse {
/**
* SFL4J Logger instance
**/
+ @SuppressWarnings("unused")
private static Logger log = LoggerFactory.getLogger(Signator.class);
private String response;
+ private String server;
+
+ /**
+ * Gets the server string
+ * @return the server
+ */
+ public String getServer() {
+ return this.server;
+ }
+
+ /**
+ * Gets the user Agent string
+ * @return the user Agent
+ */
+ public String getUserAgent() {
+ return this.userAgent;
+ }
+
+ /**
+ * Gets the signature Layout value
+ * @return the signature Layout
+ */
+ public String getSignaturLayout() {
+ return this.signaturLayout;
+ }
+
+ private String userAgent;
+ private String signaturLayout;
/**
* Create a new Security Layer response
* @param response the SLResponse
+ * @param server the server
+ * @param userAgent the user Agent
+ * @param signaturLayout the signature Layout
*/
- public SLResponse(String response) {
+ public SLResponse(String response, String server, String userAgent, String signaturLayout) {
this.response = response;
+ this.server = server;
+ this.userAgent = userAgent;
+ this.signaturLayout = signaturLayout;
}
/**
diff --git a/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SigningState.java b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SigningState.java
index 02543d7a..93facb86 100644
--- a/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SigningState.java
+++ b/pdf-over-signator/src/main/java/at/asit/pdfover/signator/SigningState.java
@@ -24,11 +24,17 @@ public interface SigningState {
* Gets the Security Layer Request to create the signature
* @return The Signature Request
*/
- public abstract SLRequest getSignatureRequest();
+ public SLRequest getSignatureRequest();
/**
* Sets the Security Layer Response to the Signature Request
* @param value The Signature Response
*/
- public abstract void setSignatureResponse(SLResponse value);
+ public void setSignatureResponse(SLResponse value);
+
+ /**
+ * Has the state a SignatureResponse set ?
+ * @return true if a SLResponse is set
+ */
+ public boolean hasSignatureResponse();
}
diff --git a/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASHelper.java b/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASHelper.java
index 00528762..80617989 100644
--- a/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASHelper.java
+++ b/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASHelper.java
@@ -16,6 +16,8 @@
package at.asit.pdfover.signer.pdfas;
//Imports
+import java.io.File;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import at.asit.pdfover.signator.SignatureException;
@@ -49,6 +51,8 @@ public class PDFASHelper {
* @throws PdfAsException
*/
private static PdfAs createPdfAs() throws PdfAsException {
+ File directory = new File (".");
+ System.setProperty("log4j.configuration", directory.getAbsolutePath()+"/log4j.properties");
return new at.gv.egiz.pdfas.impl.api.PdfAsObject();
}
diff --git a/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSLRequest.java b/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSLRequest.java
index 02fccca0..49cb1522 100644
--- a/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSLRequest.java
+++ b/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSLRequest.java
@@ -19,6 +19,7 @@ package at.asit.pdfover.signer.pdfas;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import at.asit.pdfover.signator.ByteArrayDocumentSource;
import at.asit.pdfover.signator.DocumentSource;
import at.asit.pdfover.signator.SLRequest;
@@ -30,22 +31,40 @@ public class PDFASSLRequest implements SLRequest {
/**
* SFL4J Logger instance
**/
+ @SuppressWarnings("unused")
private static final Logger log = LoggerFactory.getLogger(PDFASSLRequest.class);
private String request;
+ private ByteArrayDocumentSource source;
+
/**
* Default constructor
* @param slRequest
+ * @param signData
*/
- public PDFASSLRequest(String slRequest) {
- this.request = slRequest;
+ public PDFASSLRequest(String slRequest, byte[] signData) {
+ // Modifing SL Request ...
+ this.request = slRequest.replace(PDFASSigner.LOC_REF, SLRequest.DATAOBJECT_STRING);
+
+ if(!this.request.contains(DATAOBJECT_STRING)) {
+ // TODO: throw Exception (Failed to prepare SL Request)
+ }
+
+ this.source = new ByteArrayDocumentSource(signData);
}
@Override
public DocumentSource getSignatureData() {
- // TODO Auto-generated method stub
- return null;
+ return this.source;
+ }
+
+ /* (non-Javadoc)
+ * @see at.asit.pdfover.signator.SLRequest#getRequest()
+ */
+ @Override
+ public String getRequest() {
+ return this.request;
}
}
diff --git a/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigner.java b/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigner.java
index cf93c96c..d1336d91 100644
--- a/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigner.java
+++ b/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigner.java
@@ -1,6 +1,7 @@
package at.asit.pdfover.signer.pdfas;
import at.asit.pdfover.signator.ByteArrayDocumentSource;
+import at.asit.pdfover.signator.SLResponse;
import at.asit.pdfover.signator.SignatureException;
import at.asit.pdfover.signator.Signer;
import at.asit.pdfover.signator.SignResult;
@@ -11,6 +12,7 @@ import at.asit.pdfover.signator.SigningState;
import at.gv.egiz.pdfas.api.PdfAs;
import at.gv.egiz.pdfas.api.sign.SignParameters;
import at.gv.egiz.pdfas.api.sign.SignatureDetailInformation;
+import at.gv.egiz.pdfas.framework.input.DataSource;
import at.gv.egiz.pdfas.io.ByteArrayDataSink;
import at.gv.egiz.pdfas.api.commons.Constants;
import at.gv.egiz.pdfas.api.exceptions.PdfAsException;
@@ -32,6 +34,11 @@ public class PDFASSigner implements Signer {
*/
protected static final String URL_TEMPLATE = "http://pdfover.4.gv.at/template";
+ /**
+ * Location reference string
+ */
+ protected static final String LOC_REF = "<sl:LocRefContent>" + URL_TEMPLATE + "</sl:LocRefContent>";
+
@Override
public SigningState prepare(SignatureParameter parameter)
throws SignatureException {
@@ -56,10 +63,15 @@ public class PDFASSigner implements Signer {
params.setSignatureType(Constants.SIGNATURE_TYPE_BINARY);
params.setSignatureProfileId(PROFILE_ID);
+ params.setOutput(new ByteArrayDataSink());
if (parameter.getEmblem() != null) {
params.setProfileOverrideValue("SIG_LABEL", parameter
.getEmblem().getFileName());
}
+
+ // Prepare Output sink
+ state.setOutput(new ByteArrayDataSink());
+ params.setOutput(state.getOutput());
params.setDocument(sign_para.getPDFASDataSource());
@@ -76,9 +88,9 @@ public class PDFASSigner implements Signer {
String slRequest = pdfasInternal.prepareLocalSignRequest(params,
false, URL_TEMPLATE, sdi);
- //DataSource sig_data = sdi.getSignatureData();
+ at.gv.egiz.pdfas.api.io.DataSource sig_data = sdi.getSignatureData();
- PDFASSLRequest request = new PDFASSLRequest(slRequest);
+ PDFASSLRequest request = new PDFASSLRequest(slRequest, sig_data.getAsByteArray());
state.setSignatureRequest(request);
@@ -108,19 +120,18 @@ public class PDFASSigner implements Signer {
SignParameters params = sstate.getSignParameters();
- // Prepare Output sink
- ByteArrayDataSink data = new ByteArrayDataSink();
- params.setOutput(data);
-
+
SignatureDetailInformation sdi = sstate
.getSignatureDetailInformation();
- LocalBKUParams bkuParams = new LocalBKUParams(null, null, null);
+ SLResponse slResponse = sstate.getSignatureResponse();
+
+ LocalBKUParams bkuParams = new LocalBKUParams(slResponse.getServer(), slResponse.getUserAgent(), slResponse.getSignaturLayout());
// Perform signature
at.gv.egiz.pdfas.api.sign.SignResult signResult = pdfasInternal
.finishLocalSign(pdfas, params, sdi, bkuParams, false,
- sstate.getSignatureResponse().getSLRespone());
+ slResponse.getSLRespone());
// Preparing Result Response
SignResultImpl result = new SignResultImpl();
@@ -138,7 +149,7 @@ public class PDFASSigner implements Signer {
result.setSignaturePosition(pos);
// Set signed Document
- result.setSignedDocument(new ByteArrayDocumentSource(data.getData()));
+ result.setSignedDocument(new ByteArrayDocumentSource(((ByteArrayDataSink)sstate.getOutput()).getData()));
return result;
} catch (PdfAsException e) {
diff --git a/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigningState.java b/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigningState.java
index 1d52a27f..72e24747 100644
--- a/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigningState.java
+++ b/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PDFASSigningState.java
@@ -21,6 +21,7 @@ import org.slf4j.LoggerFactory;
import at.asit.pdfover.signator.SLRequest;
import at.asit.pdfover.signator.SLResponse;
import at.asit.pdfover.signator.SigningState;
+import at.gv.egiz.pdfas.api.io.DataSink;
import at.gv.egiz.pdfas.api.sign.SignatureDetailInformation;
/**
@@ -39,6 +40,27 @@ public class PDFASSigningState implements SigningState {
protected SLRequest slrequest;
/**
+ * The PDF AS DataSink
+ */
+ protected DataSink output;
+
+ /**
+ * Gets the DataSink
+ * @return the datasink
+ */
+ public DataSink getOutput() {
+ return this.output;
+ }
+
+ /**
+ * Sets the datasing
+ * @param output the pdf as datasink
+ */
+ public void setOutput(DataSink output) {
+ this.output = output;
+ }
+
+ /**
* The Signature Layer response
*/
protected SLResponse slresponse;
@@ -69,6 +91,13 @@ public class PDFASSigningState implements SigningState {
return this.slresponse;
}
+ /* (non-Javadoc)
+ * @see at.asit.pdfover.signator.SigningState#hasSignatureResponse()
+ */
+ @Override
+ public boolean hasSignatureResponse() {
+ return this.getSignatureResponse() != null;
+ }
// ----------------------------------------
// PDF AS Specific stuff
diff --git a/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PdfAsSignatureParameter.java b/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PdfAsSignatureParameter.java
index bd324e9f..4825785b 100644
--- a/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PdfAsSignatureParameter.java
+++ b/pdf-over-signer/pdf-over-sigpdfas/src/main/java/at/asit/pdfover/signer/pdfas/PdfAsSignatureParameter.java
@@ -54,7 +54,7 @@ public class PdfAsSignatureParameter extends SignatureParameter {
*/
public DataSource getPDFASDataSource() {
// TODO: implement Signature creation
- return new ByteArrayPDFASDataSource(null);
+ return new ByteArrayPDFASDataSource(this.getInputDocument().getByteArray());
}
@Override