Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

密码错误时RGM::Ext.external_resigst返回失败或者抛出异常 #5

Open
gxm11 opened this issue Feb 19, 2023 · 4 comments
Open

Comments

@gxm11
Copy link
Owner

gxm11 commented Feb 19, 2023

RT。因为即使密码错误,RGM::Ext.external_check也会成功

@gxm11
Copy link
Owner Author

gxm11 commented Feb 20, 2023

参见:https://libzip.org/documentation/zip_fopen_encrypted.html 的 CAVEATS 一节。zip包里的每个文件都是单独加密的,尽管我们通常都会使用同一个密码。实际使用中,zip提供“设置默认密码”的功能,并在打开文件时使用默认密码。而zip格式很难去校验密码是否正确,除非读一下文件(但是也无法区分是密码错误还是文件损坏)。RGM::Ext.external_check只是设置了一个zip包的路径和默认密码,设置密码本来就不会失败。

替代方案:如果密码错误,RGM::Ext.external_load会返回nil,用户可以自己加一个校验正确性的文件?实际操作中,这个密码几乎没有设置错误的可能。

@Krimiston

@Krimiston
Copy link
Collaborator

参见:https://libzip.org/documentation/zip_fopen_encrypted.html 的 CAVEATS 一节。zip包里的每个文件都是单独加密的,尽管我们通常都会使用同一个密码。实际使用中,zip提供“设置默认密码”的功能,并在打开文件时使用默认密码。而zip格式很难去校验密码是否正确,除非读一下文件(但是也无法区分是密码错误还是文件损坏)。RGM::Ext.external_check只是设置了一个zip包的路径和默认密码,设置密码本来就不会失败。

替代方案:如果密码错误,RGM::Ext.external_load会返回nil,用户可以自己加一个校验正确性的文件?实际操作中,这个密码几乎没有设置错误的可能。

@Krimiston

@gxm11 首先请明确以下一点:
RGM::Ext.external_check 的设计,返回 true 时,表示 RGM::Ext.external_load 可以成功,还是文件在文件树里?
如果是前者,则可以在 external_check 内尝试一次 zip_fopen_encrypted/zip_fopen 操作,失败返回 false;在此基础上,external_load 失败时,改为抛出与 zip_err 对应的异常。
如果是后者,则可以维持现有的实现,但脚本开发者拿不到失败的原因信息,而且后者的设计比较反直觉(上述前者的设计更符合直觉)。

另,不同文件不同密码也应考虑支持,如 external_regist 的密码参数支持两种类型:如果是 String,视为默认密码;如果是 Hash,视为 {文件名=>密码} 的格式,其 default_value 为默认密码。不过这就不在本次 issue 的讨论范围内了。

@gxm11
Copy link
Owner Author

gxm11 commented Feb 21, 2023

external_check 目前唯一的使用地点在finder.rb中,而且只对图片文件生效。设计的目的,是让用户可以很方便的打包Graphics文件夹。Finder在拿到图片的路径后,会调用external_check快速检查一下zip包中是否存在此图片,来决定RGM后续加载此图片文件的方式。

用户能接触到的只有Finder#regist。在这种场合下,用户如果输入了错误的密码,连标题画面都加载不出来。由于用户只进行过打包zip + 设置密码的操作,那显然只能是用户把密码写错了。

我没有考虑到用户使用external_load方法去读取zip包里的场景,这个需要重新规划一下。要让exteral_load抛出zip对应的全部的异常可能要改的地方还比较多。

@Krimiston
Copy link
Collaborator

考察后发现,可仅提供 Finder 模块对外,RGM::Ext.external 系列对内保留(不写进文档,行为怎么方便怎么定)。

Finder.get 系列方法,失败时应抛出异常,提供错误信息。
如考虑实现注册多个包,还应实现:
find/search 方法,参数包含文件名,返回包含该文件名的包名(数组,顺序重要);check/test 方法,参数包含文件名,返回该文件是否存在于某个包中、且密码是否正确(布尔);get 系列方法,遵守 find/search 方法返回值的顺序,从包中读文件内容。

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

No branches or pull requests

2 participants