KV permission check, Email opt-in

This commit is contained in:
ChrispyBacon-dev 2026-04-16 11:48:21 +02:00
parent dd97bf2941
commit dd3aa1b5e8
16 changed files with 73 additions and 13 deletions

3
.gitignore vendored
View file

@ -90,4 +90,5 @@ data/state.json
*.swp
*.log
logs/
DockFlare-Agent-prd/
DockFlare-Agent-prd/
unstable-compose.yml

View file

@ -33,15 +33,15 @@ services:
dockflare:
#build: ./dockflare
image: alplat/dockflare:unstable
image: alplat/dockflare:stable
container_name: dockflare
restart: unless-stopped
ports:
- "5001:5000"
- "5000:5000"
labels: # -- Cloudflare Tunnel Configuration (via DockFlare) OPTIONAL --
# Main DockFlare with access policy
- dockflare.enable=true
- dockflare.hostname=unstable.dockflare.app
- dockflare.hostname=dockflare.TLD # replace with your domain
- dockflare.service=http://dockflare:5000
#- dockflare.access.group=YOUR-ACCESS-GROUP-ID # your custom access policy
# -- OAuth Callback Path (Bypass Access Policy) OPTIONAL --
@ -88,7 +88,7 @@ services:
dockflare-mail-manager:
#build: ./mail-manager
image: alplat/dockflare-mail-manager:unstable
image: alplat/dockflare-mail-manager:stable
container_name: dockflare-mail-manager
restart: unless-stopped
profiles: ["email"]
@ -106,15 +106,15 @@ services:
dockflare-webmail:
#build: ./webmail
image: alplat/dockflare-webmail:unstable
image: alplat/dockflare-webmail:stable
container_name: dockflare-webmail
restart: unless-stopped
profiles: ["email"]
environment:
- DOCKFLARE_MASTER_URL=https://unstable.dockflare.app
- DOCKFLARE_MASTER_URL=https://dockflare.TLD # replace with your domain
labels:
- dockflare.enable=true
- dockflare.hostname=mail.dockflare.app # replace with your domain
- dockflare.hostname=mail.dockflare.TLD # replace with your domain
- dockflare.service=http://dockflare-webmail:80
depends_on:
dockflare-mail-manager:

View file

@ -11,7 +11,8 @@ def check_token_permissions():
perms = {
"email_routing": False,
"workers": False,
"r2": False
"r2": False,
"workers_kv": False
}
token = getattr(config, 'CF_API_TOKEN', '') or ''
if token.startswith('cfat_'):
@ -37,10 +38,15 @@ def check_token_permissions():
perms["r2"] = False
if '10042' in str(e):
perms["r2_note"] = "R2 must be enabled in the Cloudflare Dashboard before use"
try:
cf_api_request('GET', f'/accounts/{config.CF_ACCOUNT_ID}/storage/kv/namespaces?per_page=1')
perms["workers_kv"] = True
except Exception:
perms["workers_kv"] = False
return perms
except Exception as e:
logging.error(f"Error checking token permissions: {e}")
return {"email_routing": False, "workers": False, "r2": False}
return {"email_routing": False, "workers": False, "r2": False, "workers_kv": False}
def enable_email_routing(zone_id):
try:

View file

@ -748,6 +748,7 @@
"email.permission_email_routing": "Email Routing",
"email.permission_workers": "Workers Scripts",
"email.permission_r2": "R2 Storage",
"email.permission_kv": "Workers KV Storage",
"email.permission_granted": "Granted",
"email.permission_missing": "Missing",
"email.recheck_permissions": "Check Permissions",
@ -761,6 +762,8 @@
"email.stats_mailboxes": "Active Mailboxes",
"email.container_running": "Running",
"email.container_stopped": "Mail Manager or Webmail stopped",
"email.container_missing_title": "Email Services Not Found",
"email.container_missing_desc": "The email services are not present in your Docker setup. Update your docker-compose.yml to include the email profile services.",
"email.webmail_link": "Open Webmail",
"email.container_status": "Container Status",
"email.statistics": "Statistics",

View file

@ -748,6 +748,7 @@
"email.permission_email_routing": "Email Routing",
"email.permission_workers": "Workers Scripts",
"email.permission_r2": "R2 Storage",
"email.permission_kv": "Workers KV Storage",
"email.permission_granted": "Granted",
"email.permission_missing": "Missing",
"email.recheck_permissions": "Check Permissions",
@ -761,6 +762,8 @@
"email.stats_mailboxes": "Active Mailboxes",
"email.container_running": "Running",
"email.container_stopped": "Mail Manager or Webmail stopped",
"email.container_missing_title": "Email Services Not Found",
"email.container_missing_desc": "The email services are not present in your Docker setup. Update your docker-compose.yml to include the email profile services.",
"email.webmail_link": "Open Webmail",
"email.container_status": "Container Status",
"email.statistics": "Statistics",

View file

