# -*- coding: utf-8 -*- r'''放根目录的 LICENSE(AGPL-3.0)。 == 为什么要有这个文件 == Gitee 对一个公开仓库会检查"有没有公认的开源协议",没有就弹许可证向导, 而且远控类工具**没有协议**在合规视角里比有协议更容易被盯上 (这个仓库已经被判过一次"内容可能含有违规信息")。 原来仓库里只有 docs/LICENSE.txt —— 那是**自定义协议**, 里面写着"复制并分发完整副本(须保持文件完整、**不得修改**)", 这**不符合 OSI 开源定义**(开源必须允许修改),所以 Gitee 不认。 (Gitee 上这个仓库的 license 字段实测就是空的。) == 为什么选 AGPL-3.0(用户拍板)== * OSI 认可、Gitee 认,公开仓库不会再被提示 * 强 copyleft:别人改了必须以同样协议开源,**不能拿去做闭源商用** —— 最接近作者原本"免费给人用、但不许别人改名变成自己的"的想法 * 含"网络服务"条款:把它做成在线服务对外提供也必须开源, 正好匹配这个项目"中转服务器"的形态 (GPL 就没有这一条) == 两份文件的分工(不冲突)== LICENSE 管**代码**:可以改、可以再发布,但衍生作品必须同样开源 docs/LICENSE.txt 管**使用行为**:禁止偷窥、禁止私自装到别人设备、 禁止伪装隐藏等红线 + 免责声明 一个管"代码怎么用",一个管"行为不能做什么"。 ''' from __future__ import annotations import sys from pathlib import Path ROOT = Path(__file__).resolve().parent.parent SRC = Path(__import__("os").environ.get("TEMP", "/tmp")) / "agpl.txt" DST = ROOT / "LICENSE" HEADER = """ykxmz —— 教室多媒体辅助工具 Copyright (C) 2026 小麦子 本程序是自由软件:你可以再发布和/或修改它,依据自由软件基金会发布的 GNU Affero 通用公共许可证(第 3 版或你选择的任何更新版本)的条款。 本程序的发布是希望它有用,但**没有任何保证**;甚至没有适销性或 特定用途适用性的默示保证。详见 GNU Affero 通用公共许可证。 你应该已经随本程序收到了一份 GNU Affero 通用公共许可证的副本 (见本文件下半部分)。如果没有,见 。 -------------------------------------------------------------------------- ⚠ 使用限制请看 docs/LICENSE.txt(《使用条款与免责声明》): 本软件是一套远程控制工具,禁止用于未经同意的他人设备、 禁止用于偷窥监视、禁止伪装隐藏。那份文件约束的是**使用行为**, 和本文件(约束**代码**的授权)互不冲突。 -------------------------------------------------------------------------- """ def main() -> int: if not SRC.is_file(): print(" ✗ 找不到 AGPL 原文:%s" % SRC) print(" (先跑一遍取原文的那步)") return 1 body = SRC.read_text(encoding="utf-8") if "GNU AFFERO GENERAL PUBLIC LICENSE" not in body: print(" ✗ 原文看着不对,不含许可证标题") return 1 DST.write_text(HEADER + body, encoding="utf-8", newline="\n") print(" ✓ 已写 %s(%d 字节)" % (DST.name, DST.stat().st_size)) print(" 含 AGPL 标题: %s" % ("GNU AFFERO GENERAL PUBLIC LICENSE" in DST.read_text(encoding="utf-8"))) return 0 if __name__ == "__main__": sys.exit(main())