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
Introduce compressor
option to ActiveRecord::Encryption::Encryptor
#51735
base: main
Are you sure you want to change the base?
Conversation
aeb3171
to
17ff722
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The naming of the custom compressor's methods seems inconsistent to me. Would you consider using Encryptor
's convention and name them compress/uncompress
instead of ZLib
's deflate/inflate
?
I also think this PR should update the Rails Guides page on encryption, guides/source/active_record_encryption.md
to explain how to implement a custom compressor.
17ff722
to
633cdc2
Compare
883a321
to
3231918
Compare
Hi, @flavorjones ! I changed signature of compressor ( |
a34e1dd
to
d2de562
Compare
CI failures seem unrelated, you might want to rebase just to be sure as I think most of those have been fixed |
5664b8c
to
d0a8297
Compare
@zzak I just rebased it, and it looks like all CI failures are fixed now. 😄 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK, so I'm only realizing now that Rails already has prior art for this sort of compression API, see the docs for ActiveSupport::Cache::Store.new and the :compressor
option.
In summary, "Must respond to deflate
and inflate
"
So I hate to ask, especially since I asked you to change it in the first place, but can you update this PR to use that naming convention? I sincerely apologize for not realizing this sooner.
@@ -497,6 +533,10 @@ The digest algorithm used to derive keys. `OpenSSL::Digest::SHA256` by default. | |||
Supports decrypting data encrypted non-deterministically with a digest class SHA1. Default is false, which | |||
means it will only support the digest algorithm configured in `config.active_record.encryption.hash_digest_class`. | |||
|
|||
#### `config.active_record.encryption.compressor` | |||
|
|||
The compressor used to compress encrypted payloads. It should respond to `compress` and `uncompress`. Default is `Zlib`. You can find more information about compressors in the [Compression](#compression) section. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same comment here -- please use the full namespaced name to disambiguate.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So I hate to ask, especially since I asked you to change it in the first place, but can you update this PR to use that naming convention? I sincerely apologize for not realizing this sooner.
@flavorjones Don't mind. It's not a big deal.
By using inflate/deflate
, we don't need wrapper class for zlib
, ActiveRecord::Encryption::Compressor::Zlib
. Because Zlib
can respond to inflate/deflate
. So I think using Zlib
in document is right. What do you think?
ref: ActiveSupport::Cache
compressor = @options.delete(:compressor) { Zlib } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yup, makes sense.
a7ff27d
to
a0be4ad
Compare
@@ -497,6 +533,10 @@ The digest algorithm used to derive keys. `OpenSSL::Digest::SHA256` by default. | |||
Supports decrypting data encrypted non-deterministically with a digest class SHA1. Default is false, which | |||
means it will only support the digest algorithm configured in `config.active_record.encryption.hash_digest_class`. | |||
|
|||
#### `config.active_record.encryption.compressor` | |||
|
|||
The compressor used to compress encrypted payloads. It should respond to `compress` and `uncompress`. Default is `Zlib`. You can find more information about compressors in the [Compression](#compression) section. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yup, makes sense.
666952d
to
18b4cc2
Compare
There is a ci failure but it looks like unrelated.
|
18b4cc2
to
038b9a9
Compare
038b9a9
to
287ca48
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The feature seems like a good idea to me, thanks for working on it @heka1024
I left a comment about the API design and I also think this should provide a config option so apps that want the same custom compressor for every model can just set it once.
end | ||
|
||
class User | ||
encrypts :name, encryptor: ActiveRecord::Encryption::Encryptor.new(compressor: ZstdCompressor) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This API doesn't feel right. Having to initialize a new Encryptor in your app to set the compressor feels cumbersome and un-Rails like. I have two suggestions:
- I think if we want a compressor option for every model then Rails should do the initialization for the app. The AR code would check if the compressor option is set and then Rails would do the initialization for the application. Then it's a much cleaner API because it becomes:
encrypts :name, compressor: ZstdCompressor
- Rails should provide a config option so that applications can set all encryptors to use the same custom compressor.
config.active_record_encryption.compressor = ZstdCompressor
Motivation / Background
There are more performant algorithms than
zlib
, likezstd
orsnappy
. So I made it possible to configure the compressor to take advantage of these more performant algorithms.Detail
Make
compressor
as argument which default value iszlib
.Additional information
Checklist
Before submitting the PR make sure the following are checked:
[Fix #issue-number]
Discussion
What do you thinks about make compressor as property of
ActiveRecord::Encryption
?