Configuration reference

This document describes all the parameters (set in config/config.json) that controls system behaviour.

Audience

System administrators

Notes

Configuration keys are often nested. Nesting levels are signified by a period (.) between keys in the table below. Example: completionNextTarget.enabled = true looks like this in the config:

{
  ...
  "completionNextTarget": {
    "enabled": true,
    ...
  },
  ...
}
Click to copy

Changes between version 2.5.11 and 3.0.0

Old configuration should work out of the box, with default values for newly added configuration keys. It is however strongly recommended to update the configuration to the current version, as legacy configuration will not be supported more than one version back. Fewer fields are now mandatory, and some have updated default values.

In version 3.0, all job configurations have been moved under a common root key called jobs, with nested categories and finally new nested job names underneath. The former names of job config keys are given below, to simplify translation into new config. Jobs are now turned off unless they are configured.

The former addUserViaEmail section has been renamed email and has moved in under the new tabs section.

Also new is the files section. The former top-level allowAppendixes key has moved in under files.

Another new section is metrics.

The former signingOrders has been renamed signingTasks.

Some other new top-level additions are resourcesRoot, webRoot, tenantId, and dumpConfig, all of which have default values.

NameDescriptionMandatoryDatatypeDefault
allowMultipleFilesWhether SWF should accept multiple files per signing tasknobooleanfalse
automationApiEnabledEnable the Automation APInobooleanfalse
automationApiInterfaceListening interface for the Automation APInostring"0.0.0.0"
automationApiPortListening port for the Automation APInoint8081
completionNextTarget.enabledWhether or not the completionNextTarget functionality should be enabled.nobooleanfalse
completionNextTarget.allowedLogoutTargetPrefixcompletionNextTarget URL prefix regex. The specified nextTarget should match the URL target that errand creators sets. Read more about it in the PAS solution documentation.nostring""
completionNextTarget.allowedLogoutTargetcompletionNextTarget URL regex. The specified nextTarget should match the URL target that errand creators sets. Read more about it in the PAS solution documentation.nostring"/|/[\\w]+[\\w/.#-]*|/[\\w/.-]*\\?[\\w=&+-./]*|[\\.]+[\\w/.-]*|[\\.]+[\\w/.-]*\\?[\\w=&+-.]*"
completionNextTarget.allowedLogoutTargetSuffixcompletionNextTarget URL suffix regex. The specified nextTarget should match the URL target that errand creators sets. Read more about it in the PAS solution documentation.nostring""
completionNextTarget.configurationsLanding page configurations. Read more about it here.noJSON object given as stringnone
credentials.passwordPassword for PKCS12 archiveyes, if password.privatePkcs12 is encryptedstringnone
credentials.privatePkcs12PKCS12 archive for server certificate and private keyyesstringnone
database.changelogPath to database changesetnostring"db_migrations/changelog.master.xml"
database.driver_classDatabase drivernostring"com.microsoft.sqlserver.jdbc.SQLServerDriver"
database.initial_pool_sizeInitial number of connections in connection poolnoint3
database.max_idle_timeMaximum idle time for a connection in connection pool (0 means forever)noint0
database.max_pool_sizeMaximum number of connections in connection poolnoint15
database.migrations_enabledEnable database changeset. Only change this if you know what you are doing.yesbooleantrue
database.min_pool_sizeMinimal number of connections in connection poolnoint3
database.passwordDatabase passwordyesstringnone
database.urlDatabase connection URL. For example "jdbc:sqlserver://localhost:1433;database=digo;encrypt=false"yesstringnone
database.userDatabase useryesstringnone
descriptionLengthMaximum description length for an errand.
Keep this the same as the database limit as this will not change the database limit.
noint2048
documentConversion.enabledWhether document conversion is enablednobooleanfalse
documentConversion.preferredFlavourWhat global flavour the conversion service should convert to. Could be overridden by implementation specific preferredFlavour.nointeger given as stringnone
documentConversion.implementationAn array of the conversion implementations used. Will start with the first entry and use the rest as fallbacknostring arraynone
documentConversion.implementationConfigurationsA JSON object containing implementation specific configurations where the key will be the name of the implementation. Configuration details depends on the implementation of choice.noJSON object given as stringnone
dumpConfigMakes the server log the effective configuration at startup, useful for troubleshootingnobooleanfalse
emailValidation.enabledWhether to validate email addresses that are entered into SWF.nobooleanfalse
emailValidation.jmail.strictValidatorEnable strict validation when using Jmail
More info: https://github.com/RohanNagar/jmail?tab=readme-ov-file#additional-validation-rules
nobooleanfalse
emailValidation.regex.javaRegexJava regex to use when emailValidation.type is "regex"
Only used on backend.
yesstringSee config-sample.json in installation directory
emailValidation.regex.javaScriptRegexJavascript regex to use when validating in frontend.
The email will be validated again when it reaches the backend.
yesstringSee config-sample.json in installation directory
emailValidation.typeWhat type of validation to use in the backend.

