import  jwt 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  os 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  requests 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  datetime  import  datetime ,  timedelta 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  openpilot . system . hardware . hw  import  Paths 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  openpilot . system . version  import  get_version 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								API_HOST  =  os . getenv ( ' API_HOST ' ,  ' https://api.commadotai.com ' ) 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  Api ( ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  def  __init__ ( self ,  dongle_id ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    self . dongle_id  =  dongle_id 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    with  open ( Paths . persist_root ( ) + ' /comma/id_rsa ' )  as  f : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      self . private_key  =  f . read ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  def  get ( self ,  * args ,  * * kwargs ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  self . request ( ' GET ' ,  * args ,  * * kwargs ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  def  post ( self ,  * args ,  * * kwargs ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  self . request ( ' POST ' ,  * args ,  * * kwargs ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  def  request ( self ,  method ,  endpoint ,  timeout = None ,  access_token = None ,  * * params ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  api_get ( endpoint ,  method = method ,  timeout = timeout ,  access_token = access_token ,  * * params ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  def  get_token ( self ,  expiry_hours = 1 ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    now  =  datetime . utcnow ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    payload  =  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      ' identity ' :  self . dongle_id , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      ' nbf ' :  now , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      ' iat ' :  now , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      ' exp ' :  now  +  timedelta ( hours = expiry_hours ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    token  =  jwt . encode ( payload ,  self . private_key ,  algorithm = ' RS256 ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  isinstance ( token ,  bytes ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      token  =  token . decode ( ' utf8 ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  token 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  api_get ( endpoint ,  method = ' GET ' ,  timeout = None ,  access_token = None ,  * * params ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  headers  =  { } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  if  access_token  is  not  None : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    headers [ ' Authorization ' ]  =  " JWT  "  +  access_token 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  headers [ ' User-Agent ' ]  =  " openpilot- "  +  get_version ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  return  requests . request ( method ,  API_HOST  +  " / "  +  endpoint ,  timeout = timeout ,  headers = headers ,  params = params )