
    F/jN                       d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlmZmZ d dlmZmZ d dlmZ d dlmZ d dlmZ dZd	Zd
Z ee                                          j        ZdZdZ	 d dlm Z! n# e"$ r dZ!Y nw xY wd/dZ#d0dZ$d1dZ% e%            Z&d2dZ'd2dZ(d3dZ)d4d!Z*d5d%Z+d6d'Z,d7d)Z- G d* d+e          Z.d8d-Z/e0d.k    r e/             dS dS )9    )annotationsN)datetimetimezone)SimpleHTTPRequestHandlerThreadingHTTPServer)Path)Any)quotez	127.0.0.1iS"  z/api)z1https://chatgpt.com/backend-api/payments/checkoutz5https://chat.openai.com/backend-api/payments/checkouta  #fidkdWxOYHwnPyd1blpxYHZxWjA0Tm5nNWZVMXNEaG1qPE1pY0J1ZzZTR3VXYmFDRXF%2FVEE1RTVBcWlcV0RXYmFCM3FvT3N2YnV1N29sU3Fxd31pQ01NNE53Qz1MN09EMDNsNmxzR1U3c0dTRnNRbX1NMWc1JyknYTNQNnFmYWB2cWAnPyd2bGtiaWBabHFgaCcpJ2BrZGdpYFVpZGZgbWppYFZmYWpsKGZkaWAnPyd1bXFxdWFxY2AoaHBwZGRlc2Aob3V0b3Ryd2BnZWFgK2ZqaWZgKWpwbGdrYWx0Y2BgJz8ndnBgcW5gK2BkaWBkaWAnPydmYGJmamBgKWpoWG0nKSd2Y2pmbWAnPyd2cWBwZWBgaCcpJ2pqZnZgK21qYGFjamAnPydyaGN0ZWFgamBiaWBqaGAnPydgbXBwZ3Aoa2x3Y2AoaWFoZ2Aoa3JgKGp1ZHJgKHZgKG5waXAnPydkaGdgK2hkYCc%3D)requestspayloaddict[str, Any]statusintreturntuple[int, bytes]c               \    t          j        | d                              d          }||fS )NFensure_asciiutf-8)jsondumpsencode)r   r   bodys      //home/admin/payment-longlink/longlink_server.py_json_bytesr   (   s.    :gE22299'BBD4<    textstrc                    t          j        dt          | pd                    }|sdS |                    d                                          S )Nz(LONG_LINK_UPSTREAM_PROXY="?([^"\r\n]+)"?    )researchr   groupstrip)r   matchs     r   _extract_proxy_valuer'   -   sG    IA3tzr??SSE r;;q>>!!!r   c                 J   t           dz  t           dz  t           dz  fD ]Q} 	 |                                 r*t          |                     dd                    }|r|c S B# t          $ r Y Nw xY wt          t          j        d          pd                                          S )	Nzproxy.new.confzproxy.conf.tmpzproxy_jp.conf.tmpr   ignore)encodingerrorsLONG_LINK_UPSTREAM_PROXYr    )	ROOTis_filer'   	read_text	Exceptionr   osgetenvr%   )
proxy_fileproxy_values     r   _resolve_upstream_proxyr5   4   s    ..7G0GPcIcd  
	!!## '2:3G3GQXai3G3j3jkk '&&&& 	 	 	H	ry344:;;AACCCs   ;A  
A-,A-tokenc                   	 t          | pd                              d          }t          |          dk    ri S |d         }|ddt          |          dz  z
  dz  z  z  }t          j        |                    d                                        dd	          }t          j        |          }t          |t                    r|ni S # t          $ r i cY S w xY w)
Nr    .   r!   =   r   replacer+   )r   splitlenbase64urlsafe_b64decoder   decoder   loads
isinstancedictr0   )r6   partsr   decodeddatas        r   _decode_jwt_payloadrI   C   s    
EKR  &&s++u::??I(31s7||a//1455*7>>'+B+BCCJJ7[dJeez'""!$--5tt25   			s   8C
 BC
 
CCc           	        t          |           }|                    d          }t          t          j        t
          j                                                            }|                    d          pi }t          |          t          t          |t                    o||k              t          |t                    r3t          j
        |t
          j                                      d          ndt          |                    d          pd          t          |                    d          pd          d d         t          t                    d	}|S )
