Skip to content

调整平台证书默认下载目录及落盘方式,bump to v1.5.0 - #157

Merged
flyerH merged 10 commits into
mainfrom
fix/cert-output-dir-permissions
Sep 18, 2026
Merged

flyerH merged 10 commits into
mainfrom
fix/cert-output-dir-permissions

Conversation

@flyerH

@flyerH flyerH commented Sep 16, 2026 •

Copy link
Copy Markdown
Contributor

改动

  • 省略 -o 时,默认输出目录改为当前用户专属、他人不可写的私有目录 <临时目录>/wechatpay-<uid>/,在无 ext-posix 的环境(如 Windows)上,<uid> 段取每次运行随机生成的串,此时目录逐次新建而不复用
  • file_put_contents 换成「独占创建临时文件 + rename 原子替换」,不再跟随目标路径上的符号链接
  • 校验实际写入字节数与内容长度一致并检查 fclose 返回值,避免磁盘空间不足等情形下产生内容残缺的证书文件
  • 顺带修复 CI 上既有的测试失败(详见文末)

兼容性影响

  • 默认保存路径变更:不传 -o 时,证书从 <临时目录>/wechatpay_<序列号>.pem 挪到 <临时目录>/wechatpay-<uid>/wechatpay_<序列号>.pem,运行时会打印出完整路径。依赖旧路径的脚本需相应调整,或显式传入 -o。
  • 证书文件权限不再保留:rename 以新 inode 替换旧文件,权限由 umask 决定,此前手工设置的 mode、属主/属组等不再保留。如有依赖请在每次下载后重设。
  • 退出码变更:以前下载失败也返回 0,现在返回 1。原先依赖"这条命令永远成功"的 CI 流程会开始正确中断。
  • 公开 API 无变化:改动集中在 bin/CertificateDownloader.php,其中调整过签名的方法均为 private。src/ 下仅版本号常量变更。

附带修复 CI

DownloadTest::testGet / testGetAsync 在 PHP 7.2+ 的 job 上失败,与本次改动无关。

guzzlehttp/uri-template v1.0.6 修复了 {+var} 保留展开的 double pct-encoding 问题(guzzle/uri-template#18),%2F 不再被二次编码成 %252F。之前按未修复前的结果写死了 assertNotEquals(9745acf),上游修好后该断言失败。

v1.0.6 要求 PHP ^7.2.5,而本仓库支持 php >=7.1.2,7.1 只能装到 v0.2.0,没法靠提高依赖约束统一行为。现改为逐一比对预期串:{+var}的结果视guzzlehttp/uri-template版本而定,v1.0.6及以上保持原串,更早版本为双重编码。

@flyerH
flyerH force-pushed the fix/cert-output-dir-permissions branch from 213c821 to bd40626 Compare September 16, 2026 02:44
@TheNorthMemory

Copy link
Copy Markdown
Collaborator

对于 guzzlehttp/uri-template@v1.0.6 的测试,建议翻一下phpunit文档,可以增加 条件 选择性跑 断言,这样可以覆盖低版本的断言测试

@flyerH

flyerH commented Sep 16, 2026 •

Copy link
Copy Markdown
Contributor Author

对于 guzzlehttp/uri-template@v1.0.6 的测试,建议翻一下phpunit文档,可以增加 条件 选择性跑 断言,这样可以覆盖低版本的断言测试

修改了一下,覆盖了低版本

@TheNorthMemory

Copy link
Copy Markdown
Collaborator

createPrivateDir 及 atomicDump 内部,大量使用了 at-sign 来抑制可能的异常,建议使用
GuzzleHttp\Psr7\Utils::tryFopen 及 GuzzleHttp\Psr7\Stream 来平替at-sign这部分工作,有异常直接抛出可能会更优雅。

@flyerH

flyerH commented Sep 17, 2026

Copy link
Copy Markdown
Contributor Author

createPrivateDir 及 atomicDump 内部,大量使用了 at-sign 来抑制可能的异常,建议使用 GuzzleHttp\Psr7\Utils::tryFopen 及 GuzzleHttp\Psr7\Stream 来平替at-sign这部分工作,有异常直接抛出可能会更优雅。

这里用@为了不直接打印原始warning,打印标准化的日志,之前比较笼统Failed to exclusively create the temporary file,现在会区分显示 Permission denied、File exists

Comment thread bin/CertificateDownloader.php Outdated
Comment thread bin/CertificateDownloader.php Outdated
Comment thread bin/CertificateDownloader.php Outdated
Comment thread bin/CertificateDownloader.php

@TheNorthMemory TheNorthMemory left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@flyerH
flyerH merged commit 3c9f5c2 into main Sep 18, 2026
54 checks passed
@flyerH
flyerH deleted the fix/cert-output-dir-permissions branch September 18, 2026 07:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants