/*
 *  Copyright (c) 2011-2019 The original author or authors
 *
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  and Apache License v2.0 which accompanies this distribution.
 *
 *       The Eclipse Public License is available at
 *       http://www.eclipse.org/legal/epl-v10.html
 *
 *       The Apache License v2.0 is available at
 *       http://www.opensource.org/licenses/apache2.0.php
 *
 *  You may elect to redistribute this code under either of these licenses.
 */

package io.vertx.ext.mail;

import io.vertx.codegen.annotations.DataObject;
import io.vertx.core.json.JsonObject;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


This represents the options used to perform DKIM Signature signing action. See: https://tools.ietf.org/html/rfc6376
Author:Lin Gao
/** * * This represents the options used to perform DKIM Signature signing action. * * See: https://tools.ietf.org/html/rfc6376 * * @author <a href="mailto: aoingl@gmail.com">Lin Gao</a> */
@DataObject(generateConverter = true) public class DKIMSignOptions { private static final List<String> DEFAULT_HEADERS = new ArrayList<>(); static { DEFAULT_HEADERS.add("From"); DEFAULT_HEADERS.add("Reply-to"); DEFAULT_HEADERS.add("Subject"); DEFAULT_HEADERS.add("Date"); DEFAULT_HEADERS.add("To"); DEFAULT_HEADERS.add("Cc"); DEFAULT_HEADERS.add("Content-Type"); DEFAULT_HEADERS.add("Message-ID"); } private String privateKey; private String privateKeyPath; private DKIMSignAlgorithm signAlgo = DKIMSignAlgorithm.RSA_SHA256; private List<String> signedHeaders; private String sdid; private String auid; private String selector; private CanonicalizationAlgorithm headerCanonAlgo = CanonicalizationAlgorithm.SIMPLE; private CanonicalizationAlgorithm bodyCanonAlgo = CanonicalizationAlgorithm.SIMPLE; private int bodyLimit = -1; private boolean signatureTimestamp; private long expireTime = -1L; private List<String> copiedHeaders;
Default Constructor.
/** * Default Constructor. */
public DKIMSignOptions() { signedHeaders = new ArrayList<>(DEFAULT_HEADERS); } public DKIMSignOptions (DKIMSignOptions other) { privateKey = other.privateKey; privateKeyPath = other.privateKeyPath; signAlgo = other.signAlgo; if (other.signedHeaders != null && !other.signedHeaders.isEmpty()) { signedHeaders = new ArrayList<>(other.signedHeaders); } else { signedHeaders = new ArrayList<>(DEFAULT_HEADERS); } sdid = other.sdid; auid = other.auid; selector = other.selector; headerCanonAlgo = other.headerCanonAlgo; bodyCanonAlgo = other.bodyCanonAlgo; bodyLimit = other.bodyLimit; signatureTimestamp = other.signatureTimestamp; expireTime = other.expireTime; if (other.copiedHeaders != null && !other.copiedHeaders.isEmpty()) { copiedHeaders = new ArrayList<>(other.copiedHeaders); } }
Constructor from a JsonObject.
Params:
  • config – the JsonObject configuration
/** * Constructor from a JsonObject. * * @param config the JsonObject configuration */
public DKIMSignOptions(JsonObject config) { DKIMSignOptionsConverter.fromJson(config, this); if (signedHeaders == null || signedHeaders.isEmpty()) { signedHeaders = new ArrayList<>(DEFAULT_HEADERS); } }
Converts to JsonObject
Returns:the JsonObject which represents current configuration.
/** * Converts to JsonObject * * @return the JsonObject which represents current configuration. */
public JsonObject toJson() { JsonObject json = new JsonObject(); DKIMSignOptionsConverter.toJson(this, json); return json; }
Gets the signing algorithm.
Returns:the signing algorithm
/** * Gets the signing algorithm. * * @return the signing algorithm */
public DKIMSignAlgorithm getSignAlgo() { return signAlgo; }
Gets the PKCS#8 format private key used to sign the email.
Returns:the private key
/** * Gets the PKCS#8 format private key used to sign the email. * * @return the private key */
public String getPrivateKey() { return privateKey; }
Sets the PKCS#8 format private key used to sign the email.
Params:
  • privateKey – the base64 encdoing private key content.
Returns:a reference to this, so the API can be used fluently
/** * Sets the PKCS#8 format private key used to sign the email. * * @param privateKey the base64 encdoing private key content. * @return a reference to this, so the API can be used fluently */
public DKIMSignOptions setPrivateKey(String privateKey) { this.privateKey = privateKey; return this; }
Gets the PKCS#8 format private key file path.
Returns:the PKCS#8 format private key file path.
/** * Gets the PKCS#8 format private key file path. * * @return the PKCS#8 format private key file path. */
public String getPrivateKeyPath() { return privateKeyPath; }
Sets the PKCS#8 format private key file path.
Params:
  • privateKeyPath – The PKCS#8 format private key file path.
Returns:a reference to this, so the API can be used fluently
/** * Sets the PKCS#8 format private key file path. * * @param privateKeyPath The PKCS#8 format private key file path. * @return a reference to this, so the API can be used fluently */
public DKIMSignOptions setPrivateKeyPath(String privateKeyPath) { this.privateKeyPath = privateKeyPath; return this; }
Sets the signing algorithm.
Params:
  • signAlgo – the signing algorithm
Returns:a reference to this, so the API can be used fluently
/** * Sets the signing algorithm. * * @param signAlgo the signing algorithm * @return a reference to this, so the API can be used fluently */
public DKIMSignOptions setSignAlgo(DKIMSignAlgorithm signAlgo) { this.signAlgo = signAlgo; return this; }
Gets the email signedHeaders used to sign. The order in the list matters.
Returns:the email signedHeaders used to sign
/** * Gets the email signedHeaders used to sign. * * The order in the list matters. * * @return the email signedHeaders used to sign */
public List<String> getSignedHeaders() { return signedHeaders; }
Sets the email signedHeaders used to sign.
Params:
  • signedHeaders – the email signedHeaders
Returns:a reference to this, so the API can be used fluently
/** * Sets the email signedHeaders used to sign. * * @param signedHeaders the email signedHeaders * @return a reference to this, so the API can be used fluently */
public DKIMSignOptions setSignedHeaders(List<String> signedHeaders) { this.signedHeaders = signedHeaders; return this; }
Adds the signed header
Params:
  • header – the header name
Returns:a reference to this, so the API can be used fluently
/** * Adds the signed header * * @param header the header name * @return a reference to this, so the API can be used fluently */
public DKIMSignOptions addSignedHeader(String header) { if (this.signedHeaders == null) { this.signedHeaders = new ArrayList<>(); } this.signedHeaders.add(header); return this; }
Gets the Singing Domain Identifier(SDID).
Returns:the signing domain identifier
/** * Gets the Singing Domain Identifier(SDID). * * @return the signing domain identifier */
public String getSdid() { return sdid; }
Sets the Singing Domain Identifier(SDID).
Params:
  • sdid – the signing domain identifier
Returns:a reference to this, so the API can be used fluently
/** * Sets the Singing Domain Identifier(SDID). * * @param sdid the signing domain identifier * @return a reference to this, so the API can be used fluently */
public DKIMSignOptions setSdid(String sdid) { this.sdid = sdid; return this; }
Gets the selector used to query public key.
Returns:the selector
/** * Gets the selector used to query public key. * * @return the selector */
public String getSelector() { return selector; }
Sets the selector used to query the public key.
Params:
  • selector – the selector
Returns:a reference to this, so the API can be used fluently
/** * Sets the selector used to query the public key. * * @param selector the selector * @return a reference to this, so the API can be used fluently */
public DKIMSignOptions setSelector(String selector) { this.selector = selector; return this; }
Gets the canonicalization algorithm for signed headers.
Returns:the canonicalization algorithm for signed headers
/** * Gets the canonicalization algorithm for signed headers. * * @return the canonicalization algorithm for signed headers */
public CanonicalizationAlgorithm getHeaderCanonAlgo() { return headerCanonAlgo; }
Sets the canonicalization algorithm for signed headers.
Params:
  • headerCanonAlgo – the canonicalization algorithm for signed headers
Returns:a reference to this, so the API can be used fluently
/** * Sets the canonicalization algorithm for signed headers. * * @param headerCanonAlgo the canonicalization algorithm for signed headers * @return a reference to this, so the API can be used fluently */
public DKIMSignOptions setHeaderCanonAlgo(CanonicalizationAlgorithm headerCanonAlgo) { this.headerCanonAlgo = headerCanonAlgo; return this; }
Gets the canonicalization algorithm for mail body.
Returns:the canonicalization algorithm for mail body
/** * Gets the canonicalization algorithm for mail body. * * @return the canonicalization algorithm for mail body */
public CanonicalizationAlgorithm getBodyCanonAlgo() { return bodyCanonAlgo; }
Sets the canonicalization algorithm for mail body.
Params:
  • bodyCanonAlgo – the canonicalization algorithm for mail body
Returns:a reference to this, so the API can be used fluently
/** * Sets the canonicalization algorithm for mail body. * * @param bodyCanonAlgo the canonicalization algorithm for mail body * @return a reference to this, so the API can be used fluently */
public DKIMSignOptions setBodyCanonAlgo(CanonicalizationAlgorithm bodyCanonAlgo) { this.bodyCanonAlgo = bodyCanonAlgo; return this; }
Gets the Agent or User Identifier(AUID)
Returns:the auid
/** * Gets the Agent or User Identifier(AUID) * * @return the auid */
public String getAuid() { return auid; }
Sets the Agent or User Identifier(AUID)
Params:
  • auid – the AUID
Returns:a reference to this, so the API can be used fluently
/** * Sets the Agent or User Identifier(AUID) * * @param auid the AUID * @return a reference to this, so the API can be used fluently */
public DKIMSignOptions setAuid(String auid) { this.auid = auid; return this; }
Gets the body limit to sign.
Returns:the body limit
/** * Gets the body limit to sign. * * @return the body limit */
public int getBodyLimit() { return bodyLimit; }
Sets the body limit to sign.
Params:
  • bodyLimit – the body limit
Returns:a reference to this, so the API can be used fluently
/** * Sets the body limit to sign. * * @param bodyLimit the body limit * @return a reference to this, so the API can be used fluently */
public DKIMSignOptions setBodyLimit(int bodyLimit) { if (bodyLimit <= 0) { throw new IllegalArgumentException("Body Limit to calculate the hash must be larger than 0"); } this.bodyLimit = bodyLimit; return this; }
Adds signature sign timestamp or not.
Returns:true if yes, false otherwise
/** * Adds signature sign timestamp or not. * * @return true if yes, false otherwise */
public boolean isSignatureTimestamp() { return signatureTimestamp; }
Sets to enable or disable signature sign timestmap. Default is disabled.
Params:
  • signatureTimestamp – if enable signature sign timestamp or not
Returns:a reference to this, so the API can be used fluently
/** * Sets to enable or disable signature sign timestmap. Default is disabled. * * @param signatureTimestamp if enable signature sign timestamp or not * @return a reference to this, so the API can be used fluently */
public DKIMSignOptions setSignatureTimestamp(boolean signatureTimestamp) { this.signatureTimestamp = signatureTimestamp; return this; }
Gets the expire time in seconds when the signature sign will be expired.
Returns:expire time of signature. Positive value means the signature sign timestamp is enabled.
/** * Gets the expire time in seconds when the signature sign will be expired. * * @return expire time of signature. Positive value means the signature sign timestamp is enabled. */
public long getExpireTime() { return expireTime; }
Sets the expire time in seconds when the signature sign will be expired. Success call of this method indicates that the signature sign timestamp is enabled.
Params:
  • expireTime – the expire time in seconds
Returns:a reference to this, so the API can be used fluently
/** * Sets the expire time in seconds when the signature sign will be expired. * * Success call of this method indicates that the signature sign timestamp is enabled. * * @param expireTime the expire time in seconds * @return a reference to this, so the API can be used fluently */
public DKIMSignOptions setExpireTime(long expireTime) { if (expireTime <= 0) { throw new IllegalArgumentException("Expire time must be larger than 0"); } this.expireTime = expireTime; return this; }
Gets the copied headers used in DKIM.
Returns:the copied headers
/** * Gets the copied headers used in DKIM. * * @return the copied headers */
public List<String> getCopiedHeaders() { return copiedHeaders; }
Sets the copied headers used in DKIM.
Params:
  • copiedHeaders – the copied headers
Returns:a reference to this, so the API can be used fluently
/** * Sets the copied headers used in DKIM. * * @param copiedHeaders the copied headers * @return a reference to this, so the API can be used fluently */
public DKIMSignOptions setCopiedHeaders(List<String> copiedHeaders) { this.copiedHeaders = copiedHeaders; return this; }
Adds a copied header.
Params:
  • header – an email header
@returnareference to this, so the API can be used fluently
/** * Adds a copied header. * * @param header an email header * @returna reference to this, so the API can be used fluently */
public DKIMSignOptions addCopiedHeader(String header) { if (this.copiedHeaders == null) { this.copiedHeaders = new ArrayList<>(); } if (!this.copiedHeaders.contains(header)) { this.copiedHeaders.add(header); } return this; } private List<Object> getList() { return Arrays.asList(privateKey, privateKeyPath, signAlgo, signedHeaders, sdid, selector, headerCanonAlgo, bodyCanonAlgo , auid, bodyLimit, signatureTimestamp, expireTime, copiedHeaders); } /* * (non-Javadoc) * * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object o) { if (this == o) { return true; } if (!(o instanceof DKIMSignOptions)) { return false; } final DKIMSignOptions ops = (DKIMSignOptions) o; return getList().equals(ops.getList()); } /* * (non-Javadoc) * * @see java.lang.Object#hashCode() */ @Override public int hashCode() { return getList().hashCode(); } }