Nexpzhttps://api.openai.com/auth)tzz%Y-%m-%dT%H:%M:%SZr    chatgpt_plan_typechatgpt_account_id   )token_decodedtoken_expiredtoken_exp_utctoken_plan_typetoken_account_idproxy_enabled)rI   getr   r   nowr   utc	timestampboolrD   fromtimestampstrftimer   UPSTREAM_PROXY)r6   r   rK   now_ts
auth_claimdiagnosticss         r   _token_diagnosticsra   Q   s"   !%((G
++e

Chl++557788F:;;ArJgjc22Dsf}EE #s##H"38<888AABVWWWz~~.ABBHbII
/C D D JKKCRCPn-- K r   remote_bodybytescontent_typec                h   d}	 |                      dd          }n# t          $ r d}Y nw xY wt          |           |d|                                v d|                                v |d d         d}d	|pd                                v r	 t	          j        |          }t          |t                    rlt          t          |
                                                    d d
         |d<   d|v r/t          |                    d          pd          d d         |d<   n# t          $ r Y nw xY w|S )Nr    r   r<   r=   z
free trialplus-1-month-free,  )response_bytesrd   has_free_trial_texthas_plus_month_free_textbody_previewapplication/json   	json_keysurlx   checkout_url_prefix)rB   r0   r?   lowerr   rC   rD   rE   sortedlistkeysr   rV   )rb   rd   r   diagparseds        r   _pricing_diagnosticsrx   e   s^   D!!')!<<    k**$+tzz||;$74::<<$GTcT
 D l0b779999	Z%%F&$'' U$*4+>+>$?$?$D[!F??25fjj6G6G6M22N2NtPSt2TD./ 	 	 	D	Ks    ++BD" "
D/.D/ro   c                j    t          | pd          }d|vrdS ||                    d          d          S )Nr    #)r   index)ro   r   s     r   _extract_hosted_url_fragmentr|      s:    syb>>D
$r

3!!""r   processor_entityr	   checkout_session_idc                    t          | pd                                          }t          |pd                                          }|r|sdS dt          |           dt          |           S )Nr    zhttps://chatgpt.com/checkout//)r   r%   r
   )r}   r~   entity
session_ids       r   _build_short_checkout_urlr      sx    !'R((..00F(.B//5577J  rN5==NN5;L;LNNNr   rH   c                   t          |                     d          p+|                     d          p|                     d          pd                                          }|r|S t          |                     d          pd                                          }|sdS t          |          pt          }dt          |           | S )Nro   stripe_hosted_urlcheckout_urlr    r~   zhttps://pay.openai.com/c/pay/)r   rV   r%   r|   DEFAULT_LONG_URL_FRAGMENTr
   )rH   existingr   fragments       r   _build_long_checkout_urlr      s    488E??edhh/B&C&CetxxP^G_G_eceffllnnH TXX344:;;AACCJ r+H55R9RHH5+<+<HhHHHr   tuple[bytes, dict[str, Any]]c                <   dt          |pd                                          vr| i fS 	 t          j        |                     d                    }n# t
          $ r | i fcY S w xY wt          |t                    s| i fS t          |          }t          |
                    d          |
                    d                    }|r||d<   ||d<   ||d<   |r
