@oneuptime/common 7.0.4976 → 7.0.4981
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/Server/Types/Domain.ts +91 -2
- package/Tests/Server/Types/Domain.test.ts +95 -0
- package/build/dist/Server/Types/Domain.js +35 -2
- package/build/dist/Server/Types/Domain.js.map +1 -1
- package/build/dist/Tests/Server/Types/Domain.test.js +78 -0
- package/build/dist/Tests/Server/Types/Domain.test.js.map +1 -0
- package/package.json +1 -1
package/Server/Types/Domain.ts
CHANGED
|
@@ -14,7 +14,53 @@ export default class Domain extends DomainCommon {
|
|
|
14
14
|
data.domain,
|
|
15
15
|
(err: Error | null, addresses: string[]) => {
|
|
16
16
|
if (err) {
|
|
17
|
-
|
|
17
|
+
logger.debug(
|
|
18
|
+
`DNS CNAME lookup failed for domain ${data.domain}: ${err.message}`,
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
// Handle specific DNS error types with user-friendly messages
|
|
22
|
+
if (
|
|
23
|
+
err.message.includes("ENODATA") ||
|
|
24
|
+
err.message.includes("queryCname ENODATA")
|
|
25
|
+
) {
|
|
26
|
+
reject(
|
|
27
|
+
new BadDataException(
|
|
28
|
+
`No CNAME records found for domain "${data.domain}". Please ensure you have added the CNAME record and wait for DNS propagation (up to 72 hours).`,
|
|
29
|
+
),
|
|
30
|
+
);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (
|
|
35
|
+
err.message.includes("ENOTFOUND") ||
|
|
36
|
+
err.message.includes("queryCname ENOTFOUND")
|
|
37
|
+
) {
|
|
38
|
+
reject(
|
|
39
|
+
new BadDataException(
|
|
40
|
+
`Domain "${data.domain}" not found. Please check if the domain is correct and accessible.`,
|
|
41
|
+
),
|
|
42
|
+
);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (
|
|
47
|
+
err.message.includes("ETIMEDOUT") ||
|
|
48
|
+
err.message.includes("queryCname ETIMEDOUT")
|
|
49
|
+
) {
|
|
50
|
+
reject(
|
|
51
|
+
new BadDataException(
|
|
52
|
+
`DNS lookup timeout for domain "${data.domain}". Please try again later.`,
|
|
53
|
+
),
|
|
54
|
+
);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Generic DNS error fallback
|
|
59
|
+
reject(
|
|
60
|
+
new BadDataException(
|
|
61
|
+
`Unable to verify CNAME record for domain "${data.domain}". DNS Error: ${err.message}. Please check your DNS configuration and try again.`,
|
|
62
|
+
),
|
|
63
|
+
);
|
|
18
64
|
} else if (addresses.length > 0) {
|
|
19
65
|
resolve(addresses);
|
|
20
66
|
} else {
|
|
@@ -44,7 +90,50 @@ export default class Domain extends DomainCommon {
|
|
|
44
90
|
domain.toString(),
|
|
45
91
|
(err: Error | null, data: Array<Array<string>>) => {
|
|
46
92
|
if (err) {
|
|
47
|
-
|
|
93
|
+
logger.debug(
|
|
94
|
+
`DNS TXT lookup failed for domain ${domain.toString()}: ${err.message}`,
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
// Handle specific DNS error types with user-friendly messages
|
|
98
|
+
if (
|
|
99
|
+
err.message.includes("ENODATA") ||
|
|
100
|
+
err.message.includes("queryTxt ENODATA")
|
|
101
|
+
) {
|
|
102
|
+
return reject(
|
|
103
|
+
new BadDataException(
|
|
104
|
+
`No TXT records found for domain "${domain.toString()}". Please ensure you have added the TXT record and wait for DNS propagation (up to 72 hours).`,
|
|
105
|
+
),
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (
|
|
110
|
+
err.message.includes("ENOTFOUND") ||
|
|
111
|
+
err.message.includes("queryTxt ENOTFOUND")
|
|
112
|
+
) {
|
|
113
|
+
return reject(
|
|
114
|
+
new BadDataException(
|
|
115
|
+
`Domain "${domain.toString()}" not found. Please check if the domain is correct and accessible.`,
|
|
116
|
+
),
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (
|
|
121
|
+
err.message.includes("ETIMEDOUT") ||
|
|
122
|
+
err.message.includes("queryTxt ETIMEDOUT")
|
|
123
|
+
) {
|
|
124
|
+
return reject(
|
|
125
|
+
new BadDataException(
|
|
126
|
+
`DNS lookup timeout for domain "${domain.toString()}". Please try again later.`,
|
|
127
|
+
),
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Generic DNS error fallback
|
|
132
|
+
return reject(
|
|
133
|
+
new BadDataException(
|
|
134
|
+
`Unable to verify TXT record for domain "${domain.toString()}". DNS Error: ${err.message}. Please check your DNS configuration and try again.`,
|
|
135
|
+
),
|
|
136
|
+
);
|
|
48
137
|
}
|
|
49
138
|
|
|
50
139
|
logger.debug("Verify TXT Record");
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import Domain from "../../../Server/Types/Domain";
|
|
2
|
+
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
3
|
+
|
|
4
|
+
describe("Domain TXT Record Verification", () => {
|
|
5
|
+
jest.setTimeout(30000); // 30 seconds timeout for DNS tests
|
|
6
|
+
|
|
7
|
+
test("should throw user-friendly error for ENODATA", async () => {
|
|
8
|
+
// Testing with a domain that exists but has no TXT records
|
|
9
|
+
const domain: string = "nonexistentsubdomain-test.google.com";
|
|
10
|
+
const verificationText: string = "test-verification-text";
|
|
11
|
+
|
|
12
|
+
await expect(
|
|
13
|
+
Domain.verifyTxtRecord(domain, verificationText),
|
|
14
|
+
).rejects.toThrow(BadDataException);
|
|
15
|
+
|
|
16
|
+
try {
|
|
17
|
+
await Domain.verifyTxtRecord(domain, verificationText);
|
|
18
|
+
} catch (error) {
|
|
19
|
+
expect(error).toBeInstanceOf(BadDataException);
|
|
20
|
+
if (error instanceof BadDataException) {
|
|
21
|
+
expect(error.message).toContain(
|
|
22
|
+
'Domain "nonexistentsubdomain-test.google.com" not found. Please check if the domain is correct and accessible.',
|
|
23
|
+
);
|
|
24
|
+
expect(error.message).toContain(domain);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test("should throw user-friendly error for non-existent domain", async () => {
|
|
30
|
+
// Testing with a domain that doesn't exist
|
|
31
|
+
const domain: string =
|
|
32
|
+
"thisisadomainthatdoesnotexistanywhere12345.nonexistent";
|
|
33
|
+
const verificationText: string = "test-verification-text";
|
|
34
|
+
|
|
35
|
+
await expect(
|
|
36
|
+
Domain.verifyTxtRecord(domain, verificationText),
|
|
37
|
+
).rejects.toThrow(BadDataException);
|
|
38
|
+
|
|
39
|
+
try {
|
|
40
|
+
await Domain.verifyTxtRecord(domain, verificationText);
|
|
41
|
+
} catch (error) {
|
|
42
|
+
expect(error).toBeInstanceOf(BadDataException);
|
|
43
|
+
if (error instanceof BadDataException) {
|
|
44
|
+
expect(error.message).toContain("not found");
|
|
45
|
+
expect(error.message).toContain(domain);
|
|
46
|
+
// Should not contain technical DNS error codes
|
|
47
|
+
expect(error.message).not.toContain("ENOTFOUND");
|
|
48
|
+
expect(error.message).not.toContain("queryTxt");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
describe("Domain CNAME Record Verification", () => {
|
|
55
|
+
jest.setTimeout(30000); // 30 seconds timeout for DNS tests
|
|
56
|
+
|
|
57
|
+
test("should throw user-friendly error for CNAME ENODATA", async () => {
|
|
58
|
+
// Testing with a domain that exists but has no CNAME records (e.g., A record only domain)
|
|
59
|
+
const domain: string = "google.com"; // This is an A record, not CNAME
|
|
60
|
+
|
|
61
|
+
await expect(Domain.getCnameRecords({ domain })).rejects.toThrow(
|
|
62
|
+
BadDataException,
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
try {
|
|
66
|
+
await Domain.getCnameRecords({ domain });
|
|
67
|
+
} catch (error) {
|
|
68
|
+
expect(error).toBeInstanceOf(BadDataException);
|
|
69
|
+
if (error instanceof BadDataException) {
|
|
70
|
+
expect(error.message).toContain("CNAME");
|
|
71
|
+
expect(error.message).toContain(domain);
|
|
72
|
+
// Should not contain technical DNS error codes in user message
|
|
73
|
+
expect(error.message).not.toContain("queryCname");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test("should get CNAME records for valid CNAME domain", async () => {
|
|
79
|
+
// This test might be flaky depending on DNS changes, but let's try with a known CNAME
|
|
80
|
+
const domain: string = "www.github.com"; // This usually has CNAME records
|
|
81
|
+
|
|
82
|
+
try {
|
|
83
|
+
const cnameRecords: string[] = await Domain.getCnameRecords({ domain });
|
|
84
|
+
expect(Array.isArray(cnameRecords)).toBe(true);
|
|
85
|
+
expect(cnameRecords.length).toBeGreaterThan(0);
|
|
86
|
+
} catch (error) {
|
|
87
|
+
// If this fails, it should still provide a user-friendly error
|
|
88
|
+
expect(error).toBeInstanceOf(BadDataException);
|
|
89
|
+
if (error instanceof BadDataException) {
|
|
90
|
+
expect(error.message).not.toContain("queryCname");
|
|
91
|
+
expect(error.message).not.toContain("ENODATA");
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
});
|
|
@@ -17,7 +17,25 @@ export default class Domain extends DomainCommon {
|
|
|
17
17
|
return new Promise((resolve, reject) => {
|
|
18
18
|
dns.resolveCname(data.domain, (err, addresses) => {
|
|
19
19
|
if (err) {
|
|
20
|
-
|
|
20
|
+
logger.debug(`DNS CNAME lookup failed for domain ${data.domain}: ${err.message}`);
|
|
21
|
+
// Handle specific DNS error types with user-friendly messages
|
|
22
|
+
if (err.message.includes("ENODATA") ||
|
|
23
|
+
err.message.includes("queryCname ENODATA")) {
|
|
24
|
+
reject(new BadDataException(`No CNAME records found for domain "${data.domain}". Please ensure you have added the CNAME record and wait for DNS propagation (up to 72 hours).`));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (err.message.includes("ENOTFOUND") ||
|
|
28
|
+
err.message.includes("queryCname ENOTFOUND")) {
|
|
29
|
+
reject(new BadDataException(`Domain "${data.domain}" not found. Please check if the domain is correct and accessible.`));
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (err.message.includes("ETIMEDOUT") ||
|
|
33
|
+
err.message.includes("queryCname ETIMEDOUT")) {
|
|
34
|
+
reject(new BadDataException(`DNS lookup timeout for domain "${data.domain}". Please try again later.`));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Generic DNS error fallback
|
|
38
|
+
reject(new BadDataException(`Unable to verify CNAME record for domain "${data.domain}". DNS Error: ${err.message}. Please check your DNS configuration and try again.`));
|
|
21
39
|
}
|
|
22
40
|
else if (addresses.length > 0) {
|
|
23
41
|
resolve(addresses);
|
|
@@ -32,7 +50,22 @@ export default class Domain extends DomainCommon {
|
|
|
32
50
|
return new Promise((resolve, reject) => {
|
|
33
51
|
dns.resolveTxt(domain.toString(), (err, data) => {
|
|
34
52
|
if (err) {
|
|
35
|
-
|
|
53
|
+
logger.debug(`DNS TXT lookup failed for domain ${domain.toString()}: ${err.message}`);
|
|
54
|
+
// Handle specific DNS error types with user-friendly messages
|
|
55
|
+
if (err.message.includes("ENODATA") ||
|
|
56
|
+
err.message.includes("queryTxt ENODATA")) {
|
|
57
|
+
return reject(new BadDataException(`No TXT records found for domain "${domain.toString()}". Please ensure you have added the TXT record and wait for DNS propagation (up to 72 hours).`));
|
|
58
|
+
}
|
|
59
|
+
if (err.message.includes("ENOTFOUND") ||
|
|
60
|
+
err.message.includes("queryTxt ENOTFOUND")) {
|
|
61
|
+
return reject(new BadDataException(`Domain "${domain.toString()}" not found. Please check if the domain is correct and accessible.`));
|
|
62
|
+
}
|
|
63
|
+
if (err.message.includes("ETIMEDOUT") ||
|
|
64
|
+
err.message.includes("queryTxt ETIMEDOUT")) {
|
|
65
|
+
return reject(new BadDataException(`DNS lookup timeout for domain "${domain.toString()}". Please try again later.`));
|
|
66
|
+
}
|
|
67
|
+
// Generic DNS error fallback
|
|
68
|
+
return reject(new BadDataException(`Unable to verify TXT record for domain "${domain.toString()}". DNS Error: ${err.message}. Please check your DNS configuration and try again.`));
|
|
36
69
|
}
|
|
37
70
|
logger.debug("Verify TXT Record");
|
|
38
71
|
logger.debug("Domain " + domain.toString());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Domain.js","sourceRoot":"","sources":["../../../../Server/Types/Domain.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAE9C,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,WAAW,MAAM,gCAAgC,CAAC;AACzD,OAAO,gBAAgB,MAAM,wCAAwC,CAAC;AAEtE,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,YAAY;IAEhC,AAAP,MAAM,CAAC,eAAe,CAAC,IAAwB;QACpD,OAAO,IAAI,OAAO,CAChB,CAAC,OAAkC,EAAE,MAA8B,EAAE,EAAE;YACrE,GAAG,CAAC,YAAY,CACd,IAAI,CAAC,MAAM,EACX,CAAC,GAAiB,EAAE,SAAmB,EAAE,EAAE;gBACzC,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,CAAC,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"Domain.js","sourceRoot":"","sources":["../../../../Server/Types/Domain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import Domain from "../../../Server/Types/Domain";
|
|
2
|
+
import BadDataException from "../../../Types/Exception/BadDataException";
|
|
3
|
+
describe("Domain TXT Record Verification", () => {
|
|
4
|
+
jest.setTimeout(30000); // 30 seconds timeout for DNS tests
|
|
5
|
+
test("should throw user-friendly error for ENODATA", async () => {
|
|
6
|
+
// Testing with a domain that exists but has no TXT records
|
|
7
|
+
const domain = "nonexistentsubdomain-test.google.com";
|
|
8
|
+
const verificationText = "test-verification-text";
|
|
9
|
+
await expect(Domain.verifyTxtRecord(domain, verificationText)).rejects.toThrow(BadDataException);
|
|
10
|
+
try {
|
|
11
|
+
await Domain.verifyTxtRecord(domain, verificationText);
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
expect(error).toBeInstanceOf(BadDataException);
|
|
15
|
+
if (error instanceof BadDataException) {
|
|
16
|
+
expect(error.message).toContain('Domain "nonexistentsubdomain-test.google.com" not found. Please check if the domain is correct and accessible.');
|
|
17
|
+
expect(error.message).toContain(domain);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
test("should throw user-friendly error for non-existent domain", async () => {
|
|
22
|
+
// Testing with a domain that doesn't exist
|
|
23
|
+
const domain = "thisisadomainthatdoesnotexistanywhere12345.nonexistent";
|
|
24
|
+
const verificationText = "test-verification-text";
|
|
25
|
+
await expect(Domain.verifyTxtRecord(domain, verificationText)).rejects.toThrow(BadDataException);
|
|
26
|
+
try {
|
|
27
|
+
await Domain.verifyTxtRecord(domain, verificationText);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
expect(error).toBeInstanceOf(BadDataException);
|
|
31
|
+
if (error instanceof BadDataException) {
|
|
32
|
+
expect(error.message).toContain("not found");
|
|
33
|
+
expect(error.message).toContain(domain);
|
|
34
|
+
// Should not contain technical DNS error codes
|
|
35
|
+
expect(error.message).not.toContain("ENOTFOUND");
|
|
36
|
+
expect(error.message).not.toContain("queryTxt");
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
describe("Domain CNAME Record Verification", () => {
|
|
42
|
+
jest.setTimeout(30000); // 30 seconds timeout for DNS tests
|
|
43
|
+
test("should throw user-friendly error for CNAME ENODATA", async () => {
|
|
44
|
+
// Testing with a domain that exists but has no CNAME records (e.g., A record only domain)
|
|
45
|
+
const domain = "google.com"; // This is an A record, not CNAME
|
|
46
|
+
await expect(Domain.getCnameRecords({ domain })).rejects.toThrow(BadDataException);
|
|
47
|
+
try {
|
|
48
|
+
await Domain.getCnameRecords({ domain });
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
expect(error).toBeInstanceOf(BadDataException);
|
|
52
|
+
if (error instanceof BadDataException) {
|
|
53
|
+
expect(error.message).toContain("CNAME");
|
|
54
|
+
expect(error.message).toContain(domain);
|
|
55
|
+
// Should not contain technical DNS error codes in user message
|
|
56
|
+
expect(error.message).not.toContain("queryCname");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
test("should get CNAME records for valid CNAME domain", async () => {
|
|
61
|
+
// This test might be flaky depending on DNS changes, but let's try with a known CNAME
|
|
62
|
+
const domain = "www.github.com"; // This usually has CNAME records
|
|
63
|
+
try {
|
|
64
|
+
const cnameRecords = await Domain.getCnameRecords({ domain });
|
|
65
|
+
expect(Array.isArray(cnameRecords)).toBe(true);
|
|
66
|
+
expect(cnameRecords.length).toBeGreaterThan(0);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
// If this fails, it should still provide a user-friendly error
|
|
70
|
+
expect(error).toBeInstanceOf(BadDataException);
|
|
71
|
+
if (error instanceof BadDataException) {
|
|
72
|
+
expect(error.message).not.toContain("queryCname");
|
|
73
|
+
expect(error.message).not.toContain("ENODATA");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=Domain.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Domain.test.js","sourceRoot":"","sources":["../../../../../Tests/Server/Types/Domain.test.ts"],"names":[],"mappings":"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"}
|