Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Catalog · How the catalog works

Random project

AutoUpgraderPro_v5.3

View on GitHub

Anyone may press Interesting, signed in or not. It helps others find this project.

Member rating

No ratings yet.

Sign in to rate this project.

README

AutoUpgraderPro v5.3

AutoUpgraderPro v5.3 是基于原 AutoUpgrader Pro 源码整理和增强的 Delphi/VCL 自动更新组件。此版本尽量保持原组件 API 兼容,同时补强 HTTPS、安全校验、诊断信息和外部 updater 的可靠性。

支持环境

  • 已在 Delphi / RAD Studio 10.3 Rio 下编译测试。
  • 已测试 Win32 VCL 包:Sources/AutoUpgraderProXE10Rio.dpk。
  • 下载层仍基于 WinInet,因此网络行为与 Windows Internet 选项、IE、SChannel 证书/TLS 环境相关。

v5.3 主要更新

安全增强

  • 默认要求更新清单和更新文件使用 HTTPS。
  • 支持每个更新文件的 SHA256 哈希校验。
  • 默认限制更新目标路径,避免远程清单写入任意目录。
  • 新增 LastSecurityError 和 OnSecurityError,用于显示安全拦截原因。
  • 新增 WinInet 底层错误诊断属性,便于定位 TLS、证书、代理、认证问题。
  • 修复语言资源 ID 与 DevExpress 冲突导致的 &Multiple Records / Skip Empty Views 错误提示。

新安全 Updater

  • 用新的可维护外部 updater 替换旧的内嵌 updater 资源。
  • 新 updater 源码:Sources/auSecureUpdater.dpr。
  • 新 updater 资源:Sources/auSecureUpdater.res。
  • 组件现在加载资源 AUSECUPG,不再使用旧的 AUUPG。
  • updater 会等待主程序文件可写,应用 .uTMP 临时文件,并重新启动主程序。

回滚能力

  • 新增 RollbackEnabled,默认 True。
  • 新增 BackupExtension,默认 .auBackup。
  • 新增 RestoreBackupFiles 和 DeleteBackupFiles。
  • 替换前会备份已有目标文件。
  • 替换失败时 updater 会尝试恢复备份文件。

兼容性修复

  • 支持 #url=https://.../MyApp.exe 这种不指定本地目标文件名的写法,并会自动推导为当前程序目录下的同名文件。
  • 修复更新完成后文件被设置为隐藏属性的问题。完成文件现在只设置为 Archive。
  • 修复下载文件日期被设置成 1601 年的问题。
  • 修复主机不可达提示固定显示 http://... 的问题,现在显示真实请求 URL。
  • 修复 updater 启动命令行和路径引用,路径会正确加引号。

新增属性和诊断信息

安全相关

delphi
AutoUpgraderPro1.RequireHTTPS := True;
AutoUpgraderPro1.AllowInsecureHTTP := False;
AutoUpgraderPro1.RequireFileHash := True;
AutoUpgraderPro1.RestrictTargetPaths := True;
AutoUpgraderPro1.RollbackEnabled := True;
AutoUpgraderPro1.BackupExtension := '.auBackup';

常用只读诊断属性:

delphi
AutoUpgraderPro1.LastSecurityError;
AutoUpgraderPro1.LastRequestURL;
AutoUpgraderPro1.LastRedirectURL;
AutoUpgraderPro1.LastHTTPStatusCode;
AutoUpgraderPro1.LastInternetErrorCode;
AutoUpgraderPro1.LastInternetErrorMessage;

失败后可临时显示:

delphi
ShowMessage(
  'URL: ' + AutoUpgraderPro1.LastRequestURL + sLineBreak +
  'Redirect: ' + AutoUpgraderPro1.LastRedirectURL + sLineBreak +
  'Status: ' + IntToStr(AutoUpgraderPro1.LastHTTPStatusCode) + sLineBreak +
  'InternetError: ' + IntToStr(AutoUpgraderPro1.LastInternetErrorCode) + sLineBreak +
  'InternetMessage: ' + AutoUpgraderPro1.LastInternetErrorMessage + sLineBreak +
  'SecurityError: ' + AutoUpgraderPro1.LastSecurityError
);

