Skip to content

Commit b7b1957

Browse files
3keyromannetmackan
authored andcommitted
Transaction support for signing and timed service
1 parent 0df7baa commit b7b1957

File tree

14 files changed

+88
-11
lines changed

14 files changed

+88
-11
lines changed

signserver/modules/SignServer-Common/src/main/java/org/signserver/common/SignServerConstants.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ public class SignServerConstants {
8989
*/
9090
public static final String KEYUSAGELIMIT = "KEYUSAGELIMIT";
9191
public static String DISABLEKEYUSAGECOUNTER = "DISABLEKEYUSAGECOUNTER";
92+
93+
public static String PROCESSINTRANSACTION = "PROCESSINTRANSACTION";
94+
9295
/**
9396
* Constant used to set the default value of configuration property to NULL if not setting property means property value is NULL.
9497
*

signserver/modules/SignServer-Server/src/main/java/org/signserver/server/BaseWorker.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,4 +209,8 @@ public WorkerType getWorkerType() {
209209
}
210210
return type;
211211
}
212+
213+
public boolean requiresTransaction(final IServices services) {
214+
return false;
215+
}
212216
}

signserver/modules/SignServer-Server/src/main/java/org/signserver/server/IWorker.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,11 @@ public interface IWorker {
6868
* @return a WorkerStatus object.
6969
*/
7070
WorkerStatusInfo getStatus(final List<String> additionalFatalErrors, final IServices services);
71+
72+
/**
73+
* If worker requires a database transaction when using this crypto token.
74+
*
75+
* @return True or false
76+
*/
77+
boolean requiresTransaction(final IServices services);
7178
}

signserver/modules/SignServer-Server/src/main/java/org/signserver/server/UnloadableWorker.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,11 @@ public boolean isSingleton() {
129129
return false;
130130
}
131131

132+
@Override
133+
public boolean requiresTransaction(final IServices services) {
134+
return false;
135+
}
136+
132137
/**
133138
* @return No log types
134139
*/

signserver/modules/SignServer-Server/src/main/java/org/signserver/server/cryptotokens/BaseCryptoToken.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,9 @@ public boolean isNoCertificatesRequired() {
2727
return false;
2828
}
2929

30+
@Override
31+
public boolean requiresTransactionForSigning() {
32+
return false;
33+
}
34+
3035
}

signserver/modules/SignServer-Server/src/main/java/org/signserver/server/cryptotokens/ICryptoTokenV4.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,4 +279,11 @@ boolean removeKey(String alias, IServices services) throws CryptoTokenOfflineExc
279279
* @return True or false
280280
*/
281281
boolean isNoCertificatesRequired();
282+
283+
/**
284+
* If worker requires a database transaction for signing operation.
285+
*
286+
* @return True or false
287+
*/
288+
boolean requiresTransactionForSigning();
282289
}

signserver/modules/SignServer-Server/src/main/java/org/signserver/server/signers/BaseSigner.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,19 @@ public WorkerStatusInfo getStatus(final List<String> additionalFatalErrors, fina
234234
completeEntries, config);
235235
}
236236

237+
public boolean requiresTransaction(final IServices services) {
238+
try {
239+
ICryptoTokenV4 cryptoToken = super.getCryptoToken(services);
240+
if (cryptoToken == null) {
241+
return false;
242+
}
243+
return cryptoToken.requiresTransactionForSigning();
244+
} catch (Exception e) {
245+
LOG.warn("Unable to determine whether a worker requires a transaction. Defaulting to False.", e);
246+
return false;
247+
}
248+
}
249+
237250
@Override
238251
protected List<String> getFatalErrors(IServices services) {
239252
final LinkedList<String> errors = new LinkedList<>(super.getFatalErrors(services));

signserver/modules/SignServer-Server/src/main/java/org/signserver/server/timedservices/BaseTimedService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,11 @@ public boolean isSingleton() {
142142
return active.trim().equalsIgnoreCase("TRUE");
143143
}
144144

145+
@Override
146+
public boolean requiresTransaction(final IServices services) {
147+
return false;
148+
}
149+
145150
@Override
146151
public WorkerStatusInfo getStatus(final List<String> additionalFatalErrors, final IServices services) {
147152
final List<String> fatalErrorsIncludingAdditionalErrors = new LinkedList<>(additionalFatalErrors);

signserver/modules/SignServer-Server/src/main/java/org/signserver/server/timedservices/ITimedService.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import java.util.Set;
1616
import org.signserver.common.ServiceContext;
17+
import org.signserver.server.IServices;
1718
import org.signserver.server.IWorker;
1819
import org.signserver.server.ServiceExecutionFailedException;
1920

@@ -62,7 +63,12 @@ public interface ITimedService extends IWorker {
6263
* the time, of false if it should be run on all nodes simultaneously.
6364
*/
6465
boolean isSingleton();
65-
66+
67+
/**
68+
* @return true if the service requires a transaction to be executed successfully
69+
*/
70+
boolean requiresTransaction(final IServices services);
71+
6672
/**
6773
* Get log types for logging work invocations.
6874
*

signserver/modules/SignServer-ejb/src/main/java/org/signserver/ejb/DispatcherProcessSessionBean.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ public Response process(final AdminInfo adminInfo, final WorkerIdentifier wi,
139139
throws IllegalRequestException, CryptoTokenOfflineException,
140140
SignServerException {
141141
requestContext.setServices(servicesImpl);
142-
if (SessionUtils.needsTransaction(workerManagerSession, wi)) {
142+
if (SessionUtils.needsTransaction(workerManagerSession, wi, servicesImpl)) {
143143
// use separate transaction bean to avoid deadlock
144144
return dispatcherProcessTransSession.processWithTransaction(adminInfo, wi, request, requestContext);
145145
} else {

0 commit comments

Comments
 (0)