自编译 GPG Mail

GPG Suite 是 macOS 平台上 GPG 程序的整合式解决方案。其中提供有 macOS 下的具有图形界面密钥管理程序,以及适用于 Mail.app 的 GPG 邮件插件。总体来说整个套件的易用程度是很不错的。

在去年的时候,GPG Suite 中的 GPG Mail 组件突然宣布收费,并且在不收费的情况下只有30天的试用时间。自由软件收费其实并不是什么新鲜事。自由软件本身保证的是软件的自由,而并非其英文字面”Free”所表现的免费,所以自由软件当然也有收费的自由,并且用户也享有或收费或免费分发的自由1。虽然能够理解开发者在这上面倾注了很多的心血,也理应有一定经济上的支持。但是首先的一个问题是只能按照它提供的计划购买,而不是那种可以自由选择金额的捐赠。另外,我个人也并不想为一个我基本不需要的人工支持服务买单。虽然 GPG Mail 突然来了这么一个操作实在是让人觉得不太舒服,不过也并不是没有绕过的手段。就如同买不起 RHEL 就可以去用 CentOS 一样,好在GPG Mail 仍然是自由软件,并且也是开源的,这也就意味着其源代码是可以找到的。而且如果这种涉及到加密、签名的软件不能对源代码进行审计的话,那也就意味着其从根本上没有安全性,更没有使用的必要了。

总之,在为享用他人劳动成果而不支付报酬的行为找足够了能充分让我自己心安理得的自我安慰用的理由之后,就是具体操作的方法了。在进行之前确保你已经安装了 Xcode 的相关组件,并且你有基本的编程经验(至少能理解程序编译出错的信息并解决问题)。

编译插件

首先需要 clone GPG Mail 的源代码仓库

git clone https://github.com/GPGTools/GPGMail.git

然后在 Dependenies 目录下 clone 其依赖组件 Libmacgpg

cd GPGMail/Dependencies
git clone https://github.com/GPGTools/Libmacgpg.git

接着编译 Libmacgpg

cd Libmacgpg
make

编译完成后返回 GPG Mail 仓库的根目录,接着检出对应 macOS 版本的分支,以下以 High Sierra 为例

git checkout high-sierra

然后开始修改程序。插件中判断是否弹出付费窗口以及是否有过付费的逻辑是通过一个名为 hasActiveContract 的方法进行的,这一方法在 Source/GPGMailBundle.m 中定义。也就是说只要让这个方法永远返回真值就可以绕过对于付费的检测。也就是将

- (BOOL)hasActiveContract {
    NSDictionary *contractInformation = [self contractInformation];
    return [contractInformation[@"Active"] boolValue];
}

改为

- (BOOL)hasActiveContract {
    NSDictionary *contractInformation = [self contractInformation];
    return YES;
}

除此之外,还可以进行一些其他的修改以防止弹窗。这些修改可以按照参考资料 2 中的方法进行,不过请务必对这些修改代码进行审查。

修改完成之后,在代码仓库的根目录下面执行编译命令

make

编译好的插件位于 build/Release 下面。

安装插件

如果你已经安装了带有 GPG Mail 的 GPG Suite,注意,这里不能直接覆盖已经安装好的 GPG Mail 插件(位于 /Library/Application\ Support/GPGTools/GPGMail/ ),而是需要执行安装包里面的 Uninstall.app,并在卸载的时候选择只卸载 GPG Mail,这样可以保留 GPG Suite 中的其他组件。接着将 build/Release 下面的 GPGMail.mailbundle 复制到 ~/Library/Mail/Bundles 中,如果 ~/Library/Mail/Bundles 不存在则需要自行创建。

cp -r ./build/Release/GPGMail.mailbundle ~/Library/Mail/Bundles

参考资料

  1. 绕过 GPGMail 的激活检测
  2. https://github.com/GPGTools/GPGMail/pull/35

1. 享有自由分发自由软件权利的同时也必须履行自由软件协议中关于分发的条款

发表评论

电子邮件地址不会被公开。 必填项已用*标注