
    mjG                       d Z 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ZddlmZmZ ddlmZ ddlmZmZ ddlmZ ddlmZmZ dd	lmZmZ dd
lmZmZ ddlmZm Z m!Z!  ee"      jG                         jH                  Z%e%dz  Z&dZ'dZ(dZ) ejT                  d      Z+dZ,dZ-dhdhe-dhdZ.d!dZ/d"d#dZ0d$dZ1d%dZ2d&dZ3d"d'dZ4 G d de      Z5d(dZ6e7d k(  r e6        yy))zLocal development server with real integration-test routes.

Production must move this route behind the platform admin session and a
proper application server. PostgreSQL testing uses the optional psycopg driver.
    )annotationsN)datetimetimezone)
HTTPStatus)SimpleHTTPRequestHandlerThreadingHTTPServer)Path)	HTTPErrorURLError)	urlencodeurlparse)Requesturlopen)IntegrationAdapterErrortest_cos_connectiontest_postgresql_connectionz.runtime-integrations.jsonzOhttps://ap-beijing.cloudmarket-apigw.com/service-18c38npd/idcard/VerifyIdcardv2z ap-beijing.cloudmarket-apigw.comz'/service-18c38npd/idcard/VerifyIdcardv2z^[0-9A-Za-z]{15,18}$zmock-user-001u   腾讯云市场 17684
PostgreSQL   腾讯云 COSztencent-marketplace-17684databasestorageidentityc                 f    t        j                  t        j                        j	                  d      S )Nz%a, %d %b %Y %H:%M:%S GMT)r   nowr   utcstrftime     )/opt/aitasker-platform-test/dev-server.pyutc_http_dater    3   s!    <<%../JKKr   c                v   t         j                  j                  dd      j                         xs | j                         }|st	        d      t        |      j                         st	        d      	 t        j                  t        |      j                  d            }|j                  d	      }|j                  d
      }t        |t              r|rt        |t              r|st	        d      ||fS # t        $ r}t	        d      |d }~wt        t        j                  f$ r}t	        d      |d }~ww xY w)N(TENCENT_MARKET_IDENTITY_CREDENTIALS_FILE u2   未配置 TENCENT_MARKET_IDENTITY_CREDENTIALS_FILEu6   实名认证服务端凭据引用必须是绝对路径utf-8encodingu*   实名认证服务端凭据文件不存在u-   实名认证服务端凭据文件不可读取secretId	secretKeyu>   实名认证服务端凭据文件缺少 secretId 或 secretKey)osenvirongetstripRuntimeErrorr	   is_absolutejsonloads	read_textFileNotFoundErrorOSErrorJSONDecodeError
isinstancestr)request_refrefpayloadexc	secret_id
secret_keys         r   read_credentialsr=   7   s   
**..CR
H
N
N
P
gT_TeTeTgCOPP9  "STTU**T#Y00'0BC
 J'I[)Ji%YjUX>Yak[\\j    RGHcQT))* UJKQTTUs$   3.C6 6	D8?DD8'D33D8c                     	 t        j                  t        j                  d            } t        | t              r| S i S # t        t
        t         j                  f$ r i cY S w xY w)Nr$   r%   )	r/   r0   RUNTIME_CONFIG_PATHr1   r2   r3   r4   r5   dict)r9   s    r   load_runtime_configrA   J   s]    **0::G:LM !$/77R7 w(<(<= 	s   )?  A"!A"c           	        t               }|j                  d      du t        |j                  d      xs d      d d t        |j                  d      xs d      d d t        |j                  d      xs d      d d t        |j                  d	      xs d      d d d
|| <   t        j	                  d      }|j                  t        j                  |dd      d       t        j                  |t               y )NenabledTproviderr#   x   endpointi,  
identifier	secretRef)rC   rD   rF   rG   rH   z.tmpF   )ensure_asciiindentr$   r%   )
rA   r+   r6   r?   with_suffix
write_textr/   dumpsr)   replace)servicevaluecurrent	temporarys       r   save_runtime_servicerT   R   s    !#G99Y'4/		*-34Tc:		*-34Tc:%))L17R8#>;/526t<GG $//7IG%JU\]JJy-.r   c                   t        |       }|j                  dk7  s&|j                  t        k7  s|j                  t
        k7  rt        d      t               }t        j                  t        j                  |j                  d      d| j                  d      t        j                        j                               j!                  d      }t#        j$                  |||ddd	      }t'        ||d
      j                  d      }	t)        | |	d      }
