No description
  • Python 74%
  • Vue 18.2%
  • CSS 5.8%
  • JavaScript 1.8%
  • HTML 0.2%
Find a file
Bingxin 2cf178ae78 feat: add external OIDC/OAuth login support
- Introduced OIDC login functionality with a new module `oidc_login.py`.
- Updated `requirements.txt` to include necessary dependencies: `requests`, `Authlib`, and `expiringdict`.
- Enhanced the web application to handle OIDC login routes and callbacks.
- Modified session management to accommodate OIDC state and nonce.
- Updated frontend to display OIDC login options and initiate login flow.
- Improved error handling and user feedback for OIDC login processes.
2026-04-05 04:44:51 +00:00
web feat: add external OIDC/OAuth login support 2026-04-05 04:44:51 +00:00
.gitignore Initial commit: email management plugin for dn42-bot 2026-03-22 03:09:42 +00:00
__init__.py feat: add dashboard and login views for email management 2026-03-29 13:00:09 +00:00
handler.py feat: migrate user data from web interface to Telegram chat_id and enhance error messages 2026-03-29 13:49:35 +00:00
poste_client.py feat: 更新邮箱更新逻辑,支持204状态码 2026-03-29 14:04:38 +00:00
README.md feat: add external OIDC/OAuth login support 2026-04-05 04:44:51 +00:00
requirements.txt feat: add external OIDC/OAuth login support 2026-04-05 04:44:51 +00:00

dn42-bot Email Plugin

dn42-bot 邮箱管理插件 — 通过 /email 命令和网页端管理 Poste.io 邮箱。

功能

Telegram Bot (/email 命令)

功能 说明
📬 Create 新建 创建一个 username@x.dn42 邮箱
🗑️ Delete 删除 永久删除邮箱及所有数据
🔑 Reset 重置密码 生成新的随机密码
✏️ Rename 改名 更改邮箱用户名(会重建邮箱)

Web 网页端 (/email 路径)

功能 说明
🔐 Login 登录 支持邮箱验证码 / GPG 签名 / SSH 签名 /(可选)外部 OIDC/OAuth
📬 Create 新建 创建一个 username@x.dn42 邮箱
🔑 Password 改密码 修改邮箱密码(支持自动生成)
✏️ Rename 改名 更改邮箱用户名(重建邮箱,数据丢失)
🗑️ Delete 删除 永久删除邮箱

Web 端认证方式与 Telegram Bot 的 /login 完全一致,自动从 DN42 Registry 获取用户注册的认证方式。

注册模式

通过 POSTE_REGISTER_MODE 配置项控制注册行为:

模式 说明
"open" 自动注册(默认)— 用户申请后立即创建邮箱
"approval" 审核注册 — 用户申请后需管理员审批
"closed" 关闭注册 — 不允许新用户创建邮箱

审核模式下,用户提交申请后所有特权用户(db_privilege)会收到审核通知, 可以通过内联按钮批准或拒绝。用户也可以随时撤回自己的申请。

安装

server/config.py 中添加以下配置:

# 插件列表 — 指定 git 仓库地址和插件名
PLUGINS = [
    {
        "git": "https://github.com/yourname/email-plugin.git",
        "name": "email",
    },
]

# Poste.io 相关配置
POSTE_API_URL = "https://mail.x.dn42"           # API 调用地址(可以是内网地址)
POSTE_REAL_URL = "https://mail.x.dn42"          # 用户访问的 Webmail 地址(可选,默认同 API_URL
POSTE_ADMIN_EMAIL = "admin@x.dn42"
POSTE_ADMIN_PASSWORD = "your_admin_password"
POSTE_DOMAIN = "x.dn42"
POSTE_VERIFY_SSL = False
POSTE_REGISTER_MODE = "open"                    # "open" | "approval" | "closed"

# (可选)启用 Web 端外部 OIDC/OAuth 登录(独立配置,不与 dn42-bot 的 OIDC_LOGIN 共享)
# 默认回调路径为 /email/api/auth/oidc/callback
EMAIL_OIDC_LOGIN = {
    "base_url": "https://your-server:3443",
    "callback_path": "/email/api/auth/oidc/callback",
    "pending_ttl": 600,
    "providers": {
        "iedon": {
            "enabled": True,
            "template": "iedon",
            "client_id": "<your_client_id>",
            "client_secret": "<your_client_secret>",
        },
    },
}