@ -752,6 +752,7 @@
"email.permission_email_routing": "Email Routing",
"email.permission_workers": "Workers Scripts",
"email.permission_r2": "R2 Storage",
"email.permission_kv": "Workers KV Storage",
"email.permission_granted": "Granted",
"email.permission_missing": "Missing",
"email.recheck_permissions": "Check Permissions",
@ -765,6 +766,8 @@
"email.stats_mailboxes": "Active Mailboxes",
"email.container_running": "Running",
"email.container_stopped": "Mail Manager or Webmail stopped",
"email.container_missing_title": "Email Services Not Found",
"email.container_missing_desc": "The email services are not present in your Docker setup. Update your docker-compose.yml to include the email profile services.",
"email.webmail_link": "Open Webmail",
"email.container_status": "Container Status",
"email.statistics": "Statistics",

View file

@ -748,6 +748,7 @@
"email.permission_email_routing": "Email Routing",
"email.permission_workers": "Workers Scripts",
"email.permission_r2": "R2 Storage",
"email.permission_kv": "Workers KV Storage",
"email.permission_granted": "Granted",
"email.permission_missing": "Missing",
"email.recheck_permissions": "Check Permissions",
@ -761,6 +762,8 @@
"email.stats_mailboxes": "Active Mailboxes",
"email.container_running": "Running",
"email.container_stopped": "Mail Manager or Webmail stopped",
"email.container_missing_title": "Email Services Not Found",
"email.container_missing_desc": "The email services are not present in your Docker setup. Update your docker-compose.yml to include the email profile services.",
"email.webmail_link": "Open Webmail",
"email.container_status": "Container Status",
"email.statistics": "Statistics",

View file

@ -748,6 +748,7 @@
"email.permission_email_routing": "Email Routing",
"email.permission_workers": "Workers Scripts",
"email.permission_r2": "R2 Storage",
"email.permission_kv": "Workers KV Storage",
"email.permission_granted": "Granted",
"email.permission_missing": "Missing",
"email.recheck_permissions": "Check Permissions",
@ -761,6 +762,8 @@
"email.stats_mailboxes": "Active Mailboxes",
"email.container_running": "Running",
"email.container_stopped": "Mail Manager or Webmail stopped",
"email.container_missing_title": "Email Services Not Found",
"email.container_missing_desc": "The email services are not present in your Docker setup. Update your docker-compose.yml to include the email profile services.",
"email.webmail_link": "Open Webmail",
"email.container_status": "Container Status",
"email.statistics": "Statistics",

View file

@ -748,6 +748,7 @@
"email.permission_email_routing": "Email Routing",
"email.permission_workers": "Workers Scripts",
"email.permission_r2": "R2 Storage",
"email.permission_kv": "Workers KV Storage",
"email.permission_granted": "Granted",
"email.permission_missing": "Missing",
"email.recheck_permissions": "Check Permissions",
@ -761,6 +762,8 @@
"email.stats_mailboxes": "Active Mailboxes",
"email.container_running": "Running",
"email.container_stopped": "Mail Manager or Webmail stopped",
"email.container_missing_title": "Email Services Not Found",
"email.container_missing_desc": "The email services are not present in your Docker setup. Update your docker-compose.yml to include the email profile services.",
"email.webmail_link": "Open Webmail",
"email.container_status": "Container Status",
"email.statistics": "Statistics",

View file

@ -748,6 +748,7 @@
"email.permission_email_routing": "Email Routing",
"email.permission_workers": "Workers Scripts",
"email.permission_r2": "R2 Storage",
"email.permission_kv": "Workers KV Storage",
"email.permission_granted": "Granted",
"email.permission_missing": "Missing",
"email.recheck_permissions": "Check Permissions",
@ -761,6 +762,8 @@
"email.stats_mailboxes": "Active Mailboxes",
"email.container_running": "Running",
"email.container_stopped": "Mail Manager or Webmail stopped",
"email.container_missing_title": "Email Services Not Found",
"email.container_missing_desc": "The email services are not present in your Docker setup. Update your docker-compose.yml to include the email profile services.",
"email.webmail_link": "Open Webmail",
"email.container_status": "Container Status",
"email.statistics": "Statistics",

View file

@ -748,6 +748,7 @@
"email.permission_email_routing": "Email Routing",
"email.permission_workers": "Workers Scripts",
"email.permission_r2": "R2 Storage",
"email.permission_kv": "Workers KV Storage",
"email.permission_granted": "Granted",
"email.permission_missing": "Missing",
"email.recheck_permissions": "Check Permissions",
@ -761,6 +762,8 @@
"email.stats_mailboxes": "Active Mailboxes",
"email.container_running": "Running",
"email.container_stopped": "Mail Manager or Webmail stopped",
"email.container_missing_title": "Email Services Not Found",
"email.container_missing_desc": "The email services are not present in your Docker setup. Update your docker-compose.yml to include the email profile services.",
"email.webmail_link": "Open Webmail",
"email.container_status": "Container Status",
"email.statistics": "Statistics",

