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("    Don't change the default_key during the life of a process.\n    This configuration variable is meant to be set once on boot and not\n    touched again.\n\n    If your app needs to use multiple keys, pass them in explicitly to `encrypt`\n    and `decrypt`\n  ERR\n\n  @default_key = key\nend\n") if defined?(@default_key) && @default_key != key

.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