Skip to content

Commit cad5ce1

Browse files
3keyromannetmackan
authored andcommitted
Transaction support for signing and timed service
1 parent bb6e18d commit cad5ce1

File tree

15 files changed

+94
-11
lines changed

15 files changed

+94
-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/cesecore/keys/token/KeyAliasesCache.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
*/
2424
public class KeyAliasesCache extends CommonCacheBase<PublicKey> {
2525

26+
long lastUpdate = 0L;
27+
2628
@Override
2729
public PublicKey getEntry(final Integer id) {
2830
if (id == null) {
@@ -31,6 +33,10 @@ public PublicKey getEntry(final Integer id) {
3133
return super.getEntry(id);
3234
}
3335

36+
public void updateCacheTimeStamp() {
37+
this.lastUpdate = System.currentTimeMillis();
38+
}
39+
3440
@Override
3541
protected long getCacheTime() {
3642
return 30000; // Cache key aliases for 30 seconds

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
*

0 commit comments

Comments
 (0)