class CompanionApi::Resources::Account

Constants

PLATFORM_ANDROID
PLATFORM_IOS

Attributes

profile[RW]

Public Class Methods

new(profile) click to toggle source
# File lib/companion_api/resources/account.rb, line 9
def initialize(profile)
  @profile = profile
end

Public Instance Methods

auto_login!(username, password) click to toggle source
# File lib/companion_api/resources/account.rb, line 13
def auto_login!(username, password)
  req = CompanionApi::Request.new(
    uri:       login_url,
    requestId: CompanionApi.uuid,
    absolute:  true,
  )

  res = req.get!
  body = res.body

  if !body.include?('cis_sessid') && body.include?('loginForm')
    html = Nokogiri::HTML(body)
    form = html.at_css("form[id='loginForm']")
    stored = form.at_css("input[name='_STORED_']")[:value]

    action = CGI.unescape(form[:action])

    data = {
      "_STORED_": stored,
      "sqexid":   username,
      "password": password,
    }

    req = CompanionApi::Request.new(
      uri:       CompanionApi::Request::URI_SE,
      endpoint:  "/oauth/oa/#{action}",
      requestId: CompanionApi.uuid,
      # token: profile.get("token"),
      form:      data,
    )

    res = req.post!
    body = res.body
  end

  html = Nokogiri::HTML(body)
  form = html.at_css("form[name='mainForm']")
  raise CompanionApi::LoginError, 'unexpected response received' if form.nil?

  cis_sessid = form.at_css("input[name='cis_sessid']")[:value]

  data = {
    "cis_sessid": cis_sessid,
    "provision":  '',
    "_c":         1,
  }

  req = CompanionApi::Request.new(
    uri:       form[:action],
    absolute:  true,
    # requestId: CompanionApi.uuid,
    query:     {
      token: @profile.get('token'),
      uid:   @profile.get('uid'),
    },
    return202: true,
    form:      data,
  )

  res = req.post!

  raise CompanionApi::LoginError, 'Login status could not be validated.' if res.status != 202

  @profile.set("lastLogin", Time.now.to_i)

  CompanionApi.refresh_uuid
  true
end
get_token() click to toggle source
# File lib/companion_api/resources/account.rb, line 108
def get_token
  crypted_uuid = CompanionApi.rsa.public_encrypt(@profile.get('userId'))
  uid = Base64.encode64(crypted_uuid)

  req = CompanionApi::Request.new(
    uri:      CompanionApi::Request::URI,
    endpoint: '/login/token',
    json:     { 'platform' => PLATFORM_ANDROID, 'uid' => uid },
  )

  res = req.post!
  JSON.parse(res.body)
end
login_url() click to toggle source
# File lib/companion_api/resources/account.rb, line 82
def login_url
  @profile.set('userId', CompanionApi.uuid)

  json = get_token
  @profile.set('token', json['token'])
  @profile.set('salt', json['salt'])

  CompanionApi::Request::SQEX_AUTH_URI + '?' + {
    'client_id'     => 'ffxiv_comapp',
    'lang'          => 'en-us',
    'response_type' => 'code',
    'redirect_uri'  => redirect_uri,
  }.to_query
end
redirect_uri() click to toggle source
# File lib/companion_api/resources/account.rb, line 97
def redirect_uri
  uid = CompanionApi.pbkdf2(@profile.get('userId'), @profile.get('salt'))
  @profile.set('uid', uid)

  CompanionApi::Request::OAUTH_CALLBACK + '?' + {
    'token'      => @profile.get('token'),
    'uid'        => uid,
    'request_id' => CompanionApi.uuid,
  }.to_query
end