无需额外部署 — 插件和 Web 界面随 dn42-bot 一起启动。

Web 界面

Web 界面集成在 dn42-bot 的 aiohttp 服务器中(仅 webhook 模式下可用),无需单独部署。

启动 dn42-bot 后,访问 http://your-server:3443/email 即可使用。

前端自动构建

dn42-bot 启动时会自动检测插件中的 web/frontend/package.json,如果 dist/ 不存在则自动执行 npm install && npm run build

前提Docker 镜像需要包含 Node.js 和 npm官方 Docker 镜像已内置)。

如果需要手动重新构建前端(如修改了前端代码):

cd data/plugins_repos/email/web/frontend
rm -rf dist
# 重启 dn42-bot 即可自动重建,或手动执行:
npm install && npm run build

前端开发

开发时可使用 Vite 热重载:

cd data/plugins_repos/email/web/frontend
npm install
npm run dev     # 访问 http://localhost:3000/email/API 自动代理到 dn42-bot

技术栈

  • 后端: aiohttp复用 dn42-bot 已有的 web 服务器)
  • 前端: Vue.js 3 + Vite
  • 认证: 邮箱验证码 / GPG 签名 / SSH 签名 /(可选)外部 OIDC/OAuth
  • 邮箱后端: Poste.io REST API

插件结构

email-plugin/
├── README.md
├── requirements.txt        # 插件额外依赖 (httpx)
├── __init__.py             # 插件入口 (COMMANDS + register + setup_web_routes)
├── handler.py              # Telegram 交互逻辑
├── poste_client.py         # Poste.io API 客户端
└── web/                    # Web 界面
    ├── __init__.py         # setup_routes(app) — 挂载 aiohttp 路由
    ├── api.py              # REST API 端点aiohttp handlers
    ├── utils.py            # 认证工具GPG/SSH 验证,复用 bot 已有函数)
    └── frontend/           # Vue.js 3 + Vite
        ├── package.json
        ├── vite.config.js
        ├── index.html
        └── src/
            ├── main.js
            ├── App.vue
            ├── router.js
            ├── api.js
            ├── style.css
            └── views/
                ├── Login.vue
                └── Dashboard.vue

持久化数据

插件数据存储在 server/data/plugins/email/ 目录下(由 dn42-bot 统一管理),包括:

  • email_db.pkl — 用户 ID 与邮箱地址的映射Telegram 用户用 chat_idWeb 用户用 web:<asn>
  • pending_db.pkl — 待审核的邮箱申请

Telegram Bot 和 Web 端共享同一份数据。

API 端点

Web API 挂载在 /email/api/ 路径下:

认证 API

Method Path 说明
GET /email/api/auth/status 获取当前登录状态
POST /email/api/auth/start 开始认证(输入 ASN
GET /email/api/auth/oidc/start 跳转到外部 OIDC/OAuth 登录(需 provider 参数)
GET /email/api/auth/oidc/callback 外部 OIDC/OAuth 回调
POST /email/api/auth/email/send 发送邮箱验证码
POST /email/api/auth/email/verify 验证邮箱验证码
POST /email/api/auth/gpg/challenge 获取 GPG 签名挑战
POST /email/api/auth/gpg/verify 验证 GPG 签名
POST /email/api/auth/ssh/challenge 获取 SSH 签名挑战
POST /email/api/auth/ssh/verify 验证 SSH 签名
POST /email/api/auth/logout 登出

邮箱管理 API

Method Path 说明
GET /email/api/mailbox/info 获取当前用户邮箱信息
POST /email/api/mailbox/create 创建新邮箱
POST /email/api/mailbox/password 修改邮箱密码
POST /email/api/mailbox/rename 邮箱改名
DELETE /email/api/mailbox 删除邮箱
POST /email/api/mailbox/cancel-pending 撤回待审核申请

依赖

  • httpx>=0.27.0 — Poste.io API HTTP 客户端
  • requests / Authlib / expiringdict — (可选)外部 OIDC/OAuth 登录
  • aiohttp — 由 dn42-bot 提供,无需额外安装