HTTP Basic 认证

不要把真实 HTTP 用户名和密码写入 DFM 属性。建议在运行时从加密配置、数据库或其他安全来源读取后赋值:

delphi
AutoUpgraderPro1.HTTPUsername := httpUser;
AutoUpgraderPro1.HTTPPassword := httpPassword;

v5.3 会在请求头中主动发送 Basic Authorization,减少不同电脑上 WinInet 认证重试行为不一致的问题。

更新清单格式

最简单写法:

text
#version=5.3.0
#date=05/27/2026
#url=https://your-domain.com/update/MyApp.exe

推荐生产写法,显式指定目标文件并提供 SHA256:

text
#version=5.3.0
#date=05/27/2026
#url=https://your-domain.com/update/MyApp.exe=MyApp.exe
#sha256=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

多个文件:

text
#version=5.3.0
#url0=https://your-domain.com/update/MyApp.exe=MyApp.exe
#sha2560=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

#url1=https://your-domain.com/update/MyDll.dll=MyDll.dll
#sha2561=abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789

注意:如果 URL 没有写协议,例如 www.example.com/update/MyApp.exe,旧逻辑会自动补成 HTTP。v5.3 默认会拦截非 HTTPS 地址。

路径白名单和保存位置

CheckUpdate 下载更新文件时,默认不是下载到 Windows Temp 目录。

如果清单只写远程 URL:

text
#url=https://your-domain.com/update/MyApp.exe

组件会下载到当前程序目录:

text
当前程序目录\MyApp.exe.uTMP

如果清单写成:

text
#url=https://your-domain.com/update/MyApp.exe=MyApp.exe

目标仍是:

text
当前程序目录\MyApp.exe.uTMP

v5.3 默认只允许写入当前程序目录:

delphi
AutoUpgraderPro1.RestrictTargetPaths := True;

如果目标路径不在白名单中,会提示:

text
Update target path is not allowed: ...

更新插件目录或其他业务目录时,需要显式加入白名单:

