Class: Browserctl::Session

Inherits:
Object
  • Object
show all
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

Class Method Details

.allObject



26
27
28
# File 'lib/browserctl/session.rb', line 26

def self.all
  Dir[File.join(BASE_DIR, "*/metadata.json")].filter_map { |f| load_meta(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

Returns:

  • (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)

  meta = JSON.parse(File.read(File.join(dir, "metadata.json")), symbolize_names: true)

  if meta[:encrypted]
    key = keychain_fetch(session_name)
    {
      metadata: meta,
      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: meta,
      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.load_meta(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, cookies, local_storage, session_storage, key)
end

.validate_name!(name) ⇒ Object

Raises:

  • (ArgumentError)


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