XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEWarframe

【WinUI】基于Warframe游戏本体的公开服务器以及安装器

公开
关注 0 Fork 0 Star 0
README.md

XFEWarframe

使用 XFEExtension.NetCore.ServerInteractive 4.0.1 承载 HTTP/TLS 的原生 C# 控制台服务器,以及分别运行的 WinUI 3 管理员端与玩家端。C# 安装器与 NativeAOT 兼容组件负责客户端安装、修复、恢复和启动。服务端不提供网页管理页面,不运行、启动或代理 Node.js/TypeScript 服务。

上游清单内 332 条非网页 HTTP 路由均已接入原生 C# 处理逻辑,包括世界状态、任务结算、任务奖励、氏族/联盟/道场、交易、商人、MOD、专精、伙伴及每周玩法。服务器已内置 C# IRC 聊天服务,支持频道、私聊和社交通知。此处路由统计的是 API 实现覆盖;完整游戏客户端联调与所有历史版本兼容性尚未验证,NRS/UDP Hub 实时服务仍需另外提供。

当前范围

上游锁定为 spaceninjaserver/SpaceNinjaServer 提交 aafde8476edd91275de0f30bffe4cf79f4cfc81c。清单涵盖 309 条普通 GET/POST 路由和 23 条正则路由;/cdn/、/:id/dynamic/ 别名另行解析。

分类 数量 含义
ported 17 较小的控制器逻辑已移植,仍需客户端联调
partial 315 已有原生业务实现,完整上游分支与客户端版本兼容性待核验
pending 0 清单内没有等待接入的 HTTP 处理器

这些是路由计数,不是功能完成度。网页路由按需求排除。模块范围、已知限制与验证方法见 MIGRATION.md、API.md 和 完整接口清单。入口遍历测试会逐条执行 332 条路由,检查是否落入未实现分派或未处理异常;业务测试另行验证扣款、奖励、权限、持久化和重复请求。

两个 WinUI 应用均按已确认的 XFEApplication (WinUI3) 模板实现 AppShellPage、MVVM、WinUIHelper 服务与 XFEProfile 配置,支持深色、浅色和系统主题。架构说明见 DESKTOP-ARCHITECTURE.md。管理员端提供总览、玩家管理、库存、结构化存档/装备/氏族编辑、紫卡工坊、细分编辑权限、账号和世界设置、邮件与新闻发布。玩家端按权限显示本人编辑操作,物品名称支持 15 种语言。使用原生 XAML 控件、WinUI TitleBar 与 Mica 背景,无 WebView。应用声明 Per-Monitor V2 DPI 感知,标题栏的最小化、最大化、关闭与拖动由 Windows 管理。

OpenWF 两套前端的 全部功能盘点 与 当前实现进度 分开维护。尚未完成所有功能。 C# 运行时目前提供本机状态、日志和两个配置开关;脚本、自由镜头、传送、元数据和热修复尚未实现。现有自动测试不能替代游戏登录和完整游玩验收。

编译与运行

物品添加与存档编辑统一在「仓库与编辑」中,使用左侧分类子项;没有编辑权限的玩家仍可只读查看。原生界面语言可在偏好设置中选择,重启后生效。Git 忽略与换行规则见 Git 约定。

玩家需要编辑战甲时,在管理端「玩家编辑权限」开启「允许用户编辑物品」并保存;只开放添加物品不会授权修改已有装备。卡片显示装备权限的开启数量,部分授权可一键补全。玩家端使用与管理员相同的 SelectorBar 详情编辑页,权限变化自动更新入口。操作说明见 战甲与装备编辑。

战甲详情的「多技能实验」支持每槽三个候选,共十二个技能;游戏 HUD 为各槽显示独立的 Xaku 式轮盘,短按循环切换,长按施放并显示进度。切换保留持续技能与实例,施放使用原生音效路径,单槽的两/三个候选同样显示轮盘。两端共用 SelectorBar、SettingsExpander 和 AutoSuggest 编辑页面,玩家沿用「移植技能」权限。新增独立 MOD「感染之王」,装备后让 Nidus 的突变适性常驻上限,阻止大招和不朽扣减层数。需要 1.4.2 或更新的 C# 兼容组件及匹配游戏版本。使用步骤、存档兼容和验证边界见 多技能实验。