delphi
AutoUpgraderPro1.AllowedInstallDirs.Clear;
AutoUpgraderPro1.AllowedInstallDirs.Add(ExtractFilePath(Application.ExeName));
AutoUpgraderPro1.AllowedInstallDirs.Add('D:\YourApp\Plugins\');

测试时可以关闭路径限制:

delphi
AutoUpgraderPro1.RestrictTargetPaths := False;

生产环境不建议关闭路径限制,也不建议在清单中使用 %temp%、%windows%、%system% 或任意绝对路径。

HTTPS、TLS 和证书吊销检查

组件底层使用 WinInet,因此 HTTPS 能否成功取决于客户端 Windows 的 SChannel、证书链、Internet 选项和网络环境。

常见 WinInet 错误:

text
12029  无法连接服务器,通常是网络、防火墙、代理问题。
12030  连接被中断,可能是 TLS 握手或服务器关闭连接。
12045  证书颁发机构不受信任。
12057  证书吊销检查失败。
12157  HTTPS 安全通道建立失败,常见于 TLS/cipher/证书问题。

如果 IE 不能打开更新清单 URL,AutoUpgraderPro 通常也不能打开,因为两者都依赖 Windows/WinInet/SChannel。

服务器建议:

nginx
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

ssl_stapling on;
ssl_stapling_verify on;
resolver 223.5.5.5 8.8.8.8 valid=300s;
resolver_timeout 5s;

如果使用 Let’s Encrypt ECDSA 证书,TLS 1.2 cipher 必须包含 ECDHE-ECDSA-...,否则 Windows/IE/WinInet 可能握手失败。

如果客户端报 12057,说明证书吊销检查失败。优先修客户端网络,让它能访问证书 OCSP/CRL 地址,例如 Let’s Encrypt 的:

text
http://e7.o.lencr.org/
http://r7.o.lencr.org/

如果短期无法修复客户端网络,可作为应急兼容:

delphi
AutoUpgraderPro1.InternetOptions :=
  AutoUpgraderPro1.InternetOptions + [ioIgnoreCertificateRevocationFailed];

这个选项会降低证书校验强度,不建议长期默认开启。

DevExpress 资源冲突修复

旧版本 AutoUpgrader 的语言资源 ID 从 61000 开始。某些使用 DevExpress 的应用中,这段资源 ID 可能与 DevExpress 字符串冲突,导致本应显示 AutoUpgrader 错误时,却显示:

text
&Multiple Records
Skip Empty Views

v5.3 已将 AutoUpgrader 语言资源移动到 45000 段。如果仍看到旧提示,请重新编译并安装新包,确认项目链接的是新的 .bpl / .dcu。

推荐使用示例

delphi
AutoUpgraderPro1.InfoFileURL := 'https://your-domain.com/updates/update.inf';
AutoUpgraderPro1.HTTPUsername := httpUser;
AutoUpgraderPro1.HTTPPassword := httpPassword;

AutoUpgraderPro1.RequireHTTPS := True;
AutoUpgraderPro1.RequireFileHash := True;
AutoUpgraderPro1.RestrictTargetPaths := True;
AutoUpgraderPro1.RollbackEnabled := True;

AutoUpgraderPro1.AllowedInstallDirs.Clear;
AutoUpgraderPro1.AllowedInstallDirs.Add(ExtractFilePath(Application.ExeName));

AutoUpgraderPro1.CheckUpdate(False);

安全错误事件:

delphi
procedure TForm1.AutoUpgraderPro1SecurityError(Sender: TObject);
begin
  ShowMessage(AutoUpgraderPro1.LastSecurityError);
end;

仅内网临时测试时允许 HTTP:

delphi
AutoUpgraderPro1.RequireHTTPS := False;
AutoUpgraderPro1.AllowInsecureHTTP := True;

生产环境建议始终保持 HTTPS,并为每个更新文件提供 SHA256。

编译方法

使用 Delphi 10.3 Rio 编译组件包:

powershell
& "C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\DCC32.EXE" -B "-NSWinapi;System;System.Win;Vcl;Vcl.Imaging;Data;Data.Win;Datasnap;Xml;Xml.Win;Web" "Sources\AutoUpgraderProXE10Rio.dpk"

编译 Demo:

powershell
& "C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\DCC32.EXE" -B "-NSWinapi;System;System.Win;Vcl;Vcl.Imaging;Data;Data.Win;Datasnap;Xml;Xml.Win;Web" "-U.;Sources" "Demo\AutoUpgraderProDemo.dpr"

如果修改了 auSecureUpdater.dpr,需要重新编译 updater 并重新生成资源:

powershell
& "C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\DCC32.EXE" -B "-NSWinapi;System;System.Win;Vcl;Vcl.Imaging;Data;Data.Win;Datasnap;Xml;Xml.Win;Web" "Sources\auSecureUpdater.dpr"
& "C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\BRCC32.EXE" "Sources\auSecureUpdater.rc"

文件说明

  • Sources/auAutoUpgrader.pas:主组件源码。
  • Sources/auHTTP.pas:WinInet HTTP/HTTPS 下载组件。
  • Sources/auUtils.pas:公共工具函数和队列列表。
  • Sources/auSecureUpdater.dpr:新的外部 updater 源码。
  • Sources/auSecureUpdater.res:内嵌 updater 资源。
  • Demo/:Delphi 示例项目。
  • Help/:原帮助文件。
  • README_original.txt:原版说明文件。
  • License.txt:原许可证文件。

注意事项

  • SHA256 只能验证文件完整性,不能证明发布者身份。后续可继续增加清单签名验证。
  • 不要把真实 HTTP 用户名、密码、服务器管理密码、数据库连接串写入 DFM、README 或公开仓库。
  • 发布到 GitHub 前请检查 DFM、配置文件、README、项目文件中是否包含真实服务器地址、凭据、令牌或本地敏感路径。
  • 如果应用使用复杂主窗体、Ribbon、PageControl 或嵌入式子窗体,建议接管 OnDoOwnCloseAppMethod,在更新前按业务规则关闭页面和数据库连接。