View file

@ -748,6 +748,7 @@
"email.permission_email_routing": "Email Routing",
"email.permission_workers": "Workers Scripts",
"email.permission_r2": "R2 Storage",
"email.permission_kv": "Workers KV Storage",
"email.permission_granted": "Granted",
"email.permission_missing": "Missing",
"email.recheck_permissions": "Check Permissions",
@ -761,6 +762,8 @@
"email.stats_mailboxes": "Active Mailboxes",
"email.container_running": "Running",
"email.container_stopped": "Mail Manager or Webmail stopped",
"email.container_missing_title": "Email Services Not Found",
"email.container_missing_desc": "The email services are not present in your Docker setup. Update your docker-compose.yml to include the email profile services.",
"email.webmail_link": "Open Webmail",
"email.container_status": "Container Status",
"email.statistics": "Statistics",

View file

@ -748,6 +748,7 @@
"email.permission_email_routing": "Email Routing",
"email.permission_workers": "Workers Scripts",
"email.permission_r2": "R2 Storage",
"email.permission_kv": "Workers KV Storage",
"email.permission_granted": "Granted",
"email.permission_missing": "Missing",
"email.recheck_permissions": "Check Permissions",
@ -761,6 +762,8 @@
"email.stats_mailboxes": "Active Mailboxes",
"email.container_running": "Running",
"email.container_stopped": "Mail Manager or Webmail stopped",
"email.container_missing_title": "Email Services Not Found",
"email.container_missing_desc": "The email services are not present in your Docker setup. Update your docker-compose.yml to include the email profile services.",
"email.webmail_link": "Open Webmail",
"email.container_status": "Container Status",
"email.statistics": "Statistics",

View file

@ -2083,7 +2083,8 @@ async function emailCheckPermissions() {
document.getElementById('permWorkers').innerText = p.workers ? '✅' : '❌';
const r2Label = p.r2 ? '✅' : (p.r2_note ? '❌ ' + p.r2_note : '❌');
document.getElementById('permR2').innerText = r2Label;
const allGranted = p.email_routing && p.workers && p.r2;
document.getElementById('permKv').innerText = p.workers_kv ? '✅' : '❌';
const allGranted = p.email_routing && p.workers && p.r2 && p.workers_kv;
const banner = document.getElementById('emailPermissionsBanner');
if (banner) {
banner.classList.toggle('hidden', allGranted);

View file

@ -21,7 +21,8 @@
<div class="text-sm mt-1">
<span id="permEmailRouting"></span> {{ t('email.permission_email_routing') }}<br>
<span id="permWorkers"></span> {{ t('email.permission_workers') }}<br>
<span id="permR2"></span> {{ t('email.permission_r2') }}
<span id="permR2"></span> {{ t('email.permission_r2') }}<br>
<span id="permKv"></span> {{ t('email.permission_kv') }}
</div>
</div>
<button class="btn btn-sm btn-ghost" onclick="emailCheckPermissions()">{{ t('email.recheck_permissions') }}</button>
@ -344,16 +345,29 @@
{% else %}
{% if mail_manager_state in ('missing', 'stopped') %}
<section class="card bg-base-100 shadow-xl mb-8">
<div class="card-body">
{% if mail_manager_state == 'missing' %}
<div class="alert alert-warning">
<svg xmlns="http://www.w3.org/2000/svg" class="stroke-current shrink-0 h-6 w-6" fill="none" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z" /></svg>
<div>
<span class="font-semibold">{{ t('email.container_missing_title') }}</span><br>
<span class="text-sm">{{ t('email.container_missing_desc') }}</span><br>
<code class="text-sm mt-2 block">docker compose --profile email up -d</code>
</div>
</div>
{% else %}
<div class="alert alert-info">
<div>
<span>{{ t('email.container_stopped') }}</span><br>
<code class="text-sm mt-2 block">docker compose --profile email up -d</code>
</div>
</div>
{% endif %}
</div>
</section>
{% endif %}
{% endif %}

View file

@ -58,11 +58,19 @@ def save_email_config(email_config_data):
logging.error(f"Failed to save email config: {e}")
return False
def _get_mail_manager_state():
try:
container = docker_client.containers.get('dockflare-mail-manager')
return 'running' if container.status == 'running' else 'stopped'
except Exception:
return 'missing'
@email_bp.route('', methods=['GET'])
@login_required
def email_page():
zones = list_account_zones() or []
return render_template('email.html', zones=zones, email_config=config.EMAIL_CONFIG, email_enabled=config.EMAIL_ENABLED)
mail_manager_state = _get_mail_manager_state()
return render_template('email.html', zones=zones, email_config=config.EMAIL_CONFIG, email_enabled=config.EMAIL_ENABLED, mail_manager_state=mail_manager_state)
@email_bp.route('/setup-domain', methods=['POST'])
@login_required