微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在commons-codec升级后没有从Base32抛出异常

如何解决在commons-codec升级后没有从Base32抛出异常

我有一个 TOTP Authenticator 项目,它使用 TOTP (RFC 6238) 生成一个六位数的一次性密码。它在内部使用来自 Apache Commons Codec 的 Base32 类:

Base32 base32 = new Base32();

commons-codec 升级 1.14 -> 1.15 之后,单元测试开始失败:

@Test
void testInvalidBase32Value() {
  String secretKey = "AHXQ2W5P6AGKYVK";

  Executable when = () -> generator.generateOtp(secretKey);

  assertThrows(IllegalArgumentException.class,when);
}
org.opentest4j.AssertionFailedError: Expected java.lang.IllegalArgumentException to be thrown,but nothing was thrown.

我该如何修正测试?

解决方法

根据 Apache Commons Codec 1.15 release notes,默认解码策略已更改:

Base32/Base64/BCodec:添加了严格的解码属性来控制尾随位的处理。默认宽松模式会无误地丢弃它们。严格模式引发异常。

新的默认解码策略在 BaseNCodec.java 中定义:

protected static final CodecPolicy DECODING_POLICY_DEFAULT = CodecPolicy.LENIENT;

要修复单元测试,请将解码策略设置为 generateOtp() 中的 CodecPolicy.STRICT

Base32 base32 = new Base32();
->
Base32 base32 = new Base32(0,null,false,PAD_DEFAULT,CodecPolicy.STRICT);

现在导致编解码器失败的数据应该抛出异常。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。