|
j+                  dd       |
j+                  d|       |
j+                  dt-        t/        j0                                      |
S )Nhttpsu-   实名认证接口地址不在允许范围内r$   zx-date: ascii)idzx-date	signatureF),:)rJ   
separators)cardNorealNamePOST)datamethodContent-Typez!application/x-www-form-urlencodedAuthorizationz
request-id)r   schemenetlocALLOWED_IDENTITY_HOSTpathALLOWED_IDENTITY_PATHr-   r    base64	b64encodehmacnewencodehashlibsha1digestdecoder/   rN   r   r   
add_headerr6   uuiduuid4)rF   	real_name
id_card_nor;   r<   parsed
date_valuerY   authorizationbodyrequests              r   build_v2_requestr|   a   s'   hF}}6==4I#IV[[\qMqJKKJ  ""7+x
|-D-K-KG-TV]VbVbcjjlfWo  JJJYGM
 
	BCJJ7SDhT&9G~'JK6|S%67Nr   c                   t        |      \  }}t        | ||||      }|j                  d      xs d}	 t        |d      5 }|j	                  d      }	|j
                  }
d d d        	 t        j                  	j                  d            }
dk\  rdd	d
dS |j!                  d      }t#        |j!                  d      t$              r|j!                  d      ni }|dk(  r|j!                  d      du rddd|dS |dk(  r|j!                  d      du rddd|dS |dk(  rddd |dS ddd!|d"S # 1 sw Y   xY w# t        $ r^}|j                  dv s|j                  dk\  rdd	d
dcY d }~S |j                  dv rddddcY d }~S ddd|j                   dcY d }~S d }~wt        t        f$ r	 dd	ddcY S t        $ r	 dd	ddcY S w xY w# t        t        j                  f$ r	 ddddcY S w xY w)#Nz
Request-idr#      )timeouti   )i  i  i  FRETRYABLE_ERRORu*   供应商暂时不可用，请稍后重试okcodemessage)i  i  REJECTEDu$   供应商凭据无效或无权调用u   供应商返回 HTTP u'   供应商连接超时，请稍后重试u$   实名认证服务网络连接失败r$   u!   供应商返回格式无法识别
error_coderesultr   isokTVERIFIEDu!   真实连接通过，实名匹配)r   statusr   	requestIdMISMATCHu3   接口已响应，但姓名与身份证号不匹配i& 	NO_RECORDu0   接口已响应，但供应商库中无此记录u'   供应商返回未识别的业务错误)r   r   r   r   )r=   r|   
get_headerr   readr   r
   r   TimeoutErrorr   r3   r/   r0   rq   UnicodeDecodeErrorr4   r+   r5   r@   )rF   ru   rv   credentials_refr;   r<   r{   
request_idresponserawhttp_statusr:   r9   r   r   s                  r   call_identity_providerr   v   s:   ,_=IzxJ	:VG##L17RJkWa( 	*H--	*C"//K	*a**SZZ01 c%6Copp\*J&0X1F&MW[["SUFQ6::f-5j=`oyzzQ6::f-6j=r  BL  M  	MVk>p  @J  K  	K8apz{{9	* 	*  `88z!SXX_):Gstt88z!@fggZ>STWT\T\S]<^__(# n%6Clmm k%6Cijjk
  4 45 aZ<_``ask   D7 D+D7 ($G +D40D7 7	G "F"G(F;GFGG3GGG)(G)c                  j     e Zd ZdZd fdZddZddZdddZddZddZ	ddZ
d fd	Zdd
Z xZS )HandlerzBetterTaskDev/1.0c                &    t        |   |g|  y )N)superlog_message)selfformatargs	__class__s      r   r   zHandler.log_message   s    F*T*r   c                X   t        j                  |d      j                  d      }| j                  |       | j	                  dd       | j	                  dd       | j	                  dt        t        |                   | j                          | j                  j                  |       y )	NF)rJ   r$   rb   zapplication/json; charset=utf-8zCache-Controlzno-storeContent-Length)
r/   rN   rm   send_responsesend_headerr6   lenend_headerswfilewrite)r   r   r9   r`   s       r   _jsonzHandler._json   s    zz'6==gF6")JK*5)3s4y>:

r   c                   t        | j                        j                  }|dk(  r| j                          y |dk(  r| j                          y |dk7  r%| j	                  t
        j                  dddd       y | j                          y )Nz/api/identity-verificationsz/api/admin/integration-configz/api/admin/integration-testsF	NOT_FOUNDu   接口不存在r   )r   rg   _handle_identity_verification_handle_integration_configr   r   r   _handle_integration_test)r   request_paths     r   do_POSTzHandler.do_POST   sz    		*//88..0::++-99JJz++E;[l-mn%%'r   c                h   	 t        | j                  j                  dd            }|dk  s||kD  ry 	 t	        j
                  | j                  j                  |      j                  d            }t        |t              r|S d S # t        $ r d}Y jw xY w# t        t        j                  f$ r Y y w xY w)Nr   0r   r$   )intheadersr+   
ValueErrorr/   r0   rfiler   rq   r   r4   r5   r@   )r   	max_bytescontent_lengthrz   s       r   _read_json_bodyzHandler._read_json_body   s    	 !1!12BC!HIN Q.9"<	::djjoon=DDWMND "$-t747  	N	 #D$8$89 		s"   %B =B BBB10B1c           	        | j                         }|%| j                  t        j                  dddd       y |j	                  d      }|j	                  d      }t        |j	                  d      t              r|j	                  d      nd}t        |j	                  d	      t              r|j	                  d	      nd}t        |j	                  d
      t              r|j	                  d
      nd}	 |dk(  r|dk(  rt        |||      }nx|dk(  r|dk(  rt        |||      }n_|dk(  r4|t        k(  r*|j	                  d      }|j	                  d      }	t        |t              r,|j                         rt        |j                               dkD  r%| j                  t        j                  dddd       y t        |	t              r#t        j                  |	j                               s%| j                  t        j                  dddd       y t        j                  j	                  dt               }
t#        |
|j                         |	j                         |      }n%| j                  t        j$                  dddd       y | j                  |j	                  d      rt        j2                  |       y t        j4                  |       y # t&        $ r>}| j                  |j(                  d|j*                  |j,                  d       Y d }~y d }~wt.        $ r7}| j                  t        j0                  ddt        |      d       Y d }~y d }~ww xY w)NFINVALID_BODY   请求数据无效r   rP   rD   rF   r#   rG   rH   r   r   r   r   r   r^   idCardNo2   INVALID_TEST_NAMEu   请填写有效的测试姓名INVALID_TEST_CARDu$   请填写有效的测试身份证号TENCENT_MARKET_IDENTITY_API_URLADAPTER_NOT_IMPLEMENTEDu3   该供应商暂未提供真实网络测试适配器CONFIG_MISSINGr   )r   r   r   BAD_REQUESTr+   r5   r6   r   r   IDENTITY_PROVIDERr,   r   ID_CARD_PATTERN	fullmatchr)   r*   DEFAULT_IDENTITY_ENDPOINTr   NOT_IMPLEMENTEDr   r   r   r   r-   SERVICE_UNAVAILABLEOKBAD_GATEWAY)r   rz   rP   rD   rF   rG   
secret_refr   ru   rv   identity_endpointr:   s               r   r   z Handler._handle_integration_test   s   ##%<JJz--e^`t/uv((9%88J'+5dhhz6JC+P488J'VX/9$((<:PRU/VTXXl+\^
.8+9NPS.TTXXk*Z\
 	*$\)A3Hj*UI%(o*E,Z:NJ&87H+H HHZ0	!XXj1
!)S19JcR[RaRaRcNdgiNiJJz55eM`  nN  8O  P!*c2/:S:ST^TdTdTf:gJJz55eM`  nT  8U  V$&JJNN3TVo$p!/%OO%$$&	 

.. *C  QF  G  	

FJJt$4:==RXY*:P:PRXY ' 	JJsuchhSVS^S^(_` 	JJz55eM]jmnqjr7st	s3   1CK
 6AK
 A3K
 
	M4LM-M

Mc           	        | j                   j                  d      t        k7  r%| j                  t        j
                  dddd       y | j                         }|%| j                  t        j                  dddd       y |j                  d      }|j                  d	      }|j                  d
      }t        |t              r,|j                         rt        |j                               dkD  r%| j                  t        j                  dddd       y t        |t              r#t        j                  |j                               s%| j                  t        j                  dddd       y |dk7  r%| j                  t        j                  dddd       y t               j                  d      }t        |t              r|ni }t         j"                  j                  dd      j                         xs" t        |j                  d      xs t$              }t        |j                  d      xs d      }	 t'        ||j                         |j                         |      }|j                  d      }
