Class: Browserctl::Session
- Inherits:
-
Object
- Object
- Browserctl::Session
- Defined in:
- lib/browserctl/session.rb
Constant Summary collapse
- BASE_DIR =
File.join(BROWSERCTL_DIR, "sessions")
- SAFE_NAME =
/\A[a-zA-Z0-9_-]{1,64}\z/- SENSITIVE_FILES =
%w[cookies.json local_storage.json session_storage.json].freeze
Class Method Summary collapse
- .all ⇒ Object
- .delete(name) ⇒ Object
- .exist?(name) ⇒ Boolean
- .load(session_name) ⇒ Object
- .load_meta(path) ⇒ Object
- .path(name) ⇒ Object
-
.save(session_name, metadata:, cookies:, local_storage:, session_storage:, encrypt: false) ⇒ Object
rubocop:disable Metrics/ParameterLists.
- .validate_name!(name) ⇒ Object
Class Method Details
.all ⇒ Object
26 27 28 |
# File 'lib/browserctl/session.rb', line 26 def self.all Dir[File.join(BASE_DIR, "*/metadata.json")].filter_map { |f| (f) } end |
.delete(name) ⇒ Object
21 22 23 24 |
# File 'lib/browserctl/session.rb', line 21 def self.delete(name) validate_name!(name) FileUtils.rm_rf(path(name)) end |
.exist?(name) ⇒ Boolean
19 |
# File 'lib/browserctl/session.rb', line 19 def self.exist?(name) = Dir.exist?(path(name)) |
.load(session_name) ⇒ Object
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/browserctl/session.rb', line 71 def self.load(session_name) validate_name!(session_name) dir = path(session_name) raise "session '#{session_name}' not found" unless Dir.exist?(dir) = JSON.parse(File.read(File.join(dir, "metadata.json")), symbolize_names: true) if [:encrypted] key = keychain_fetch(session_name) { metadata: , cookies: decrypt_json(File.join(dir, "cookies.json.enc"), key, symbolize_names: true), local_storage: decrypt_json(File.join(dir, "local_storage.json.enc"), key, symbolize_names: false), session_storage: load_session_storage_encrypted(dir, key) } else { metadata: , cookies: JSON.parse(File.read(File.join(dir, "cookies.json")), symbolize_names: true), local_storage: JSON.parse(File.read(File.join(dir, "local_storage.json")), symbolize_names: false), session_storage: load_session_storage(dir) } end end |
.load_meta(path) ⇒ Object
96 97 98 99 100 |
# File 'lib/browserctl/session.rb', line 96 def self.(path) JSON.parse(File.read(path), symbolize_names: true) rescue JSON::ParserError nil end |
.path(name) ⇒ Object
18 |
# File 'lib/browserctl/session.rb', line 18 def self.path(name) = File.join(BASE_DIR, name) |
.save(session_name, metadata:, cookies:, local_storage:, session_storage:, encrypt: false) ⇒ Object
rubocop:disable Metrics/ParameterLists
30 31 32 33 34 35 36 37 |
# File 'lib/browserctl/session.rb', line 30 def self.save(session_name, metadata:, cookies:, local_storage:, session_storage:, encrypt: false) # rubocop:disable Metrics/ParameterLists validate_name!(session_name) key, = prepare_encryption(session_name, , encrypt) dir = path(session_name) FileUtils.mkdir_p(dir) write_json(File.join(dir, "metadata.json"), ) write_session_files(dir, , local_storage, session_storage, key) end |
.validate_name!(name) ⇒ Object
102 103 104 105 106 |
# File 'lib/browserctl/session.rb', line 102 def self.validate_name!(name) return if SAFE_NAME.match?(name.to_s) raise ArgumentError, "invalid session name #{name.inspect} — use letters, digits, _ or - (max 64 chars)" end |