More about jmail: https://github.com/RohanNagar/jmail
If you don't want to use jmail, you can instead use a regular expression, which is configured using emailValidation.regex.javaRegex

Frontend always uses regex because jmail is a backend validator.
yesstring: JMAIL or REGEX"JMAIL"
files.maxFileSizeMaximum size in bytes of a file to be signed int10 000 000
files.maxNumberOfFilesMaximum number of files allowed in one task, to be signed together int5
files.allowAppendixesWhether SWF should accept appendixes (files included for information, which aren't themselves signed) booleanfalse
files.conversion.enabledWhether file conversion is enabled booleanfalse
files.conversion.statusesWhat file validation statuses to try to convert string array[ ]
fileService.passwordFile service user passwordyesstringnone
fileService.urlURL of File Serviceyesstringnone
fileService.usernameFile service useryesstringnone

jobs.retention.fileRetention.batchSize

(jobs.retention.fileRetention was formerly called documentRetention)

Number of documents to process at the same timenoint100
jobs.retention.fileRetention.completedDocumentAgeMax age of a completed (ACCEPTED, REJECTED, CANCELLED, EXPIRED) document until it is deletednoISO-8601 duration"P50Y"
jobs.retention.fileRetention.delayDelay before running first batch job or starting cron schedule, depending on jobs.retention.fileRetention.schedule settingnoISO-8601 duration"PT0S"
jobs.retention.fileRetention.enabledEnable or disable the entire document retention function.nobooleanfalse
jobs.retention.fileRetention.inactiveDocumentAgeMax age of an inactive or finalized (REJECTED, CANCELLED, EXPIRED) document until it is deletednoISO-8601 duration"P50Y"
jobs.retention.fileRetention.scheduleDelay between batch jobs, as ISO-8601 duration or cron expressionnoISO-8601 duration or cron expression"0 0 2 * * ?"
jobs.retention.fileRetention.unconsumedDocumentAgeMax age of an orphan document until it is deletednoISO-8601 duration"P50Y"

jobs.retention.taskRetention.acceptedAgeLimit

(jobs.retention.taskRetention was formerly called deleteOrdersJob)

Max age for orders with status ACCEPTEDnoISO-8601 duration"0 0 2 * * ?"
jobs.retention.taskRetention.batchSizeNumber of orders to process at the same timenoint100
jobs.retention.taskRetention.cancelledAgeLimitMax age for orders with status CANCELLEDnoISO-8601 durationjobs.retention.taskRetention.defaultAgeLimit
jobs.retention.taskRetention.defaultAgeLimitDefault max age for an order before it is deleted. This value is overridden if a max age is set for a specific order status. E.g. acceptedAgeLimit. This value is also used for determining max age for errand due dates and. SWF will get the longest possible value for either defaultAgeLimit, pendingAgeLimit or totalAgeLimit (if set) and set to maximum due date time.noISO-8601 duration"P50Y"
jobs.retention.taskRetention.delayDelay before running first batch job or when to schedule with cron expressionnoISO-8601 duration"PT0S"
jobs.retention.taskRetention.enabledEnable or disable the entire delete orders jobnobooleanfalse
jobs.retention.taskRetention.expiredAgeLimitMax age for orders with status EXPIREDnoISO-8601 durationjobs.retention.taskRetention.defaultAgeLimit
jobs.retention.taskRetention.failedAgeLimitMax age for orders with status FAILEDnoISO-8601 durationjobs.retention.taskRetention.defaultAgeLimit
jobs.retention.taskRetention.pendingAgeLimitMax age for orders with status PENDINGnoISO-8601 durationjobs.retention.taskRetention.defaultAgeLimit
jobs.retention.taskRetention.rejectedAgeLimitMax age for orders with status REJECTEDnoISO-8601 durationjobs.retention.taskRetention.defaultAgeLimit
jobs.retention.taskRetention.scheduleDelay between batch jobs, as ISO-8601 duration or cron expressionnoISO-8601 duration or cron expression"0 0 0,1,2,3,4,5 * * ?"
jobs.retention.taskRetention.statusFilterComma-separated string of order status values;
ACCEPTED, CANCELLED, EXPIRED, FAILED, PENDING, REJECTED
nostringnone
jobs.retention.taskRetention.totalAgeLimitMaximum total age of an errand, regardless of status. When set to null, errands will not have a maximum total age.noISO-8601 durationjobs.retention.taskRetention.defaultAgeLimit

jobs.reminders.taskExpirationReminder.batchSize

(jobs.reminders.taskExpirationReminder was formerly called orderReminder)

Order reminder batch sizenoint25
jobs.reminders.taskExpirationReminder.timeBeforeExpirationSend a reminder number of days before the order expires.noISO-8601 duration"P2D"
jobs.reminders.taskExpirationReminder.delayDelay before running first batch job or when to schedule with cron expressionnostring"PT3S"
jobs.reminders.taskExpirationReminder.enabledEnable reminder notificationsnobooleanfalse
jobs.reminders.taskExpirationReminder.scheduleThe delay between batch jobsnoISO-8601 duration or cron expression"PT35S"

jobs.reminders.fileRetentionReminder.enabled

(jobs.reminders.fileRetentionReminder was formerly called orderDeletionReminderJob)

Whether or not the job is enabled. If the document retention job is disabled, the order deletion reminder job will be disabled as wellnobooleanfalse
jobs.reminders.fileRetentionReminder.delayThe delay of the job startupnoISO-8601 duration"PT1M"
jobs.reminders.fileRetentionReminder.scheduleThe schedule of the job in ISO-8601 or cron expressionnoISO-8601 duration or cron expression"PT5M"
jobs.reminders.fileRetentionReminder.batchSizeThe number of users that will receive an email for that job run.noint1000
jobs.reminders.fileRetentionReminder.timeBeforeDeletionHow long before the document retention job schedules a document deletion.noISO-8601 duration"P2D"

jobs.operations.taskExpirationOperations.batchSize

(jobs.operations.taskExpirationOperations was formerly called expireOrdersJob)

Number of documents to process at the same timenoint100
jobs.operations.taskExpirationOperations.delayDelay in ISO-8601 before running first batch job or when to schedule with cron expressionnostring"PT0S"
jobs.operations.taskExpirationOperations.enabledEnable or disable expiring orders jobnobooleanfalse
jobs.operations.taskExpirationOperations.scheduleThe delay between batch jobsnoISO-8601 duration or cron expression"0 0,30 * * * ?"
logNetworkActivityEnable TCP logging for incoming HTTP requestsnobooleanfalse
logoutUrlBrowser redirects to this URL on logoutyesstringnone
metrics.commonTags.applicationWhat the SWF application is called in the exported metricsnostringdetermined by Vert.X
metrics.elasticSearch.autoCreateIndexCreate index automaticallynobooleandetermined by Vert.X
metrics.elasticSearch.enabledWhether metrics are enablednobooleanfalse
metrics.elasticSearch.hostHost to export metrics toyes, if metrics is enabledstringnone
metrics.elasticSearch.passwordPassword for metrics export useryes, if metrics is enabledstringnone
metrics.elasticSearch.stepHow often to push metricsnoISO-8601 durationdetermined by Vert.X
metrics.elasticSearch.usernameUsername for metrics export useryes, if metrics is enabledstringnone
metrics.enableClassLoaderMetricsWhether to export class loader metricsnobooleanfalse
metrics.enableJvmGcMetricsWhether to export JVM garbage collection metricsnobooleanfalse
metrics.enableJvmMemoryMetricsWhether to export JVM memory metricsnobooleanfalse
metrics.enableJvmThreadMetricsWhether to export JVM thread metricsnobooleanfalse
metrics.enableProcessorMetricsWhether to export processor metricsnobooleanfalse
metrics.enableVertxMetricsWhether to export Vert.X metricsnobooleanfalse
notifications.downloadLinkDirect download link for document in an emailnobooleantrue
orderOptions.enableInviteUrlTargetOptionWhen enabled, solicitors get the option to set Invite URL target in the UI. Read more here.nobooleanfalse
orderOptions.enableNotifyAllSignersOptionWhen enabled, all signers will be notified when everyone in the errand signs the document. All signers will also be able to download the documentnobooleanfalse
orderOptions.defaultInviteUrlTargetSets the default value of the Invite URL target in the UI. Available options are SWF or SIGN_SERVICE. Read more here.nostring"SWF"
orderOptions.defaultSignerNotificationDefault value for whether all signers should be able to download the final document.nobooleanfalse
primaryServerInterfaceListening interface for the web app APInostring"0.0.0.0"
primaryServerPortListening port for the web app APInoint8080
publicUrlPublic URL for the Signing Workflow service. For example https://swf.se:8080/yesstringnone
resourcesRootLocation of resource filesnostring"resources" (relative to installation root)
saml.assertionConsumerServiceUrlSAML Assertion consumer URLyesstringnone
saml.attributes.authorityAuthority attributenostring"description"
saml.attributes.firstNameFirst name attributenostring"cn"
saml.attributes.lastNameLast name attributenostring"sn"
saml.attributes.mailMail attributenostring"mail"
saml.attributes.sourceSource attributenostring"source"
saml.defaultLocaleSAML locale, for example "sv" for Swedishnostring"sv"
saml.issuerIdSAML issuer IDyesstringnone
saml.postSsoUrlSAML identity provider request consumer URLyesstringnone
saml.roles.solicitorThis value for the authority attribute indicates Solicitor permissionsyesstring"role:solicitor"
saml.skewTimeSAML skew time in millisecondsnoint30000
saml.trustedCertificatesList of files containing trusted certificates for SAML ticket validation, for example
"saml": { "trustedCertificates": [ "/path/saml.pem" ] }
yesstring arraynone
saml.trustedIssuersList of trusted issuers, for example 
"saml": { "trustedIssuers": [ "stockholm" ] }
yesstring arraynone
scanPeriodHow often to look for config changes, in millisecondsnoint5000
sessionTimeoutSession timeout in millisecondsnoint14 400 000 (4 hours)
signingTasks.bodyLimitMax upload file size in bytesnoint2 097 152 (2 MiB)
signingTasks.documentLocationIdFile storage ID. Change this to a unique value every time the File storage directory is changednoint1
signingTasks.documentMimeTypeMime type header when downloading a signed documentnostring"application/octet-stream"
signingTasks.usePdfAFlavoursAllow these PDF/A flavours. See PDF/A validationnostring array[]
signingTasks.disableDocumentChecksDisables all document validations except the PDF flavour validation. See PDF validation for more information.nobooleanfalse
signingTasks.rejectInvalidPdfAReject invalid PDF/A file selectionsnobooleanfalse
signingTasks.fileDirectoryPath to where to store signed documentsnostring"files" (relative to installation root)
signingService.urlURL of Signing Serviceyesstringnone
smtp.client.hostnameSMTP hostnameyes (if smtp is enabled)stringnone
smtp.client.keyStoreKey store file to trust server certificatesnostringnone
smtp.client.keyStorePasswordPassword for key store fileyes, if keyStore is encryptedstringnone
smtp.client.loginUse authentication on the SMTP servicenostring: DISABLED, NONE, REQUIRED"REQUIRED"
smtp.client.passwordSMTP Passwordyes (if smtp is enabled)stringnone
smtp.client.portSMTP portnoint587
smtp.client.sslUse TLS when connecting to mail servernobooleantrue
smtp.client.starttlsUse StartTLS (DISABLED, OPTIONAL, or REQUIRED)nostring"REQUIRED"
smtp.client.trustAllTrust all certificates when connecting to mail servernobooleanfalse
smtp.client.usernameSMTP Usernameyes (if smtp is enabled)stringnone
smtp.enabledSMTP notifications enablednobooleanfalse
smtp.fromAddressSender address to use for SMTPyes (if smtp is enabled)stringnone
sourceCookie.cookieNameCookie namenostring"swfSource"
sourceCookie.domainDomain for the cookie. Set to null to use server domainnostringnull
sourceCookie.enabledEnable source cookie. It is a cookie that contains the source value for the user.
The syntax for the value is; source=EXTERNAL
nobooleanfalse
sourceCookie.isHttpOnlyHTTP-only cookienobooleantrue
sourceCookie.isSecureSecure cookie. Can only be used with HTTPS.nobooleantrue
sourceCookie.maxAgeCookie expiration. Set to null to create a session cookie.noISO-8601 durationnull
sourceCookie.pathCookie pathnostring"/"
sourceCookie.sameSiteSet same site.nostring: NONE, LAX, STRICTnull
tabs.internal.enabledWhether to enable the internal users tabnobooleantrue
tabs.external.enabledWhether to enable the external users tabnobooleantrue
tabs.email.enabledWhether to enable the email users tabnobooleantrue
tabs.email.jwtExpireAfterExpires JWT after given period. The JWT is used when sending an e-mail to the signer which contains an URL to autologin to SWF.noISO-8601 duration"P7D"
tabs.email.jwtSigningCertificatePasswordPassword for tabs.email.jwtSigningCertificatePathnostring(empty value)
tabs.email.jwtSigningCertificatePathPath to a certificate to use for creating the JWTyes, if tabs.email.enabled = truestringnone
tagsCustom tags that can be used to tag signing ordersnostring array[ ]
tenantIdTenant id in a multi-tenant setupnostring"default"
users.externalUserAttributes.firstNameFirst name attribute in external user query resultnostring"cn"
users.externalUserAttributes.infoInfo attribute in external user query resultnostring"o"
users.externalUserAttributes.lastNameLast name attribute in external user query resultnostring"sn"
users.externalUserAttributes.mailMail attribute in external user query resultnostring"mail"
users.externalUserAttributes.mobileMobile attribute in external user query resultnostring"mobile"
users.externalUserLookupURL for external user lookupyesstringnone
users.internalUserAttributes.departmentDepartment attribute in internal user query resultnostring"ou"
users.internalUserAttributes.firstNameFirst name attribute in internal user query resultnostring"cn"
users.internalUserAttributes.lastNameLast name attribute in internal user query resultnostring"sn"
users.internalUserAttributes.mailMail attribute in internal user query resultnostring"mail"
users.internalUserAttributes.mobileMobile attribute in internal user query resultnostring"mobile"
users.internalUserAttributes.organizationOrganization attribute in internal user query resultnostring"o"
users.internalUserAttributes.userIdUser ID attribute in internal user query resultnostring"uid"
users.internalUserLookupURL for internal user lookupyesstringnone
users.internalUserSearchURL for internal user searchyesstringnone
users.sslKeyFilePath to private key for TLS authenticationnostringnone
users.sslKeyFileTypeKey file typenostring"pkcs12"
users.sslKeyPasswordPassword for the private TLS keyyes, if sslKeyFile is encryptedstring"dummy"
users.sslTrustFileCustom trust storenostring""
users.sslTrustFileTypeTrust store type string"pkcs12"
users.useSslUse TLS towards User Query Servicenobooleanfalse
users.useSslClientCertUse TLS Client Auth towards User Query Servicenobooleanfalse
users.useSslTrustAllTrust all TLS server certificatesnobooleanfalse
validateSignaturesService.basicAuth.basicAuthPasswordBasicAuth password when accessing PAS for signature validationyes, if basic auth is enabledstring""
validateSignaturesService.basicAuth.basicAuthUsernameBasicAuth username when accessing PAS for signature validationyes, if basic auth is enabledstring""
validateSignaturesService.basicAuth.enabledEnabled BasicAuth when accessing PAS for signature validationnobooleanfalse
validateSignaturesService.enabledEnable signature validationnobooleanfalse
validateSignaturesService.urlURL for the validation endpoint in PAS. Note that this request is made from the application; not the user's browser.yes, if signature validation is enabledstring""
webHook.connectionTimeoutTimeout for the http POSTnoISO-8601 duration"PT30S"
webHook.enabledEnable webhooksnobooleanfalse
webHook.endpointEndpoint for webhookyes, if webhooks are enabledstringnone
webHook.keyExtra query parameter in endpoint URLnostringnone
webHook.secretSecret to create header signaturenostringnone
webHook.sslKeyFilePrivate key for TLS authenticationyes, if using SSLstring"update-ssl-key-file-configuration"
webHook.sslKeyFileTypeKey file type, for example pkcs12nostringnone
webHook.sslKeyPasswordPassword for the private TLS keyyes, if sslKeyFile is encryptedstringnone
webHook.sslTrustFileCertificate fileyes, if using client authentication string"update-ssl-trust-file-configuration"
webHook.sslTrustFileTypeTrust file type, for example pkcs12nostringnone
webHook.useSslClientCertUse TLS Client authentication toward webhook servicenobooleanfalse
webHook.useSslTrustAllTrust all TLS server certificatesnobooleantrue
webRootRoot of web contentnostring"public" (relative to installation root)