Module: PCO::URL::Encryption

Defined in:
lib/pco/url/encryption.rb

Defined Under Namespace

Classes: Chunk, DecryptError, MissingKeyError

Constant Summary collapse

TABLE =

avoid vowels to not generate four-letter words, etc. this is important because those words can trigger spam filters when URLs are used in emails

"1bcd2fgh3jklmn4pqrstAvwxyz567890".freeze

Class Method Summary collapse

Class Method Details

.decrypt(data, key: @default_key) ⇒ Object

Raises:



76
77
78
79
80
81
82
83
# File 'lib/pco/url/encryption.rb', line 76

def decrypt(data, key: @default_key)
  raise MissingKeyError, "default key or key: argument must be set" if key.nil?
  iv, encrypted = case_corrected(data).split("Z").map { |part| decode(part) }
  raise DecryptError, "not a valid string to decrypt" unless iv && encrypted
  decrypter = cipher(:decrypt, key: key)
  decrypter.iv = iv
  decrypter.update(encrypted) + decrypter.final
end

.default_key=(key) ⇒ Object



63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/pco/url/encryption.rb', line 63

def default_key=(key)
  raise(<<~ERR) if defined?(@default_key) && @default_key != key
    Don't change the default_key during the life of a process.
    This configuration variable is meant to be set once on boot and not
    touched again.

    If your app needs to use multiple keys, pass them in explicitly to `encrypt`
    and `decrypt`
  ERR

  @default_key = key
end

.encrypt(data, key: @default_key) ⇒ Object

Raises:



85
86
87
88
89
90
# File 'lib/pco/url/encryption.rb', line 85

def encrypt(data, key: @default_key)
  raise MissingKeyError, "default key or key: argument must be set" if key.nil?
  crypter = cipher(:encrypt, key: key)
  crypter.iv = iv = crypter.random_iv
  "#{encode(iv)}Z#{encode(crypter.update(data) + crypter.final)}"
end