Sha256: 0ea39e1722ee24863ac4fbcaa38db2058392a6e8588d3131f1b5d758446ba1db

Contents?: true

Size: 1.58 KB

Versions: 3

Compression:

Stored size: 1.58 KB

Contents

module Rmega
  class Session
    attr_accessor :email, :request_id, :sid, :master_key

    def initialize email, password_str
      self.email = email
      self.request_id = random_request_id

      login password_str
    end

    def logger
      Rmega.logger
    end


    # Delegate to Rmega.options

    def options
      Rmega.options
    end

    def api_request_timeout
      options.api_request_timeout
    end

    def api_url
      options.api_url
    end


    # Cache the Storage class

    def storage
      @storage ||= Storage.new self
    end


    # Login-related methods

    def login password_str
      uh = Crypto.stringhash Crypto.prepare_key_pw(password_str), email
      resp = request a: 'us', user: email, uh: uh

      # Decrypt the master key
      encrypted_key = Crypto.prepare_key_pw password_str
      self.master_key = Crypto.decrypt_key encrypted_key, Utils.base64_to_a32(resp['k'])

      # Generate the session id
      self.sid = Crypto.decrypt_sid master_key, resp['csid'], resp['privk']
    end


    # Api requests methods

    def random_request_id
      rand(1E7..1E9).to_i
    end

    def request body
      self.request_id += 1
      url = "#{api_url}?id=#{request_id}"
      url << "&sid=#{sid}" if sid
      logger.info "POST #{url}"
      logger.info "#{body.inspect}"
      response = HTTPClient.new.post url, [body].to_json, timeout: api_request_timeout
      logger.debug "#{response.code}\n#{response.body}"
      resp = JSON.parse(response.body).first
      raise ApiRequestError.new(resp) if ApiRequestError.is_error_code?(resp)
      resp
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
rmega-0.0.6 lib/rmega/session.rb
rmega-0.0.5 lib/rmega/session.rb
rmega-0.0.4 lib/rmega/session.rb