|
dv ry| j                  t        j,                  dt        t/        j0                               |
|
dk(  r1t3        j4                  t6        j8                        j;                         nd dd       y | j                  t        j<                  d|j                  dd       |j                  d!d"      d       y # t(        $ r7}	| j                  t        j*                  ddt        |	      d       Y d }	~	y d }	~	ww xY w)#NzX-BetterTask-Mock-SessionFUNAUTHORIZEDu   请先登录)successr   r   r   r   r^   r   consentVersionr   INVALID_NAMEu   请填写有效的真实姓名INVALID_CARDu   请填写有效的身份证号zidentity-v1CONSENT_REQUIREDu   请先同意实名认证授权r   r   r#   rF   rH   r   r   >   r   r   r   Tr   )verificationIdr   
verifiedAt)r   r`   r   IDENTITY_PROVIDER_ERRORr   u   实名认证服务暂不可用)r   r+   MOCK_SESSION_IDr   r   r   r   r   r5   r6   r,   r   r   r   rA   r@   r)   r*   r   r   r-   r   r   rs   rt   r   r   r   r   	isoformatr   )r   rz   ru   rv   consent_versionruntime_identityrF   r   r   r:   r   s              r   r   z%Handler._handle_identity_verification   s   <<78OKJJz..E>ft0uv##%<JJz--5.ey/z{HHZ(	XXj)
((#34)S)1Bc)//J[F\_aFaJJz--5.  fF  0G  H*c*/2K2KJL\L\L^2_JJz--5.  fF  0G  Hm+JJz--5J\  jJ  0K  L.044Z@/9:JD/Q+WY::>>"CRHNNP  WTWXhXlXlmwXx  YV  }V  UW)--k:@bA
	+Hioo6GIYIYI[]ghF H%::JJz}}$"%djjl"3 HNR\H\hll8<<8BBDbfA ' 
 

:))ufjjQWYrFs  AG  AK  AK  LU  Ww  Ax  ,y  	z  	JJz555Rborsvow7xy	s   3*L0 0	M09-M++M0c                   | j                         }||j                  d      t        vr%| j                  t        j
                  dddd       y t        |j                  d            }|j                  d      }|j                  d      }|j                  d      d	u }t        |t              r|t        |   vr%| j                  t        j
                  dd
dd       y |rlt        |j                  d      t              r(t        |j                  d            j                         s%| j                  t        j
                  dddd       y |rlt        |j                  d      t              r(t        |j                  d            j                         s%| j                  t        j
                  dddd       y |rEt        |t              r|j                         s%| j                  t        j
                  dddd       y 	 t        ||       dddd}| j                  t        j                  d	||    dd       y # t        $ r' | j                  t        j                  dddd       Y y w xY w)NrP   FINVALID_CONFIGu   接口配置数据无效r   rD   rH   rC   TINVALID_PROVIDERu$   供应商配置无效或暂未实现rG   MISSING_IDENTIFIERu   请填写服务标识rF   MISSING_ENDPOINTu   请填写接口地址MISSING_CREDENTIAL_REFu$   请填写服务端凭据文件引用CONFIG_SAVE_FAILEDu!   服务端无法保存接口配置u	   数据库u
   COS 存储u   实名接口r   u   配置已同步到服务端)r   r   )r   r+   RUNTIME_PROVIDERSr   r   r   r6   r5   r,   rT   r3   INTERNAL_SERVER_ERRORr   )r   rz   rP   rD   r   rC   service_namess          r   r   z"Handler._handle_integration_config  s&   ##%<488I.6GGJJz--eEUb|/}~dhhy)*88J'XXk*
((9%-(C(H<Mg<V,VJJz--eEW  eK  0L  MJtxx'=sC3txxXdOeKfKlKlKnJJz--eEYf}/~Jtxx
';SATXXV`MaIbIhIhIjJJz--eEWd{/|}Jz37z?O?O?QJJz--eE]  kQ  0R  S	 $/ &1\Wef

