class PritunlApiClient::Api

Low-level communication to api server

Public Class Methods

new( base_url:, api_token:, api_secret:, verify_ssl: true ) click to toggle source

@param base_url [String] Full URL to a running Pritunl server (include the “https://”) @param api_token [String @param api_secret [String] @param verify_ssl [Boolean] Whether or not to verify SSL certificate]

# File lib/pritunl_api_client/api.rb, line 15
def initialize( base_url:, api_token:, api_secret:, verify_ssl: true )
  @api_token = api_token
  @api_secret = api_secret
  @client = RestClient::Resource.new( base_url, verify_ssl: verify_ssl )
end

Public Instance Methods

delete( path, params = nil ) click to toggle source

Send delete request to api server

@param path [String] URL path of api @param params [Hash, NilClass] Api parameters @return [Hash, Array, String] Response from api server

# File lib/pritunl_api_client/api.rb, line 60
def delete( path, params = nil )
  parameters = { params: params }
  parameters.merge!( common_headers )
  parameters.merge!( generate_auth_headers( path: path, params: params, method: 'DELETE' ) )
  parse_data @client[path].delete( parameters )
end
get( path, params = nil ) click to toggle source

Send get request to api server

@param path [String] URL path of api @param params [Hash, NilClass] Api parameters @return [Hash, Array, String] Response from api server

# File lib/pritunl_api_client/api.rb, line 37
def get( path, params = nil )
  parameters = { params: params }
  parameters.merge!( common_headers )
  parameters.merge!( generate_auth_headers( path: path, params: params, method: 'GET' ) )
  parse_data @client[path].get( parameters )
end
head( path, params = nil ) click to toggle source

Send head request to api server

@param path [String] URL path of api @param params [Hash, NilClass] Api parameters @return [Hash, Array, String] Response from api server

# File lib/pritunl_api_client/api.rb, line 72
def head( path, params = nil )
  headers = common_headers.merge( generate_auth_headers( path: path, params: params, method: 'HEAD' ) )
  params = JSON.generate( params, space: ' ' ) if params
  parse_data @client[path].head( params, headers )
end
post( path, params = nil ) click to toggle source

Send post request to api server

@param path [String] URL path of api @param params [Hash, NilClass] Api parameters @return [Hash, Array, String] Response from api server

# File lib/pritunl_api_client/api.rb, line 26
def post( path, params = nil )
  headers = common_headers.merge( generate_auth_headers( path: path, params: params, method: 'POST' ) )
  params = JSON.generate( params, space: ' ' ) if params
  parse_data @client[path].post( params, headers )
end
put( path, params = nil ) click to toggle source

Send put request to api server

@param path [String] URL path of api @param params [Hash, NilClass] Api parameters @return [Hash, Array, String] Response from api server

# File lib/pritunl_api_client/api.rb, line 49
def put( path, params = nil )
  headers = common_headers.merge( generate_auth_headers( path: path, params: params, method: 'PUT' ) )
  params = JSON.generate( params, space: ' ' ) if params
  parse_data @client[path].put( params, headers )
end

Private Instance Methods

common_headers() click to toggle source

Common headers to add to every request

@return [Hash]

# File lib/pritunl_api_client/api.rb, line 83
def common_headers
  { content_type: :json, accept: :json }
end
generate_auth_headers( path:, params: nil, method: ) click to toggle source

Authentication algorithm that is included in every request

@param path [String] URL path of api @param params [Hash, NilClass] Api parameters @param method [String] Uppercase method for the request @return [Hash]

# File lib/pritunl_api_client/api.rb, line 93
def generate_auth_headers( path:, params: nil, method: )
  auth_timestamp = Time.now.to_i
  auth_nonce = SecureRandom.hex( 16 )
  auth_string = [@api_token, auth_timestamp, auth_nonce, method, path]
  auth_string << JSON.generate( params, space: ' ' ) if params
  auth_string = auth_string.join( '&' )
  digest = OpenSSL::Digest.new( 'sha256' )
  hmac = OpenSSL::HMAC.digest( digest, @api_secret, auth_string )
  auth_signature = Base64.encode64( hmac ).chomp
  {
    auth_token:     @api_token,
    auth_timestamp: auth_timestamp,
    auth_nonce:     auth_nonce,
    auth_signature: auth_signature
  }
end
parse_data( data ) click to toggle source

Parse responses back from api server

@param data [String] @return [Hash, Array, String]

# File lib/pritunl_api_client/api.rb, line 114
def parse_data( data )
  JSON.parse( data )
rescue JSON::ParserError => e
  data
end