68 lines
2.2 KiB
TypeScript
68 lines
2.2 KiB
TypeScript
import * as plugins from '../../plugins.js';
|
|
import type { UnifiedEmailServer } from '../routing/classes.unified.email.server.js';
|
|
|
|
interface Headers {
|
|
[key: string]: string;
|
|
}
|
|
|
|
interface IEmailSignJobOptions {
|
|
domain: string;
|
|
selector: string;
|
|
headers: Headers;
|
|
body: string;
|
|
}
|
|
|
|
export class EmailSignJob {
|
|
emailServerRef: UnifiedEmailServer;
|
|
jobOptions: IEmailSignJobOptions;
|
|
|
|
constructor(emailServerRef: UnifiedEmailServer, options: IEmailSignJobOptions) {
|
|
this.emailServerRef = emailServerRef;
|
|
this.jobOptions = options;
|
|
}
|
|
|
|
async loadPrivateKey(): Promise<string> {
|
|
const keyInfo = await this.emailServerRef.dkimCreator.readDKIMKeys(this.jobOptions.domain);
|
|
return keyInfo.privateKey;
|
|
}
|
|
|
|
public async getSignatureHeader(emailMessage: string): Promise<string> {
|
|
const signResult = await plugins.dkimSign(emailMessage, {
|
|
// Optional, default canonicalization, default is "relaxed/relaxed"
|
|
canonicalization: 'relaxed/relaxed', // c=
|
|
|
|
// Optional, default signing and hashing algorithm
|
|
// Mostly useful when you want to use rsa-sha1, otherwise no need to set
|
|
algorithm: 'rsa-sha256',
|
|
|
|
// Optional, default is current time
|
|
signTime: new Date(), // t=
|
|
|
|
// Keys for one or more signatures
|
|
// Different signatures can use different algorithms (mostly useful when
|
|
// you want to sign a message both with RSA and Ed25519)
|
|
signatureData: [
|
|
{
|
|
signingDomain: this.jobOptions.domain, // d=
|
|
selector: this.jobOptions.selector, // s=
|
|
// supported key types: RSA, Ed25519
|
|
privateKey: await this.loadPrivateKey(), // k=
|
|
|
|
// Optional algorithm, default is derived from the key.
|
|
// Overrides whatever was set in parent object
|
|
algorithm: 'rsa-sha256',
|
|
|
|
// Optional signature specifc canonicalization, overrides whatever was set in parent object
|
|
canonicalization: 'relaxed/relaxed', // c=
|
|
|
|
// Maximum number of canonicalized body bytes to sign (eg. the "l=" tag).
|
|
// Do not use though. This is available only for compatibility testing.
|
|
// maxBodyLength: 12345
|
|
},
|
|
],
|
|
});
|
|
const signature = signResult.signatures;
|
|
return signature;
|
|
}
|
|
}
|