码桶
发现社区成员的开源项目
ssl.js4.3 KB
import { logAudit } from '../../_audit.js';
import { fireWebhook } from '../../_webhook.js';
export async function onRequestGet(context) {
const { cfHeaders } = context.data;
const { zoneId } = context.params;
const headers = {
...cfHeaders,
'Content-Type': 'application/json'
};
const [sslRes, httpsRes, tlsRes, rewritesRes] = await Promise.all([
fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/settings/ssl`, { headers }),
fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/settings/always_use_https`, { headers }),
fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/settings/min_tls_version`, { headers }),
fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/settings/automatic_https_rewrites`, { headers }),
]);
const [sslData, httpsData, tlsData, rewritesData] = await Promise.all([
sslRes.json(),
httpsRes.json(),
tlsRes.json(),
rewritesRes.json(),
]);
return new Response(JSON.stringify({
success: sslData.success && httpsData.success && tlsData.success && rewritesData.success,
ssl: sslData.result ? { value: sslData.result.value } : null,
always_use_https: httpsData.result ? { value: httpsData.result.value } : null,
min_tls_version: tlsData.result ? { value: tlsData.result.value } : null,
automatic_https_rewrites: rewritesData.result ? { value: rewritesData.result.value } : null,
errors: [
...(sslData.errors || []),
...(httpsData.errors || []),
...(tlsData.errors || []),
...(rewritesData.errors || []),
]
}), {
headers: { 'Content-Type': 'application/json' }
});
}
export async function onRequestPost(context) {
const { cfHeaders } = context.data;
const { zoneId } = context.params;
const body = await context.request.json();
const username = context.data.user?.username || 'client';
const kv = context.env.CF_DNS_KV;
const { setting, value } = body;
const validSettings = {
ssl_mode: {
endpoint: 'ssl',
valid: ['off', 'flexible', 'full', 'strict'],
label: 'SSL mode',
},
always_use_https: {
endpoint: 'always_use_https',
valid: ['on', 'off'],
label: 'Always Use HTTPS',
},
min_tls_version: {
endpoint: 'min_tls_version',
valid: ['1.0', '1.1', '1.2', '1.3'],
label: 'Minimum TLS version',
},
automatic_https_rewrites: {
endpoint: 'automatic_https_rewrites',
valid: ['on', 'off'],
label: 'Automatic HTTPS Rewrites',
},
};
const config = validSettings[setting];
if (!config) {
return new Response(JSON.stringify({
success: false,
errors: [{ message: `Unknown setting: "${setting}". Valid settings: ${Object.keys(validSettings).join(', ')}` }]
}), { status: 400, headers: { 'Content-Type': 'application/json' } });
}
if (!config.valid.includes(value)) {
return new Response(JSON.stringify({
success: false,
errors: [{ message: `Invalid value "${value}" for ${setting}. Valid values: ${config.valid.join(', ')}` }]
}), { status: 400, headers: { 'Content-Type': 'application/json' } });
}
const response = await fetch(`https://api.cloudflare.com/client/v4/zones/${zoneId}/settings/${config.endpoint}`, {
method: 'PATCH',
headers: {
...cfHeaders,
'Content-Type': 'application/json'
},
body: JSON.stringify({ value })
});
const data = await response.json();
if (data.success) {
await logAudit(kv, username, `ssl.${setting}`, `${config.label} set to ${value} (zone: ${zoneId})`);
await fireWebhook(kv, {
type: `ssl.${setting}`,
username,
detail: `${config.label} set to ${value} (zone: ${zoneId})`
});
}
return new Response(JSON.stringify({
success: data.success,
result: data.result ? { value: data.result.value } : null,
errors: data.errors || []
}), {
status: response.status,
headers: { 'Content-Type': 'application/json' }
});
}