||d	<   ||d
<   |r||d<   n|r||d<   t          j        |d                              d          }||fS )Nrl   r    r   r}   r~   ro   r   long_url	short_urlopenai_checkout_urlpreferred_urlFr   )r   rr   r   rC   rB   r0   rD   rE   r   r   rV   r   r   )rb   rd   rw   r   r   r   s         r   _normalize_checkout_responser      sg   \%7R!8!8!>!>!@!@@@BK..w7788   Bfd## B'//H)&**5G*H*H&**UjJkJkllI & u&."#%z 2'{(1$% +"+	 +"*:f511188AAD<s   'A A$#A$c                  N     e Zd Z fdZd fdZddZd fdZddZddZ xZ	S )LonglinkHandlerc                b     t                      j        |dt          t                    i| d S )N	directory)super__init__r   r-   )selfargskwargs	__class__s      r   r   zLonglinkHandler.__init__   s0    $>#d))>v>>>>>r   r   Nonec                    |                      dd           |                      dd           |                      dd           t                                                       d S )NzAccess-Control-Allow-Origin*zAccess-Control-Allow-HeadersContent-TypezAccess-Control-Allow-MethodszGET,POST,OPTIONS)send_headerr   end_headers)r   r   s    r   r   zLonglinkHandler.end_headers   se    6<<<7HHH79KLLLr   c                X    |                      d           |                                  d S )N   )send_responser   )r   s    r   
do_OPTIONSzLonglinkHandler.do_OPTIONS   s.    3r   c                   | j                             d          t           dk    rt          ddt	          t
                    dd          \  }}|                     |           |                     dd	           |                     d
t          t          |                               | 
                                 | j                            |           d S t                                                       d S )Nr   /healthTlonglink_server)okservicerU      r   r   application/json; charset=utf-8Content-Length)pathrstrip
API_PREFIXr   rZ   r]   r   r   r   r?   r   wfilewriter   do_GET)r   r   r   r   s      r   r   zLonglinkHandler.do_GET   s    9C  z$:$:$:::&0%).%9%9 
   LFD v&&&^-NOOO-s3t99~~>>>JT"""Fr   c                   | j                             d          }|t           dt           dhvrt          ddid          \  }}|                     |           |                     dd	           |                     d
t          t          |                               |                                  | j	        
                    |           d S t          | j                            d
          pd          }|dk    r| j                            |          nd}	 t!          j        |                    d                    }n# t&          $ r t          ddid          \  }}|                     |           |                     dd	           |                     d
t          t          |                               |                                  | j	        
                    |           Y d S w xY wt          |                    d          pd                                          }|                                                    d          r|dd                                          }|st          ddid          \  }}|                     |           |                     dd	           |                     d
t          t          |                               |                                  | j	        
                    |           d S t          |                    d          pd          |                    d          pdddt          |                    d          pd          |                    d          pddd t          |                    d!          pd"          d#}t/          j                    j        d d$         }	t5          t!          j        d%|	|                    d          |                    d          |                    d          t9          t:                    d&d'          d()           |                     ||          \  }
}}}}|rt5          t!          j        d*|	||d+d'          d()           t          d|id,          \  }}|                     |           |                     dd	           |                     d
t          t          |                               |                                  | j	        
                    |           d S i }|
dk     rt?          ||          \  }}d-|	|
|tA          ||          d.}|r]|                    d/          p|                    d0          pd|                    d1          pd|                    d2          pdd3|d4<   t5          t!          j        |d'          d()           |
dk    r.d}	 |                    dd56          d d7         }n# t&          $ r d8}Y nw xY wt5          d9|
 d:| d()           |
d;k    r|                                r|                                d<v rtC          |          }t          d=d>|d?d;          \  }}|                     |           |                     dd	           |                     d
t          t          |                               |                                  | j	        
                    |           d S 	 |                     |
           |                     d|           |                     d
t          t          |                               |                                  | j	        
                    |           d S # t&          $ r}t          dd@| id,          \  }}|                     |           |                     dd	           |                     d
t          t          |                               |                                  | j	        
                    |           Y d }~d S d }~ww xY w)ANr   z/requestz	/checkouterror	not_foundi  r   r   r   r   r   r   r   invalid_jsoni  r6   r    zbearer    missing_token	plan_namechatgptplusplanbilling_detailsDEEUR)countrycurrency
cancel_urlz https://chat.openai.com/#pricingpromo_campaignrf   F)promo_campaign_idis_coupon_from_query_paramcheckout_ui_modehosted)r   r   r   r   r   
   checkout_request)tag
request_idr   r   r   rU   r   T)flushcheckout_forward_error)r   r   r   forward_metai  checkout_response)r   r   status_coder   pricing_diagr   ro   r   r   )r   r   r   normalized_linksr<   r=   rg   z<binary>z[longlink] upstream HTTP z, body preview: i  >   {}nullupstream_forbiddenz[Upstream rejected this request (likely risk-control / IP reputation / account restriction).)r   detailr`   zproxy_response_exception: )"r   r   r   r   r   r   r   r?   r   r   r   r   headersrV   rfilereadr   rC   rB   r0   r%   rr   
startswithuuiduuid4hexprintr   rZ   r]   _forward_checkoutr   rx   ra   )r   normalized_pathr   r   content_lengthrawrH   r6   checkout_payloadr   r   rd   rb   errr   normalized_jsonlog_payloadpreviewrv   excs                       r   do_POSTzLonglinkHandler.do_POST   s   )**3//j#:#:#:z<T<T<T"UUU&'=cJJJLFDv&&&^-NOOO-s3t99~~>>>JT"""FT\--.>??D1EE1?!1C1Cdjoon---		:cjj1122DD 	 	 	&'@MMMLFDv&&&^-NOOO-s3t99~~>>>JT"""FF	 DHHW%%+,,2244;;==##I.. 	&!""IOO%%E 	&'A#NNNLFDv&&&^-NOOO-s3t99~~>>>JT"""F TXXk22G6GHH#xx(9::b$\a>b>bdhh|44Z8Z[["hh'788 _%8X]^^ #DHH-?$@$@$LH M M
 
 Z\\%crc*