:==]7=S<TTo:p"qr	  	JJz77Oc  qT  :U  V	s   H> >-I.-I.c                    t        | j                        j                  }|dk(  r| j                          y t        |           y )Nz/api/admin/server-health)r   rg   _handle_server_healthr   do_GET)r   r   r   s     r   r   zHandler.do_GET8  s9    		*//55&&(r   c                   	 t        j                  t              }|j                  r&t	        |j
                  |j                  z  dz  d      nd}|j                  dz   d}	 t	        t        j                         d   d      }	 t        j                         rt        j                         j                  nd}t        |t         t"        f      r|d	k\  rd
nt        |t         t"        f      r|dk\  rdnd}dddddddddd|d||d|ddddt!        t%        j&                               dddddddd| ddd}| j)                  t*        j,                  ddt/        j0                  t2        j4                        j7                         |d       y# t        $ r d}d}Y >w xY w# t        t        f$ r d}Y 4w xY w# t        $ r d}Y w xY w)z<Return local development metrics for the admin health board.d      Ni   @z GB freeunavailabler   rI   Z   criticalP   warningnormal%zlocal development server)rQ   unitr   detailzhost monitoring requiredr#   z1 minute load averageszprocess uptimeitemszruntime config z bytes)cpumemorydiskloaduptimequeueTzlocal-dev-server)r   source	updatedAtmetrics)shutil
disk_usageROOTtotalroundusedfreer3   r)   
getloadavgAttributeErrorr?   existsstatst_sizer5   r   floattime	monotonicr   r   r   r   r   r   r   r   )r   r   disk_percentdisk_detailr   
state_sizedisk_statusr   s           r   r   zHandler._handle_server_health?  s   	($$T*DGKzz5$))djj"8C!?CW[L!YY956h?K	+Q/D	?R?Y?Y?[,113;;abJ %/|c5\$J|_aOajt~  @L  OR  TY  NZ  u[  `l  pr  `rgp  x@xKef !3(Nhi*C;Zef"B(Nef #DNN$4 5shbrs 'XSbcmbnntQuv
 	

:==9KZbZfZfgogsgsZtZ~Z~  [A  NU  #V  	W)  	(L'K	(
 ( 	D	  	J	s6   AF "!F# 4F; F F #F87F8;G
	G
)r   r6   r   objectreturnNone)r   r   r9   dict[str, object]r  r  r  r  )i @  )r   r   r  zdict[str, object] | None)__name__
__module____qualname__server_versionr   r   r   r   r   r   r   r   r   __classcell__)r   s   @r   r   r      s;    (N+(8,Z\&zPs<Wr   r   c                     t        j                  t               t        t         j                  j                  dd            } t        d| ft              }t        d|         |j                          y )NPORT5520z	127.0.0.1z4BetterTask dev server listening on http://127.0.0.1:)
r)   chdirr  r   r*   r+   r   r   printserve_forever)portservers     r   mainr&  \  sS    HHTNrzz~~ff-.D +t!4g>F	@
GH
r   __main__)r  r6   )r#   )r7   r6   r  ztuple[str, str])r  r  )rP   r6   rQ   r  r  r  )rF   r6   ru   r6   rv   r6   r;   r6   r<   r6   r  r   )
rF   r6   ru   r6   rv   r6   r   r6   r  r  r  )8__doc__
__future__r   ri   rn   rk   r/   r)   rer  r  rs   r   r   httpr   http.serverr   r   pathlibr	   urllib.errorr
   r   urllib.parser   r   urllib.requestr   r   integration_adaptersr   r   r   __file__resolveparentr  r?   r   rf   rh   compiler   r   r   r   r    r=   rA   rT   r|   r   r   r&  r  r   r   r   <module>r6     s   #     	 	    '  E  , , +  H~&&99 -  ; A "**45!+  "$?@ L!&8/*!|HW& WD zF r   