游戏标识直接显示在游戏原生登录 UI 中,离开登录界面后隐藏;游戏窗口标题使用目标服务器名称。

开发环境:Windows x64、.NET SDK 10.0.401 或兼容的 10.0 SDK、PowerShell 7;WinUI 工程使用 Windows SDK BuildTools NuGet 包。构建 NativeAOT 兼容组件还需 Visual Studio 的“使用 C++ 的桌面开发”工作负载(仅提供原生链接工具,工程代码仍为 C#)。服务器核心不依赖 WinUI。首次构建需要恢复 NuGet 依赖。数据 JSON 已包含在工程中,正常构建不需要下载上游源码或安装 Node.js。

在项目根目录打开 PowerShell:

./scripts/Build.ps1
./scripts/Test.ps1
./scripts/Smoke-Test.ps1
./scripts/Smoke-Desktop.ps1
./scripts/Check-Git.ps1
./scripts/Start-Desktop.ps1
./scripts/Start-Player.ps1

在桌面端点击“启动本地服务”,或单独运行控制台:

./scripts/Start-Server.ps1

桌面 API 默认监听 http://127.0.0.1:8444,游戏 HTTPS 默认监听 https://127.0.0.1:8443,首次启动生成 Server/runtime/server.json。只有管理员端读取其中的随机管理令牌。玩家端提供账号注册、登录、仓库分类搜索与白金 / 星币 / 内融核心添加,默认开启“记住账号”,登录信息由 Windows 按当前用户加密保存;可在登录窗口或偏好设置中关闭,退出账号会清除保存记录。玩家端不引用管理端、服务端或游戏核心程序集,通过独立的玩家 API 操作本人存档。控制台可以 Ctrl+C 正常退出,管理员端也可以停止服务;关闭桌面窗口不会自动关闭服务。使用方法见 玩家账号与仓库。账号入口位于导航底部,显示游戏头像;注册与登录使用独立弹窗。货币和物品各有独立权限,未获授权的控件隐藏。管理员邮件和游戏内新闻见 发布说明。

在 Visual Studio 中打开 XFEWarframe.slnx,选择 Debug | x64。玩家端的启动项目为 XFEWarframe.Player,调试配置为 XFEWarframe.Player (Unpackaged);管理员端对应 XFEWarframe.Admin (Unpackaged),服务器为 XFEWarframe.Server。XFEWarframe.Client 是安装服务类库,不能作为启动项目。更新配置后请重新加载解决方案;若仍保留旧启动项,右击对应可执行项目,选择“设为启动项目”。完整步骤见 Visual Studio 调试说明。

只构建服务端可运行 ./scripts/Build.ps1 -NoDesktop。控制台支持 --root=<运行目录>、--port=<临时覆盖端口> 和 --routes。--port 不会修改配置文件。

独立运行包

./scripts/Export-Coverage.ps1
./scripts/Publish.ps1

需要生成独立验证包并保留现有启动快捷入口时,使用 ./scripts/Publish.ps1 -SkipLaunchers。

脚本在 artifacts/package-<时间>/ 生成 Windows x64 自包含包:

  • Server/:控制台服务器,使用 Server/Start.cmd 启动,数据保存于 Server/runtime/。
  • Client/:玩家 WinUI,使用 Client/Start.cmd 启动;CLI 安装器在 Client/Installer/,兼容组件在 Client/Bridge/。
  • Admin/:管理员 WinUI,使用 Admin/Start.cmd 启动,连接本机或远程服务器。
  • XFEWarframe-Server-win-x64.zip、XFEWarframe-Client-win-x64.zip、XFEWarframe-Admin-win-x64.zip:三个独立发行包。
  • source/、docs/、licenses/、validation/:对应源码、文档、许可证和发布验证报告。

源码也按上述三个角色分目录;根解决方案及三个角色的独立解决方案均已更新。旧根目录 runtime/ 的数据保留原位,可通过启动脚本的 -Root ./runtime 继续使用。

客户端安装

打开玩家端 →“安装与维护”→ 选择游戏副本 → 填写 API 地址 →“检测版本”→“安装 / 修复”。返回首页启动游戏。游戏更新后会重新检查 EXE 哈希和函数签名,拒绝使用旧地址启动;未知签名会报告具体不匹配项,不会强行修改。备份恢复、命令行示例和确切验证范围见 INSTALLER.md。

以复制到 D:\Warframe 的 2026.08.19.11.06 客户端为目标,201 个复制文件逐一 SHA-256 校验一致;11 项关键签名、原生组件自检、安装/卸载恢复/重装通过。2026-09-25 实测修复了挂起进程模块枚举错误,真实游戏已加载兼容组件并进入登录界面,原 Steam 目录保持不变。游戏登录与完整游玩流程仍待确认,不能据此宣称所有新版本完全兼容。见 实机验证记录。

配置和存档

server.json 的主要字段:

字段 作用
ListenUrls ServerInteractive 监听地址,例如 ["http://127.0.0.1:8444/"]
PublicUrl 桌面 API 的公开源地址
GameListenUrl / GamePublicUrl 游戏 HTTPS 监听 / 公开地址,默认 8443;远程部署须改为客户端可访问的主机
ServerName 默认服务器名称;管理端「连接与设置」可在线修改,覆盖值保存到存档
AdminToken 至少 32 字符;首次启动随机生成,不写入应用包
AutoCreateAccount 是否允许首次游戏登录自动创建账户
AllowPlayerRegistration 是否允许玩家桌面端注册账号,默认开启;管理员端可修改
AllowPlayerCurrencyGrant 是否允许玩家为本人添加白金、星币和内融核心,默认开启;管理员端可修改
FallbackBuildLabel 请求不携带 buildLabel 时采用的版本标签
TlsPfxPath 可选 TLS PFX 文件,相对运行目录解析
TlsPasswordEnvironmentVariable 保存证书密码的环境变量名称
IrcAddresses 显式聊天地址;留空时自动公布内置 IRC 的游戏服务器主机地址,支持 %THIS_MACHINE%
Irc 内置聊天配置,默认开启;监听 127.0.0.1,TCP 6665–6669、TLS 6695–6699,随服务端启动和停止
NrsAddresses 外部 NRS 地址;本工程尚未实现 NRS 实时服务
HubServers 外部 UDP Hub 列表,例如 [{"Address":"127.0.0.1:6952","Regions":["0"],"DtlsUnsupported":false}];HTTP Arbiter 据此分配大厅
NoHubDiscrimination / Dtls 大厅共享与 DTLS 协商配置
GoogleClientIds Android 登录接受的 Google OAuth 客户端 ID;没有配置时返回 503
GameAssetRoot 游戏纹理/缓存根目录;默认运行目录中的 assets,不附带游戏二进制资源

编辑监听/TLS 配置后需重启服务。远程管理可在 WinUI 中输入服务地址和令牌;远程令牌仅保存在当前进程内存中。

游戏内通讯无需单独运行 IRC 程序。更新服务端并重新登录游戏后生效;已有配置缺少 Irc 字段时也默认开启。当前 2026.08.19.11.06 原生客户端支持服务端握手校验,无需修改客户端;同时接受 nonce 和 OpenWF IRC token。监听配置、旧版兼容边界及验证记录见 游戏内通讯。

存档位于 Server/runtime/data/state.json,使用写入临时文件、刷盘、替换原文件的方式提交,并保留上一版 state.json.bak。单个运行目录有独占进程锁;账户、货币、物品变更在同一个事务中提交。恢复备份时先停止服务,再把备份复制为 state.json。发现损坏存档会拒绝启动,不会覆盖它。

当前使用单进程 JSON 快照存储,不是上游 MongoDB 的直接替代。库存导入是部分字段合并工具,不等于迁移上游全部账户、公会、会话和消息数据库。大型存档和多实例共享数据库仍需进一步实现与测试。

API

健康检查 GET /health。桌面管理 API 位于 /control/v1/,使用 Authorization: Bearer <AdminToken>;游戏 API 保留上游路径和 accountId / nonce 鉴权。/、/webui/* 返回 JSON 404。

$config = Get-Content ./Server/runtime/server.json -Raw | ConvertFrom-Json
$headers = @{ Authorization = 'Bearer ' + $config.AdminToken }
Invoke-RestMethod http://127.0.0.1:8444/control/v1/snapshot -Headers $headers

接口说明:API.md。管理密码按游戏的 Whirlpool 协议生成摘要,再用带盐 PBKDF2 存储验证值。请求日志仅记录方法、路径、状态、耗时,不记录查询参数、请求正文或鉴权头。

验证范围

  • 290 项后端 .NET 测试:包括路由入口、存档事务、制作/交易/赠礼、任务/遗物/Nemesis、氏族/道场、Helminth、轮换奖励、玩家权限、库存分页和编辑保存;普通玩家的 18 项战甲操作逐项提交并回读,与管理端字段及候选项保持一致;另覆盖同一配置的多技能候选及数据保留。
  • 84 项客户端库测试:路径边界、备份回滚、取消、中断恢复、外部文件保护、Steam 路径、URL 重定向、AES 请求解码、真实挂起进程的模块定位、技能候选短按/长按、轮盘资源覆盖与进度,以及游戏测试接口的参数校验、鉴权与超时。原生 DLL 另有真实 x64 回调与 RIP 相对指令重定位自检。
  • 34 项真实 ServerInteractive HTTP/HTTPS 检查:压缩/原始请求、鉴权、无网页、世界轮换、每周奖励、重复解锁、缓存二进制、日志脱敏、正常退出。脚本默认独立编译最新源码,使用临时端口与临时存档;可通过 -ServerPath 检查发布包。
  • WinUI 集成检查包括页面导航、ViewModel 加载、不同宽度布局和只读权限场景;-VerifyDialogs 进一步执行真实原生控件的搜索、按钮保存、对话框开关、编辑权限变化和 API 回读,管理员 32 项、玩家 38 项。此范围不代替完整游戏流程验证。

测试产物位于 artifacts/test-results/、artifacts/http-smoke-*/ 和 artifacts/desktop-smoke-*/。测试存档与个人配置不打包为正式运行数据。

多技能实验已在 2026.08.19.11.06 游戏副本中完成自动原生登录与幻影装置验证。Nidus 的 28 项游戏检查覆盖十二候选切换、长按施放、零层数的移植四技能,以及 Jade 荣耀武器、飞行动画控制器与退出恢复。另有轮盘检查覆盖四槽图标、选中动画、长按进度、两个候选与 Helminth 图标、配装重建及原版 Xaku HUD 回调保留。测试直接调用游戏内部接口,无需人工登录或桌面输入;具体组合和验证边界见 多技能实验。

更新上游数据

正常运行完全不使用 upstream/。需要重新生成对照清单或数据时:

git clone https://github.com/spaceninjaserver/SpaceNinjaServer upstream/SpaceNinjaServer
git -C upstream/SpaceNinjaServer checkout aafde8476edd91275de0f30bffe4cf79f4cfc81c
./scripts/Import-UpstreamMetadata.ps1
./scripts/Import-ExportData.ps1
./scripts/Import-WorldData.ps1

PublicExport 来自上游锁定的 warframe-public-export-plus 0.6.8,导入时按 package-lock 校验 SHA512,只复制 JSON。世界轮换、商人、掉落、活动、Nemesis、旧版配方等数据从上游静态字面量提取;导入脚本不会执行 JavaScript。运行时只加载程序集内嵌 JSON。更换上游提交后必须重新评审协议、覆盖清单与测试。

保留上游完整许可证(AGPL 文本及 Commons Clause 条件),详见 LICENSE 与 第三方来源。

2026-09-26 修复与验证:新版服务版本检测、玩家登录、游戏 HTTPS、服务器命名、游戏右上角标识,以及后台加载与分页库存预览,见 修复记录。

LICENSE AGPL-3.0

“Commons Clause” License Condition v1.0

The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition.

Without limiting other conditions in the License, the grant of rights under the License will not include, and the License does not grant to you, the right to Sell the Software.

For purposes of the foregoing, “Sell” means practicing any or all of the rights granted to you under the License to provide to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software. Any license notice or attribution required by the License must also include this Commons Clause License Condition notice.

                GNU AFFERO GENERAL PUBLIC LICENSE
                   Version 3, 19 November 2007

Copyright (C) 2007 Free Software Foundation, Inc. https://fsf.org/ Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

                        Preamble

The GNU Affero General Public License is a free, copyleft license for software and other kinds of works, specifically designed to ensure cooperation with the community in the case of network server software.

The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, our General Public Licenses are intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.

Developers that use our General Public Licenses protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License which gives you legal permission to copy, distribute and/or modify the software.

A secondary benefit of defending all users' freedom is that improvements made in alternate versions of the program, if they receive widespread use, become available for other developers to incorporate. Many developers of free software are heartened and encouraged by the resulting cooperation. However, in the case of software used on network servers, this result may fail to come about. The GNU General Public License permits making a modified version and letting the public access it on a server without ever releasing its source code to the public.

The GNU Affero General Public License is designed specifically to ensure that, in such cases, the modified source code becomes available to the community. It requires the operator of a network server to provide the source code of the modified version running there to the users of that server. Therefore, public use of a modified version, on a publicly accessible server, gives the public access to the source code of the modified version.

An older license, called the Affero General Public License and published by Affero, was designed to accomplish similar goals. This is a different license, not a version of the Affero GPL, but Affero has released a new version of the Affero GPL which permits relicensing under this license.

The precise terms and conditions for copying, distribution and modification follow.

                   TERMS AND CONDITIONS
  1. Definitions.

"This License" refers to version 3 of the GNU Affero General Public License.

"Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.

"The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations.

To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work.

A "covered work" means either the unmodified Program or a work based on the Program.

To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.

To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.

An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.

  1. Source Code.

The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work.

A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.

The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.

The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.

The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.

The Corresponding Source for a work in source code form is that same work.

  1. Basic Permissions.

All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.

You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.

Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.

  1. Protecting Users' Legal Rights From Anti-Circumvention Law.

No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.

When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.

  1. Conveying Verbatim Copies.

You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.

You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.

  1. Conveying Modified Source Versions.

You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:

a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.

b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7.  This requirement modifies the requirement in section 4 to
"keep intact all notices".

c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy.  This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged.  This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.

d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.

A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.

  1. Conveying Non-Source Forms.

You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:

a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.

b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.

c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source.  This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.

d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge.  You need not require recipients to copy the
Corresponding Source along with the object code.  If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source.  Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.

e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.

A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.

A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.

"Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.

If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).

