@lilaquadrat/studio 10.0.0-beta.8 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/eslint.config.js +146 -0
- package/lib/fastify-plugins.d.ts +6 -0
- package/lib/fastify-plugins.js +7 -0
- package/lib/fastify-plugins.js.map +1 -0
- package/lib/helpers.d.ts +4 -2
- package/lib/helpers.js +13 -2
- package/lib/helpers.js.map +1 -1
- package/lib/main.d.ts +1 -3
- package/lib/main.js +7 -3
- package/lib/main.js.map +1 -1
- package/lib/models.d.ts +4 -4
- package/lib/models.js +4 -4
- package/lib/models.js.map +1 -1
- package/lib/services.d.ts +5 -5
- package/lib/services.js +5 -13
- package/lib/services.js.map +1 -1
- package/lib/src/Immutable.class.d.ts +8 -1
- package/lib/src/Immutable.class.js +52 -8
- package/lib/src/Immutable.class.js.map +1 -1
- package/lib/src/ShareClientFactory.class.d.ts +1 -3
- package/lib/src/ShareClientFactory.class.js +1 -9
- package/lib/src/ShareClientFactory.class.js.map +1 -1
- package/lib/src/classes/models.class.js.map +1 -1
- package/lib/src/classes/modelv2.class.d.ts +2 -0
- package/lib/src/classes/modelv2.class.js +1 -1
- package/lib/src/classes/modelv2.class.js.map +1 -1
- package/lib/src/classes/mongo.class.js +4 -14
- package/lib/src/classes/mongo.class.js.map +1 -1
- package/lib/src/functions/handleError.d.ts +2 -3
- package/lib/src/functions/handleError.js +3 -16
- package/lib/src/functions/handleError.js.map +1 -1
- package/lib/src/functions/optionsHelper.d.ts +4 -4
- package/lib/src/functions/optionsHelper.js +5 -4
- package/lib/src/functions/optionsHelper.js.map +1 -1
- package/lib/src/functions/respondCode.d.ts +2 -1
- package/lib/src/functions/respondCode.js +1 -1
- package/lib/src/functions/respondCode.js.map +1 -1
- package/lib/src/helpers/ControllerHelper.d.ts +73 -0
- package/lib/src/helpers/ControllerHelper.js +242 -0
- package/lib/src/helpers/ControllerHelper.js.map +1 -0
- package/lib/src/helpers/EnvMapper.js +1 -0
- package/lib/src/helpers/EnvMapper.js.map +1 -0
- package/lib/src/helpers/auth0config.d.ts +6 -0
- package/lib/src/helpers/auth0config.js +23 -0
- package/lib/src/helpers/auth0config.js.map +1 -0
- package/lib/src/helpers/authPlugin.d.ts +29 -0
- package/lib/src/helpers/authPlugin.js +77 -0
- package/lib/src/helpers/authPlugin.js.map +1 -0
- package/lib/src/helpers/cacheHelper.d.ts +69 -0
- package/lib/src/helpers/cacheHelper.js +235 -0
- package/lib/src/helpers/cacheHelper.js.map +1 -0
- package/lib/src/helpers/createSasToken.d.ts +0 -2
- package/lib/src/helpers/createSasToken.js +35 -32
- package/lib/src/helpers/createSasToken.js.map +1 -1
- package/lib/src/helpers/getSecrets.d.ts +1 -1
- package/lib/src/helpers/getSecrets.js +10 -12
- package/lib/src/helpers/getSecrets.js.map +1 -1
- package/lib/src/helpers/limiterPlugin.d.ts +9 -0
- package/lib/src/helpers/limiterPlugin.js +72 -0
- package/lib/src/helpers/limiterPlugin.js.map +1 -0
- package/lib/src/helpers/loggingPlugin.d.ts +30 -0
- package/lib/src/helpers/loggingPlugin.js +87 -0
- package/lib/src/helpers/loggingPlugin.js.map +1 -0
- package/lib/src/helpers/queryAssertionPlugin.d.ts +3 -0
- package/lib/src/helpers/queryAssertionPlugin.js +20 -0
- package/lib/src/helpers/queryAssertionPlugin.js.map +1 -0
- package/lib/src/helpers/safeObjectId.d.ts +1 -1
- package/lib/src/helpers/safeObjectId.js +5 -1
- package/lib/src/helpers/safeObjectId.js.map +1 -1
- package/lib/src/helpers/storageSdkFactory.d.ts +2 -0
- package/lib/src/helpers/storageSdkFactory.js +11 -0
- package/lib/src/helpers/storageSdkFactory.js.map +1 -0
- package/lib/src/helpers/studioAppPlugin.d.ts +3 -0
- package/lib/src/helpers/studioAppPlugin.js +16 -0
- package/lib/src/helpers/studioAppPlugin.js.map +1 -0
- package/lib/src/logger.js +57 -8
- package/lib/src/logger.js.map +1 -1
- package/lib/src/models/access.model.d.ts +14 -3
- package/lib/src/models/access.model.js +7 -9
- package/lib/src/models/access.model.js.map +1 -1
- package/lib/src/models/customers.model.js +14 -4
- package/lib/src/models/customers.model.js.map +1 -1
- package/lib/src/models/design.model.d.ts +4 -0
- package/lib/src/models/design.model.js +58 -0
- package/lib/src/models/design.model.js.map +1 -0
- package/lib/src/models/domain.model.js +1 -1
- package/lib/src/models/domain.model.js.map +1 -1
- package/lib/src/models/editor.model.js +7 -0
- package/lib/src/models/editor.model.js.map +1 -1
- package/lib/src/models/emailLimit.model.d.ts +4 -0
- package/lib/src/models/emailLimit.model.js +31 -0
- package/lib/src/models/emailLimit.model.js.map +1 -0
- package/lib/src/models/hosting.model.js +1 -3
- package/lib/src/models/hosting.model.js.map +1 -1
- package/lib/src/models/hostingSettings.model.js +6 -4
- package/lib/src/models/hostingSettings.model.js.map +1 -1
- package/lib/src/models/invoice.model.d.ts +4 -0
- package/lib/src/models/invoice.model.js +235 -0
- package/lib/src/models/invoice.model.js.map +1 -0
- package/lib/src/models/mailFrom.model.js +51 -10
- package/lib/src/models/mailFrom.model.js.map +1 -1
- package/lib/src/models/project.model.js +2 -4
- package/lib/src/models/project.model.js.map +1 -1
- package/lib/src/models/publish-method.model.js +79 -430
- package/lib/src/models/publish-method.model.js.map +1 -1
- package/lib/src/models/publish.model.js +6 -0
- package/lib/src/models/publish.model.js.map +1 -1
- package/lib/src/models/storage.model.js +23 -5
- package/lib/src/models/storage.model.js.map +1 -1
- package/lib/src/models/structure.model.js +40 -0
- package/lib/src/models/structure.model.js.map +1 -1
- package/lib/src/models/upload.model.js +38 -2
- package/lib/src/models/upload.model.js.map +1 -1
- package/lib/src/prompts/textGeneration.js +88 -0
- package/lib/src/prompts/textGeneration.js.map +1 -1
- package/lib/src/prompts/textGenerationMulti.js +78 -44
- package/lib/src/prompts/textGenerationMulti.js.map +1 -1
- package/lib/src/services/access.service.d.ts +132 -33
- package/lib/src/services/access.service.js +270 -92
- package/lib/src/services/access.service.js.map +1 -1
- package/lib/src/services/ai.service.d.ts +4 -3
- package/lib/src/services/ai.service.js +22 -29
- package/lib/src/services/ai.service.js.map +1 -1
- package/lib/src/services/auth.service.d.ts +11 -0
- package/lib/src/services/auth.service.js +70 -0
- package/lib/src/services/auth.service.js.map +1 -0
- package/lib/src/services/conf.service.d.ts +3 -31
- package/lib/src/services/conf.service.js +58 -167
- package/lib/src/services/conf.service.js.map +1 -1
- package/lib/src/services/customers.service.d.ts +8 -4
- package/lib/src/services/customers.service.js +34 -7
- package/lib/src/services/customers.service.js.map +1 -1
- package/lib/src/services/designs.service.d.ts +7 -0
- package/lib/src/services/designs.service.js +10 -0
- package/lib/src/services/designs.service.js.map +1 -0
- package/lib/src/services/domains.service.d.ts +18 -84
- package/lib/src/services/domains.service.js +91 -583
- package/lib/src/services/domains.service.js.map +1 -1
- package/lib/src/services/editor.service.d.ts +4 -0
- package/lib/src/services/editor.service.js +28 -0
- package/lib/src/services/editor.service.js.map +1 -1
- package/lib/src/services/emailLimit.service.d.ts +21 -0
- package/lib/src/services/emailLimit.service.js +51 -0
- package/lib/src/services/emailLimit.service.js.map +1 -0
- package/lib/src/services/hosting.service.d.ts +12 -24
- package/lib/src/services/hosting.service.js +32 -122
- package/lib/src/services/hosting.service.js.map +1 -1
- package/lib/src/services/hostingAdmin.service.d.ts +1 -1
- package/lib/src/services/hostingAdmin.service.js +2 -2
- package/lib/src/services/hostingAdmin.service.js.map +1 -1
- package/lib/src/services/import.service.d.ts +6 -22
- package/lib/src/services/import.service.js +63 -65
- package/lib/src/services/import.service.js.map +1 -1
- package/lib/src/services/invoices.service.d.ts +30 -0
- package/lib/src/services/invoices.service.js +265 -0
- package/lib/src/services/invoices.service.js.map +1 -0
- package/lib/src/services/jetstream.service.d.ts +5 -3
- package/lib/src/services/jetstream.service.js +63 -7
- package/lib/src/services/jetstream.service.js.map +1 -1
- package/lib/src/services/listParticipants.service.d.ts +3 -5
- package/lib/src/services/listParticipants.service.js +76 -16
- package/lib/src/services/listParticipants.service.js.map +1 -1
- package/lib/src/services/mailFrom.service.d.ts +14 -1
- package/lib/src/services/mailFrom.service.js +59 -0
- package/lib/src/services/mailFrom.service.js.map +1 -1
- package/lib/src/services/me.service.d.ts +23 -12
- package/lib/src/services/me.service.js +65 -88
- package/lib/src/services/me.service.js.map +1 -1
- package/lib/src/services/publish.service.d.ts +6 -8
- package/lib/src/services/publish.service.js +34 -32
- package/lib/src/services/publish.service.js.map +1 -1
- package/lib/src/services/publishData.service.d.ts +10 -7
- package/lib/src/services/publishData.service.js +32 -75
- package/lib/src/services/publishData.service.js.map +1 -1
- package/lib/src/services/spamAnalasys.service.d.ts +4 -4
- package/lib/src/services/spamAnalasys.service.js +36 -44
- package/lib/src/services/spamAnalasys.service.js.map +1 -1
- package/lib/src/services/storage.service.d.ts +68 -39
- package/lib/src/services/storage.service.js +378 -209
- package/lib/src/services/storage.service.js.map +1 -1
- package/lib/src/services/structures.service.d.ts +8 -1
- package/lib/src/services/structures.service.js +26 -1
- package/lib/src/services/structures.service.js.map +1 -1
- package/lib/src/services/upload.service.d.ts +8 -1
- package/lib/src/services/upload.service.js +76 -3
- package/lib/src/services/upload.service.js.map +1 -1
- package/lib/tests/groupStructuresByModel.spec.d.ts +1 -0
- package/lib/tests/groupStructuresByModel.spec.js +33 -0
- package/lib/tests/groupStructuresByModel.spec.js.map +1 -0
- package/lib/tests/listParticipantsServiceJoin.spec.d.ts +1 -0
- package/lib/tests/listParticipantsServiceJoin.spec.js +151 -0
- package/lib/tests/listParticipantsServiceJoin.spec.js.map +1 -0
- package/lib/tests/storageServiceHandleFile.spec.d.ts +1 -0
- package/lib/tests/storageServiceHandleFile.spec.js +94 -0
- package/lib/tests/storageServiceHandleFile.spec.js.map +1 -0
- package/lib/tests/storageServiceToken.spec.d.ts +1 -0
- package/lib/tests/storageServiceToken.spec.js +104 -0
- package/lib/tests/storageServiceToken.spec.js.map +1 -0
- package/lib/tests/uploadServiceCreate.spec.d.ts +1 -0
- package/lib/tests/uploadServiceCreate.spec.js +81 -0
- package/lib/tests/uploadServiceCreate.spec.js.map +1 -0
- package/package.json +30 -26
- package/lib/src/AzureBlobStorage.share.d.ts +0 -19
- package/lib/src/AzureBlobStorage.share.js +0 -162
- package/lib/src/AzureBlobStorage.share.js.map +0 -1
- package/lib/src/AzureFileStorage.share.d.ts +0 -22
- package/lib/src/AzureFileStorage.share.js +0 -139
- package/lib/src/AzureFileStorage.share.js.map +0 -1
- package/lib/src/AzureVault.d.ts +0 -14
- package/lib/src/AzureVault.js +0 -28
- package/lib/src/AzureVault.js.map +0 -1
- package/lib/src/dns.challenge.class.d.ts +0 -17
- package/lib/src/dns.challenge.class.js +0 -41
- package/lib/src/dns.challenge.class.js.map +0 -1
- package/lib/src/http.challenge.class.d.ts +0 -33
- package/lib/src/http.challenge.class.js +0 -58
- package/lib/src/http.challenge.class.js.map +0 -1
- package/lib/src/models/certificate-action.model.d.ts +0 -5
- package/lib/src/models/certificate-action.model.js +0 -230
- package/lib/src/models/certificate-action.model.js.map +0 -1
- package/lib/src/models/certificate.model.d.ts +0 -4
- package/lib/src/models/certificate.model.js +0 -96
- package/lib/src/models/certificate.model.js.map +0 -1
- package/lib/src/models/editorBase.model.d.ts +0 -4
- package/lib/src/models/editorBase.model.js +0 -39
- package/lib/src/models/editorBase.model.js.map +0 -1
- package/lib/src/services/certificates.service.js +0 -199
- package/lib/src/services/certificates.service.js.map +0 -1
- package/lib/src/services/certificatesAction.service.d.ts +0 -0
- package/lib/src/services/certificatesAction.service.js +0 -237
- package/lib/src/services/certificatesAction.service.js.map +0 -1
- package/lib/src/services/editorBase.service.d.ts +0 -46
- package/lib/src/services/editorBase.service.js +0 -161
- package/lib/src/services/editorBase.service.js.map +0 -1
- package/lib/src/services/handleFile.service.d.ts +0 -9
- package/lib/src/services/handleFile.service.js +0 -45
- package/lib/src/services/handleFile.service.js.map +0 -1
- package/lib/src/services/media.service.d.ts +0 -35
- package/lib/src/services/media.service.js +0 -418
- package/lib/src/services/media.service.js.map +0 -1
- package/lib/src/services/share.service.d.ts +0 -6
- package/lib/src/services/share.service.js +0 -4
- package/lib/src/services/share.service.js.map +0 -1
- /package/lib/src/{services/certificates.service.d.ts → helpers/EnvMapper.d.ts} +0 -0
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import { ObjectId } from 'mongodb';
|
|
2
1
|
import DNS from 'dns';
|
|
3
2
|
import Immutable from '../Immutable.class.js';
|
|
4
3
|
import DomainModel from '../models/domain.model.js';
|
|
5
|
-
// import certificatesService from './certificates.service.js';
|
|
6
|
-
import HostingModel from '../models/hosting.model.js';
|
|
7
|
-
// import certificatesActionService from './certificatesAction.service.js';
|
|
8
4
|
import secretService from './secret.service.js';
|
|
9
5
|
const dns = DNS.promises;
|
|
10
6
|
class DomainsService extends Immutable {
|
|
@@ -12,112 +8,6 @@ class DomainsService extends Immutable {
|
|
|
12
8
|
super(...arguments);
|
|
13
9
|
this.model = DomainModel;
|
|
14
10
|
}
|
|
15
|
-
async single(internalId, options) {
|
|
16
|
-
const projection = {};
|
|
17
|
-
const aggregationArray = [
|
|
18
|
-
{
|
|
19
|
-
$match: {
|
|
20
|
-
$and: [
|
|
21
|
-
{ $expr: { $eq: ['$_id', internalId] } },
|
|
22
|
-
],
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
];
|
|
26
|
-
if (!options?.includeSecret) {
|
|
27
|
-
projection.secret = false;
|
|
28
|
-
}
|
|
29
|
-
if (!options?.certificate) {
|
|
30
|
-
projection.certificate = false;
|
|
31
|
-
}
|
|
32
|
-
if (Object.keys(projection).length) {
|
|
33
|
-
aggregationArray.push({
|
|
34
|
-
$project: projection,
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
if (options?.includeSecret) {
|
|
38
|
-
aggregationArray.push({
|
|
39
|
-
$lookup: {
|
|
40
|
-
from: 'secrets',
|
|
41
|
-
as: 'secret',
|
|
42
|
-
let: { referenceId: '$secret' },
|
|
43
|
-
pipeline: [
|
|
44
|
-
{
|
|
45
|
-
$match: {
|
|
46
|
-
$and: [
|
|
47
|
-
{ $expr: { $eq: ['$_id', '$$referenceId'] } },
|
|
48
|
-
],
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
$project: {
|
|
53
|
-
key: 1,
|
|
54
|
-
id: 1,
|
|
55
|
-
_id: 0,
|
|
56
|
-
},
|
|
57
|
-
},
|
|
58
|
-
],
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
aggregationArray.push({
|
|
62
|
-
$unwind: {
|
|
63
|
-
path: '$secret',
|
|
64
|
-
preserveNullAndEmptyArrays: true,
|
|
65
|
-
},
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
if (options?.certificate) {
|
|
69
|
-
aggregationArray.push({
|
|
70
|
-
$lookup: {
|
|
71
|
-
from: 'certificates',
|
|
72
|
-
as: 'certificate',
|
|
73
|
-
let: { certificateId: '$certificate' },
|
|
74
|
-
pipeline: [
|
|
75
|
-
{
|
|
76
|
-
$match: {
|
|
77
|
-
$and: [
|
|
78
|
-
{ $expr: { $eq: ['$_id', { $toObjectId: '$$certificateId' }] } },
|
|
79
|
-
],
|
|
80
|
-
},
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
$project: {
|
|
84
|
-
_id: 1,
|
|
85
|
-
domains: 1,
|
|
86
|
-
valid: 1,
|
|
87
|
-
type: 1,
|
|
88
|
-
contentType: 1,
|
|
89
|
-
filename: 1,
|
|
90
|
-
},
|
|
91
|
-
},
|
|
92
|
-
],
|
|
93
|
-
},
|
|
94
|
-
});
|
|
95
|
-
aggregationArray.push({
|
|
96
|
-
$unwind: {
|
|
97
|
-
path: '$certificate',
|
|
98
|
-
preserveNullAndEmptyArrays: true,
|
|
99
|
-
},
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
const domain = await this.model.db.aggregate(aggregationArray).toArray();
|
|
103
|
-
if (domain[0])
|
|
104
|
-
return domain[0];
|
|
105
|
-
return undefined;
|
|
106
|
-
}
|
|
107
|
-
/**
|
|
108
|
-
* @deprecated
|
|
109
|
-
*/
|
|
110
|
-
async createWithSSL(data, user, app) {
|
|
111
|
-
const newDomain = await this.create({ ...data, validated: false }, user, app);
|
|
112
|
-
const secret = await secretService.singleUpsert(data.company, data.project, undefined, undefined, data.domain, 10, user, app);
|
|
113
|
-
/** set the dns validation secret */
|
|
114
|
-
await this.immutable(newDomain._id, { secret: secret._id }, user, 'change', app, undefined, undefined, 'setSecret');
|
|
115
|
-
// const certOrRequest = await certificatesService.getOrRequest(data.domain, data.company, data.project, user, app);
|
|
116
|
-
// if (certOrRequest.type === 'certificate') {
|
|
117
|
-
// await this.linkCertificate(new ObjectId(certOrRequest.data?._id), data.domain, data.company, data.project, user, app);
|
|
118
|
-
// }
|
|
119
|
-
return newDomain;
|
|
120
|
-
}
|
|
121
11
|
async createWithSecret(data, options) {
|
|
122
12
|
const newDomain = await this.create({ ...data, validated: false }, options.user, options.app);
|
|
123
13
|
const secret = await secretService.singleUpsert(data.company, data.project, undefined, undefined, data.domain, 10, options.user, options.app);
|
|
@@ -125,35 +15,6 @@ class DomainsService extends Immutable {
|
|
|
125
15
|
await this.immutable(newDomain._id, { secret: secret._id }, options.user, 'change', options.app, undefined, undefined, 'setSecret');
|
|
126
16
|
return newDomain;
|
|
127
17
|
}
|
|
128
|
-
async createWithWildcard(data, options) {
|
|
129
|
-
const newDomain = await this.create({ ...data, validated: true }, options.user, options.app);
|
|
130
|
-
// const certOrRequest = await certificatesService.getOrRequestWildcard(data.domain, options);
|
|
131
|
-
// if (certOrRequest.type === 'certificate') {
|
|
132
|
-
// await this.linkCertificate(new ObjectId(certOrRequest.data?._id), data.domain, undefined, undefined, options.user, options.app);
|
|
133
|
-
// }
|
|
134
|
-
return newDomain;
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* start a new certification action based upon the last failed for this domain
|
|
138
|
-
*/
|
|
139
|
-
async retrySSL(data, user, app) {
|
|
140
|
-
// const failedAction = await certificatesActionService.latest(data.domain, data.company, data.project);
|
|
141
|
-
// if (failedAction?.state === 'failed') {
|
|
142
|
-
// return certificatesActionService.request(
|
|
143
|
-
// failedAction.domains,
|
|
144
|
-
// failedAction.type as 'domain',
|
|
145
|
-
// failedAction.contentType,
|
|
146
|
-
// failedAction.renew,
|
|
147
|
-
// {
|
|
148
|
-
// company: failedAction.company as string,
|
|
149
|
-
// project: failedAction.project as string,
|
|
150
|
-
// user,
|
|
151
|
-
// app,
|
|
152
|
-
// },
|
|
153
|
-
// );
|
|
154
|
-
// }
|
|
155
|
-
return null;
|
|
156
|
-
}
|
|
157
18
|
async remove(_id, user, app) {
|
|
158
19
|
const domain = await this.model.db.findOne({ _id });
|
|
159
20
|
if (!domain)
|
|
@@ -162,29 +23,49 @@ class DomainsService extends Immutable {
|
|
|
162
23
|
throw new Error('DOMAIN_IS_DEFAULT');
|
|
163
24
|
return this.delete(_id, user, app);
|
|
164
25
|
}
|
|
165
|
-
linkCertificate(certificateInternalId, domain, company, project, user, app) {
|
|
166
|
-
return this.immutable({ domain, company, project }, { certificate: certificateInternalId }, user, 'change', app, undefined, undefined, 'setCertificate');
|
|
167
|
-
}
|
|
168
|
-
linkMultipleDomains(certificateInternalId, domains, company, project, user, app) {
|
|
169
|
-
const PROMISEARRAY = domains.map((domain) => this.linkCertificate(new ObjectId(certificateInternalId), domain, company, project, user, app));
|
|
170
|
-
return Promise.all(PROMISEARRAY);
|
|
171
|
-
}
|
|
172
26
|
/**
|
|
173
27
|
* In order to bind a domain to lilaquadrat STUDIO, the ownership of the domains needs to be validated.
|
|
174
28
|
* a TXT entry with ``lila-studio-SECRET`` needs to be added to the DNS
|
|
175
29
|
*/
|
|
176
30
|
async validateDnsSecret(domain, key) {
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
31
|
+
try {
|
|
32
|
+
const records = await dns.resolveTxt(domain);
|
|
33
|
+
const searchString = `lila-studio-${key}`;
|
|
34
|
+
return records.some(record => record.some(entry => entry.includes(searchString)));
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
// ENODATA means no TXT records exist, which means validation fails
|
|
38
|
+
if (error.code === 'ENODATA' || error.code === 'ENOTFOUND') {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
180
43
|
}
|
|
181
|
-
/**
|
|
182
|
-
* In order to bind a domain to lilaquadrat STUDIO, the ownership of the domains needs to be validated.
|
|
183
|
-
* a TXT entry with ``lila-studio-SECRET`` needs to be added to the DNS
|
|
184
|
-
*/
|
|
185
44
|
async validateDnsARecord(domain, ip) {
|
|
186
|
-
|
|
187
|
-
|
|
45
|
+
try {
|
|
46
|
+
const records = await dns.resolve4(domain);
|
|
47
|
+
return records.some((record) => record.includes(ip));
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
// ENODATA/ENOTFOUND means no A records exist, which means validation fails
|
|
51
|
+
if (error.code === 'ENODATA' || error.code === 'ENOTFOUND') {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
throw error;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async validateDnsAAAARecord(domain, ip) {
|
|
58
|
+
try {
|
|
59
|
+
const records = await dns.resolve6(domain);
|
|
60
|
+
return records.some((record) => record.includes(ip));
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
// ENODATA/ENOTFOUND means no AAAA records exist, which means validation fails
|
|
64
|
+
if (error.code === 'ENODATA' || error.code === 'ENOTFOUND') {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
188
69
|
}
|
|
189
70
|
getDefaultDomain(company, project, hostingDomain) {
|
|
190
71
|
return `${company}-${project}.${hostingDomain}`;
|
|
@@ -192,6 +73,25 @@ class DomainsService extends Immutable {
|
|
|
192
73
|
getAllDomains() {
|
|
193
74
|
return this.model.db.find().toArray();
|
|
194
75
|
}
|
|
76
|
+
/**
|
|
77
|
+
* returns a string of domains and if a domain is set as "main" it will be not in the last
|
|
78
|
+
* @param company
|
|
79
|
+
* @param project
|
|
80
|
+
* @returns
|
|
81
|
+
*/
|
|
82
|
+
async getDomainsWithMain(company, project) {
|
|
83
|
+
const allDomains = await this.getDomains(company, project);
|
|
84
|
+
const mainDomain = allDomains.find(domain => domain.isMain);
|
|
85
|
+
// If there's a main domain, exclude it from the domains array
|
|
86
|
+
// If there's no main domain, include all domains in the array
|
|
87
|
+
const domains = mainDomain
|
|
88
|
+
? allDomains.filter(domain => !domain.isMain).map(domain => domain.domain)
|
|
89
|
+
: allDomains.map(domain => domain.domain);
|
|
90
|
+
return {
|
|
91
|
+
domains,
|
|
92
|
+
main: mainDomain?.domain,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
195
95
|
createDefaultDomain(company, project, options) {
|
|
196
96
|
return this.immutableUpsert({
|
|
197
97
|
company,
|
|
@@ -206,448 +106,56 @@ class DomainsService extends Immutable {
|
|
|
206
106
|
validated: true,
|
|
207
107
|
}, options.user, 'create', options.app);
|
|
208
108
|
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
{
|
|
218
|
-
$match: {
|
|
219
|
-
$and: [
|
|
220
|
-
{
|
|
221
|
-
$expr: {
|
|
222
|
-
$eq: ['$project', project],
|
|
223
|
-
},
|
|
224
|
-
},
|
|
225
|
-
{
|
|
226
|
-
$expr: {
|
|
227
|
-
$eq: ['$company', company],
|
|
228
|
-
},
|
|
229
|
-
},
|
|
230
|
-
{
|
|
231
|
-
$expr: {
|
|
232
|
-
$eq: ['$active', true],
|
|
233
|
-
},
|
|
234
|
-
},
|
|
235
|
-
{
|
|
236
|
-
$expr: {
|
|
237
|
-
$eq: ['$validated', true],
|
|
238
|
-
},
|
|
239
|
-
},
|
|
240
|
-
],
|
|
241
|
-
},
|
|
242
|
-
},
|
|
243
|
-
{
|
|
244
|
-
$lookup: {
|
|
245
|
-
from: 'certificates',
|
|
246
|
-
as: 'certificate',
|
|
247
|
-
let: { certificateId: '$certificate' },
|
|
248
|
-
pipeline: [
|
|
249
|
-
{
|
|
250
|
-
$match: {
|
|
251
|
-
$and: [
|
|
252
|
-
{ $expr: { $eq: ['$_id', { $toObjectId: '$$certificateId' }] } },
|
|
253
|
-
],
|
|
254
|
-
},
|
|
255
|
-
},
|
|
256
|
-
{
|
|
257
|
-
$project: {
|
|
258
|
-
_id: 1,
|
|
259
|
-
domains: 1,
|
|
260
|
-
valid: 1,
|
|
261
|
-
type: 1,
|
|
262
|
-
contentType: 1,
|
|
263
|
-
filename: 1,
|
|
264
|
-
},
|
|
265
|
-
},
|
|
266
|
-
],
|
|
267
|
-
},
|
|
268
|
-
},
|
|
269
|
-
{
|
|
270
|
-
$unwind: {
|
|
271
|
-
path: '$certificate',
|
|
272
|
-
preserveNullAndEmptyArrays: true,
|
|
273
|
-
},
|
|
274
|
-
},
|
|
275
|
-
{
|
|
276
|
-
$project: {
|
|
277
|
-
history: 0,
|
|
278
|
-
},
|
|
279
|
-
},
|
|
280
|
-
{
|
|
281
|
-
$addFields: {
|
|
282
|
-
port: hostingPorts.port,
|
|
283
|
-
},
|
|
284
|
-
},
|
|
285
|
-
]).toArray();
|
|
286
|
-
}
|
|
287
|
-
/**
|
|
288
|
-
* get all domains from active hosting with ports and certificates
|
|
289
|
-
*/
|
|
290
|
-
async getAllDomainsWithPorts() {
|
|
291
|
-
return HostingModel.db.aggregate([
|
|
292
|
-
{
|
|
293
|
-
$match: {
|
|
294
|
-
$and: [
|
|
295
|
-
{
|
|
296
|
-
$expr: {
|
|
297
|
-
$eq: ['$active', true],
|
|
298
|
-
},
|
|
299
|
-
},
|
|
300
|
-
],
|
|
301
|
-
},
|
|
302
|
-
},
|
|
303
|
-
{
|
|
304
|
-
$lookup: {
|
|
305
|
-
from: 'domains',
|
|
306
|
-
as: 'domains',
|
|
307
|
-
let: {
|
|
308
|
-
company: '$company',
|
|
309
|
-
project: '$project',
|
|
109
|
+
single(internalId, options) {
|
|
110
|
+
if (options?.includeSecret) {
|
|
111
|
+
const aggregationArray = [
|
|
112
|
+
{
|
|
113
|
+
$match: {
|
|
114
|
+
_id: internalId,
|
|
115
|
+
company: options.company,
|
|
116
|
+
project: options.project,
|
|
310
117
|
},
|
|
311
|
-
pipeline: [
|
|
312
|
-
{
|
|
313
|
-
$match: {
|
|
314
|
-
$and: [
|
|
315
|
-
{ $expr: { $eq: ['$company', '$$company'] } },
|
|
316
|
-
{ $expr: { $eq: ['$project', '$$project'] } },
|
|
317
|
-
{ $expr: { $eq: ['$active', true] } },
|
|
318
|
-
],
|
|
319
|
-
},
|
|
320
|
-
},
|
|
321
|
-
{
|
|
322
|
-
$project: {
|
|
323
|
-
isDefault: 1,
|
|
324
|
-
domain: 1,
|
|
325
|
-
_id: 0,
|
|
326
|
-
},
|
|
327
|
-
},
|
|
328
|
-
],
|
|
329
|
-
},
|
|
330
|
-
},
|
|
331
|
-
{
|
|
332
|
-
$lookup: {
|
|
333
|
-
from: 'certificates',
|
|
334
|
-
as: 'certificate',
|
|
335
|
-
let: { certificateId: '$certificate' },
|
|
336
|
-
pipeline: [
|
|
337
|
-
{
|
|
338
|
-
$match: {
|
|
339
|
-
$and: [
|
|
340
|
-
{ $expr: { $eq: ['$_id', { $toObjectId: '$$certificateId' }] } },
|
|
341
|
-
],
|
|
342
|
-
},
|
|
343
|
-
},
|
|
344
|
-
{
|
|
345
|
-
$project: {
|
|
346
|
-
_id: 1,
|
|
347
|
-
domains: 1,
|
|
348
|
-
valid: 1,
|
|
349
|
-
type: 1,
|
|
350
|
-
contentType: 1,
|
|
351
|
-
filename: 1,
|
|
352
|
-
},
|
|
353
|
-
},
|
|
354
|
-
],
|
|
355
|
-
},
|
|
356
|
-
},
|
|
357
|
-
{
|
|
358
|
-
$unwind: {
|
|
359
|
-
path: '$certificate',
|
|
360
|
-
preserveNullAndEmptyArrays: true,
|
|
361
|
-
},
|
|
362
|
-
},
|
|
363
|
-
{
|
|
364
|
-
$project: {
|
|
365
|
-
history: 0,
|
|
366
118
|
},
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
matchLate.certificateNeeded = true;
|
|
378
|
-
}
|
|
379
|
-
const aggregation = [
|
|
380
|
-
{
|
|
381
|
-
$match: match,
|
|
382
|
-
},
|
|
383
|
-
{
|
|
384
|
-
$project: {
|
|
385
|
-
secret: 0,
|
|
386
|
-
},
|
|
387
|
-
},
|
|
388
|
-
{
|
|
389
|
-
$lookup: {
|
|
390
|
-
from: 'certificates',
|
|
391
|
-
as: 'certificate',
|
|
392
|
-
let: { certificateId: '$certificate' },
|
|
393
|
-
pipeline: [
|
|
394
|
-
{
|
|
395
|
-
$match: {
|
|
396
|
-
$and: [
|
|
397
|
-
{ $expr: { $eq: ['$_id', { $toObjectId: '$$certificateId' }] } },
|
|
398
|
-
],
|
|
399
|
-
},
|
|
400
|
-
},
|
|
401
|
-
{
|
|
402
|
-
$addFields: {
|
|
403
|
-
'valid.isValid': {
|
|
404
|
-
$cond: [
|
|
405
|
-
{ $gt: ['$valid.to', new Date()] }, // condition
|
|
406
|
-
true, // value if true
|
|
407
|
-
false, // value if false
|
|
119
|
+
{
|
|
120
|
+
$lookup: {
|
|
121
|
+
from: 'secrets',
|
|
122
|
+
as: 'secret',
|
|
123
|
+
let: { referenceId: '$secret' },
|
|
124
|
+
pipeline: [
|
|
125
|
+
{
|
|
126
|
+
$match: {
|
|
127
|
+
$and: [
|
|
128
|
+
{ $expr: { $eq: ['$_id', '$$referenceId'] } },
|
|
408
129
|
],
|
|
409
130
|
},
|
|
410
131
|
},
|
|
411
|
-
},
|
|
412
|
-
{
|
|
413
|
-
$project: {
|
|
414
|
-
_id: 1,
|
|
415
|
-
domains: 1,
|
|
416
|
-
valid: 1,
|
|
417
|
-
},
|
|
418
|
-
},
|
|
419
|
-
],
|
|
420
|
-
},
|
|
421
|
-
},
|
|
422
|
-
{
|
|
423
|
-
$lookup: {
|
|
424
|
-
from: 'hosting',
|
|
425
|
-
as: 'hosting',
|
|
426
|
-
let: {
|
|
427
|
-
company: '$company',
|
|
428
|
-
project: '$project',
|
|
429
|
-
},
|
|
430
|
-
pipeline: [
|
|
431
|
-
{
|
|
432
|
-
$match: {
|
|
433
|
-
$and: [
|
|
434
|
-
{ $expr: { $eq: ['$company', '$$company'] } },
|
|
435
|
-
{ $expr: { $eq: ['$project', '$$project'] } },
|
|
436
|
-
],
|
|
437
|
-
},
|
|
438
|
-
},
|
|
439
|
-
{
|
|
440
|
-
$project: {
|
|
441
|
-
history: 0,
|
|
442
|
-
port: 0,
|
|
443
|
-
company: 0,
|
|
444
|
-
project: 0,
|
|
445
|
-
_id: 0,
|
|
446
|
-
},
|
|
447
|
-
},
|
|
448
|
-
],
|
|
449
|
-
},
|
|
450
|
-
},
|
|
451
|
-
{
|
|
452
|
-
$unwind: {
|
|
453
|
-
path: '$certificate',
|
|
454
|
-
preserveNullAndEmptyArrays: true,
|
|
455
|
-
},
|
|
456
|
-
},
|
|
457
|
-
{
|
|
458
|
-
$unwind: {
|
|
459
|
-
path: '$hosting',
|
|
460
|
-
preserveNullAndEmptyArrays: true,
|
|
461
|
-
},
|
|
462
|
-
},
|
|
463
|
-
{
|
|
464
|
-
$addFields: {
|
|
465
|
-
'certificateNeeded': {
|
|
466
|
-
$and: [
|
|
467
132
|
{
|
|
468
|
-
$
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
133
|
+
$project: {
|
|
134
|
+
key: 1,
|
|
135
|
+
id: 1,
|
|
136
|
+
_id: 0,
|
|
137
|
+
},
|
|
472
138
|
},
|
|
473
|
-
{ $eq: ['$hosting.active', true] },
|
|
474
|
-
{ $eq: ['$isDefault', false] },
|
|
475
139
|
],
|
|
476
140
|
},
|
|
477
141
|
},
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
142
|
+
{
|
|
143
|
+
$unwind: {
|
|
144
|
+
path: '$secret',
|
|
145
|
+
preserveNullAndEmptyArrays: true,
|
|
146
|
+
},
|
|
482
147
|
},
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
aggregation.push({
|
|
489
|
-
$sort: options.sort || { _id: -1 },
|
|
490
|
-
});
|
|
491
|
-
if (options.skip) { }
|
|
492
|
-
aggregation.push({
|
|
493
|
-
$skip: options.skip,
|
|
494
|
-
}, {
|
|
495
|
-
$limit: options.limit,
|
|
496
|
-
});
|
|
497
|
-
return { aggregation, countQuery: match };
|
|
498
|
-
}
|
|
499
|
-
/**
|
|
500
|
-
* add the ports to the domains
|
|
501
|
-
*/
|
|
502
|
-
mapPortToRealPorts(domains, port) {
|
|
503
|
-
return domains.map((single) => {
|
|
504
|
-
single.ports = {
|
|
505
|
-
http: port.http + (single.port || 0),
|
|
506
|
-
https: port.https + (single.port || 0),
|
|
507
|
-
};
|
|
508
|
-
return single;
|
|
509
|
-
});
|
|
510
|
-
}
|
|
511
|
-
/**
|
|
512
|
-
*
|
|
513
|
-
* map the database format to the working format
|
|
514
|
-
*/
|
|
515
|
-
mapDomains(domains) {
|
|
516
|
-
const mapped = {};
|
|
517
|
-
domains.forEach((single) => {
|
|
518
|
-
if (!mapped[`${single.company}${single.project}`]) {
|
|
519
|
-
mapped[`${single.company}${single.project}`] = {
|
|
520
|
-
domains: [],
|
|
521
|
-
company: single.company,
|
|
522
|
-
project: single.project,
|
|
523
|
-
port: single.port,
|
|
524
|
-
};
|
|
525
|
-
}
|
|
526
|
-
single.isDefault
|
|
527
|
-
? (mapped[`${single.company}${single.project}`].defaultDomain = single.domain)
|
|
528
|
-
: mapped[`${single.company}${single.project}`].domains.push(single.domain);
|
|
529
|
-
});
|
|
530
|
-
return Object.keys(mapped).map((key) => mapped[key]);
|
|
148
|
+
];
|
|
149
|
+
return this.model.db.aggregate(aggregationArray).toArray()
|
|
150
|
+
.then((document) => document[0] || undefined);
|
|
151
|
+
}
|
|
152
|
+
return this.model.db.findOne({ _id: internalId, company: options.company, project: options.project });
|
|
531
153
|
}
|
|
532
154
|
/**
|
|
533
|
-
*
|
|
534
|
-
* map the database format to the working format
|
|
155
|
+
* get all active and validated domains for specific project
|
|
535
156
|
*/
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
return null;
|
|
539
|
-
let defaultDomain;
|
|
540
|
-
const mappedHttp = {
|
|
541
|
-
domains: [],
|
|
542
|
-
company: domains[0]?.company,
|
|
543
|
-
project: domains[0]?.project,
|
|
544
|
-
port: options.http + domains[0]?.port,
|
|
545
|
-
};
|
|
546
|
-
const mappedHttps = [];
|
|
547
|
-
const redirectDomains = [];
|
|
548
|
-
domains.forEach((single) => {
|
|
549
|
-
if (single.isDefault) {
|
|
550
|
-
defaultDomain = {
|
|
551
|
-
domains: [{ domain: single.domain, company: domains[0]?.company, project: domains[0]?.project }],
|
|
552
|
-
company: domains[0]?.company,
|
|
553
|
-
project: domains[0]?.project,
|
|
554
|
-
isMain: single.isMain,
|
|
555
|
-
ports: {
|
|
556
|
-
http: options.http + single.port,
|
|
557
|
-
https: options.https + single.port,
|
|
558
|
-
},
|
|
559
|
-
};
|
|
560
|
-
return;
|
|
561
|
-
}
|
|
562
|
-
if (single.certificate) {
|
|
563
|
-
const certificate = single.certificate;
|
|
564
|
-
const httpsMapping = {
|
|
565
|
-
domains: [{ domain: single.domain, company: domains[0]?.company, project: domains[0]?.project }],
|
|
566
|
-
company: single.company,
|
|
567
|
-
project: single.project,
|
|
568
|
-
isMain: single.isMain,
|
|
569
|
-
port: options.https + single.port,
|
|
570
|
-
certificate: certificate.filename,
|
|
571
|
-
};
|
|
572
|
-
if (options.redirectToMainDomain && !single.isMain) {
|
|
573
|
-
redirectDomains.push(httpsMapping);
|
|
574
|
-
}
|
|
575
|
-
else {
|
|
576
|
-
mappedHttps.push(httpsMapping);
|
|
577
|
-
}
|
|
578
|
-
// if the certificate is created through the http challenge, the domain must always be reachable through http
|
|
579
|
-
if (certificate.type === 'domain') {
|
|
580
|
-
mappedHttp.domains.push({ domain: single.domain, company: domains[0]?.company, project: domains[0]?.project });
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
else {
|
|
584
|
-
mappedHttp.domains.push({ domain: single.domain, company: domains[0]?.company, project: domains[0]?.project });
|
|
585
|
-
}
|
|
586
|
-
});
|
|
587
|
-
const returnObject = {
|
|
588
|
-
http: mappedHttp,
|
|
589
|
-
https: mappedHttps,
|
|
590
|
-
defaultDomain,
|
|
591
|
-
redirectDomains,
|
|
592
|
-
};
|
|
593
|
-
return returnObject;
|
|
594
|
-
}
|
|
595
|
-
// async getOrRequestForProject(company: string, project: string, options: Required<UserApp>): Promise<Promise<{
|
|
596
|
-
// type: 'certificate';
|
|
597
|
-
// data: BasicData<Certificate>;
|
|
598
|
-
// } | {
|
|
599
|
-
// type: 'request';
|
|
600
|
-
// data: ObjectId | undefined;
|
|
601
|
-
// }>[]> {
|
|
602
|
-
// const domains = await this.model.db.find({
|
|
603
|
-
// company,
|
|
604
|
-
// project,
|
|
605
|
-
// validated: true,
|
|
606
|
-
// active: true,
|
|
607
|
-
// isDefault: false,
|
|
608
|
-
// }).toArray();
|
|
609
|
-
// return domains.map((single) => certificatesService.getOrRequest(
|
|
610
|
-
// single.domain, company, project, options.user, options.app,
|
|
611
|
-
// ));
|
|
612
|
-
// }
|
|
613
|
-
async requestCertificateForDomain(internalId, options) {
|
|
614
|
-
const domain = await this.model.db.findOne({ _id: internalId });
|
|
615
|
-
if (!domain)
|
|
616
|
-
return null;
|
|
617
|
-
// if (await certificatesActionService.actionExistsForDomain(domain.domain)) throw new Error('CERTIFICATEACTION_EXISTS');
|
|
618
|
-
if (!domain?.active && domain.company && domain.project)
|
|
619
|
-
throw new Error('DOMAIN_NOT_ACTIVE');
|
|
620
|
-
if (!domain?.validated)
|
|
621
|
-
throw new Error('DOMAIN_NOT_VALIDATED');
|
|
622
|
-
// if (!domain.company && !domain.project) {
|
|
623
|
-
// return certificatesActionService.request(
|
|
624
|
-
// [domain.domain],
|
|
625
|
-
// 'wildcard',
|
|
626
|
-
// 'pem',
|
|
627
|
-
// true,
|
|
628
|
-
// {
|
|
629
|
-
// app: options.app,
|
|
630
|
-
// user: options.user,
|
|
631
|
-
// forceFile: true,
|
|
632
|
-
// timeout: 120,
|
|
633
|
-
// },
|
|
634
|
-
// );
|
|
635
|
-
// } else if (domain.company && domain.project) {
|
|
636
|
-
// return certificatesActionService.request(
|
|
637
|
-
// [domain.domain],
|
|
638
|
-
// 'domain',
|
|
639
|
-
// 'pem',
|
|
640
|
-
// true,
|
|
641
|
-
// {
|
|
642
|
-
// ...options,
|
|
643
|
-
// company: domain.company,
|
|
644
|
-
// project: domain.project,
|
|
645
|
-
// forceFile: true,
|
|
646
|
-
// timeout: 120,
|
|
647
|
-
// },
|
|
648
|
-
// );
|
|
649
|
-
// }
|
|
650
|
-
return null;
|
|
157
|
+
async getDomains(company, project) {
|
|
158
|
+
return this.model.db.find({ company, project, active: true, validated: true }).toArray();
|
|
651
159
|
}
|
|
652
160
|
}
|
|
653
161
|
export default new DomainsService();
|