J-",'7';';<M'N'N!1!5!5k!B!B&6&:&:;K&L&L%).%9%9  #
 
 
 	
 	
 	
 	
 EIDZDZ[`brDsDsA\;\ 	
7&0!$(4	  "'       '~cBBBLFDv&&&^-NOOO-s3t99~~>>>JT"""F*,+GUa+b+b(K '$&(0lKK
 
  	+//
;;_?R?RSX?Y?Y_]_,00==C!0!4!4_!E!E!K/ /K*+
 	dj5999FFFF#G%%,,WY,GGM % % %$%TkTT7TT\`aaaac!!7==??!gmmooQ_>_>_)%00*!5"'+ 
       ""6***  1RSSS  !13s4yy>>BBB  """
  &&&	#{+++^\:::-s3{3C3C/D/DEEEJ[))))) 	# 	# 	#&1Sc1S1S'T]`aaaLFDv&&&^-NOOO-s3t99~~>>>JT"""""""""	#s?   'E B)G32G3/X XXB	^& &
a0B"aar6   r   r   r   +tuple[int, str, bytes, str, dict[str, Any]]c                T   g }t           '	 g }t          D ]}t          j        |d| dddddd|ddt          pd 	          }t	          |j        pd
          }t          |j        pd          }t          |j	        
                    d          pd          }	|                    |d|d           |dk     r||	|d|d|dfc S |                    | d|            ddd
dd                    |           dd|ifS # t          $ r'}d|}
|                    d|
d           Y d }~n
d }~ww xY wd}
d }t          rIt          j                            t          j                            t          t          d                    }t%          j                    }g }t          D ]]}t)          j        |                              d          }t          j                            ||dd| dddddd          }	 ||                    |d          }n"t          j                            |d|           }|5  |                                }t          |                                pd!          }|j	        
                    dd          }	|                    |d"|d           |dk     r||	|d|d"|dfcd d d            c S |                    | d|            d d d            n# 1 swxY w Y   T# t          j        j        $ r}|                                pd
}t          |j        pd          }|j	        pi }|
                    dd          }	|                    |d"|d           |dk     r||	|d|d"|dfcY d }~c S |                    | d|            Y d }~d }~wt          $ rK}|                    |d"t?          |          d#           |                    | d$|           Y d }~Wd }~ww xY w|rd                    |          nd%}ddd
d&| d'|
 dd|ifS )(NzBearer rl   zhttps://chatgpt.comzhttps://chatgpt.com/zoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36)Authorizationr   AcceptOriginRefererz
User-Agent   chrome)r   r   timeoutimpersonateproxyr   i  r   r   	curl_cffi)ro   	transportr   r    )selected_urlr   attemptsz	 -> HTTP r   z+proxy_exception: all_checkout_urls_failed [z; ]r   zcurl_cffi_exception: )r   r   curl_cffi_not_available)httphttpsr   POST)rH   methodr   )r   )r   contextr   urllib)ro   r   r   z -> unknown_errorzproxy_exception: z [) curl_requestsCHECKOUT_URLSpostr]   rc   contentr   r   r   r   rV   appendjoinr0   r   requestbuild_openerProxyHandlersslcreate_default_contextr   r   r   Requestopenurlopenr   getcoder   	HTTPErrorcoderepr)r   r6   r   r   r+   r   responser   r   rd   curl_errr   openerctxfallback_errorsreq_datareqresprb   r   r   joineds                         r   r   z!LonglinkHandler._forward_checkouta  s    *,$)$&$1 F FL,1$->u->->,>&8&;'=!h
! 
! . "$,,4!     H$ !!1!8S99D !5!<==F#&x'7';';N'K'K'pOp#q#qLOOL{^d$e$efff||%|T2,8)4(0@ @     
 MM\"D"DF"D"DEEEE;SV$))FBSBSVVV)* *  O O O:3::kH M MNNNNNNNNO 1H 	^00++^n,],]^^ F (**%') 2	E 2	ELz"233::7CCH.((%6u%6%6$6035`
 
	 )  C  E%!;;sB;77DD!>11#r31OOD T T"&))++K"%dllnn&;"<"<K#'<#3#3NDe#f#fLOOLx[f$g$ghhh"S((*L+r,8)1(0L L  T T T T T T T T T T $**l+R+R[+R+RSSST T T T T T T T T T T T T T T <) P P P!hhjj/C!#(/c22++&{{>;\]]8Wb c cddd$$&k2(4%-$,H H         
  &&,'N'N'N'NOOOOOOOO E E E8VZ[^V_V_ ` `aaa&&,'C'CC'C'CDDDDDDDDE 0?S?+++O3S:cf:c:cX`:c:c:cf
 
 	
s   B6C> :C> >
D/D**D/:>K68A<K)4K6K)K6)K-	-K60K-	1K66O>
A4N&>O>N&&O>3A O99O>r   r   )r6   r   r   r   r   r   )
__name__
__module____qualname__r   r   r   r   r   r   __classcell__)r   s   @r   r   r      s        ? ? ? ? ?             $J# J# J# J#Xp
 p
 p
 p
 p
 p
 p
 p
r   r   r   c                 4   t          t          t          ft                    } t	          dt           dt           d           t	          dt           dt           t
           d           t	          dt          rdnd            |                                  d S )	Nz[longlink] serving at http://:z/longlink.htmlz [longlink] health check: http://r   z[longlink] upstream proxy: enableddisabled)r   HOSTPORTr   r   r   r]   serve_forever)servers    r   mainr*    s     $??F	
E$
E
E
E
E
EFFF	
MT
M
MD
M*
M
M
MNNN	
U^(S		
U
UVVV
r   __main__)r   r   r   r   r   r   )r   r   r   r   )r   r   )r6   r   r   r   )rb   rc   rd   r   r   r   )ro   r   r   r   )r}   r	   r~   r	   r   r   )rH   r   r   r   )rb   rc   rd   r   r   r   r  )1
__future__r   r   r1   r"   r  urllib.errorr   urllib.requestr@   r   r   r   http.serverr   r   pathlibr   typingr	   urllib.parser
   r&  r'  r   __file__resolveparentr-   r  r   r   r   r  r0   r   r'   r5   r]   rI   ra   rx   r|   r   r   r   r   r*  r   r   r   <module>r7     s   " " " " " "  				 				 



           ' ' ' ' ' ' ' ' E E E E E E E E                  
tH~~&
 3333333   MMM   
" " " "	D 	D 	D 	D )(**      (   4# # # #O O O OI I I I   8\
 \
 \
 \
 \
. \
 \
 \
~    zDFFFFF s   6A= =BB