The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.

Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.

  1. Additional Terms.

"Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.

When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.

Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:

a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or

b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or

c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or

d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or

e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or

f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.

All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.

If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.

Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.

  1. Termination.

You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).

However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.

  1. Acceptance Not Required for Having Copies.

You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.

  1. Automatic Licensing of Downstream Recipients.

Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.

An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.

You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.

  1. Patents.

A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version".

A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.

Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.

In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.

If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.

If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.

A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.

Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.

  1. No Surrender of Others' Freedom.

If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.

  1. Remote Network Interaction; Use with the GNU General Public License.

Notwithstanding any other provision of this License, if you modify the Program, your modified version must prominently offer all users interacting with it remotely through a computer network (if your version supports such interaction) an opportunity to receive the Corresponding Source of your version by providing access to the Corresponding Source from a network server at no charge, through some standard or customary means of facilitating copying of software. This Corresponding Source shall include the Corresponding Source for any work covered by version 3 of the GNU General Public License that is incorporated pursuant to the following paragraph.

Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the work with which it is combined will remain governed by version 3 of the GNU General Public License.

  1. Revised Versions of this License.

The Free Software Foundation may publish revised and/or new versions of the GNU Affero General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU Affero General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU Affero General Public License, you may choose any version ever published by the Free Software Foundation.

If the Program specifies that a proxy can decide which future versions of the GNU Affero General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.

Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.

  1. Disclaimer of Warranty.

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  1. Limitation of Liability.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

  1. Interpretation of Sections 15 and 16.

If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.

                 END OF TERMS AND CONDITIONS

        How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.

<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year>  <name of author>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

If your software can interact with users remotely through a computer network, you should also make sure that it provides a way for users to get its source. For example, if your program is a web application, its interface could display a "Source" link that leads users to an archive of the code. There are many ways you could offer source, and different solutions will be better for different programs; see section 13 for the specific requirements.

You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU AGPL, see https://www.gnu.org/licenses/.