/* Ċ Ġ* ĠTencent Ġis Ġplease d Ġto Ġsupport Ġthe Ġopen Ġsource Ġcommunity Ġby Ġmaking ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġavailable . Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠTH L ĠA 2 9 ĠLimited , Ġa ĠTencent Ġcompany . Ġ ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġis Ġlicensed Ġunder Ġthe ĠMIT Ġlicense . Ċ Ġ* Ċ Ġ* ĠA Ġcopy Ġof Ġthe ĠMIT ĠLicense Ġis Ġincluded Ġin Ġthis Ġfile . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠTerms Ġof Ġthe ĠMIT ĠLicense : Ċ Ġ* Ġ------------------------------------------------ --- Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ċ Ġ* Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ġto Ġuse , Ġcopy , Ċ Ġ* Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe Ċ Ġ* ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT Ċ Ġ* ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN Ċ Ġ* ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , Ċ Ġ* ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE Ċ Ġ* ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . tencent . devops . sign . service Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . tencent . devops . common . api . exception . ErrorCode Exception Ċ import Ġcom . tencent . devops . common . log . utils . Build Log Printer Ċ import Ġcom . tencent . devops . sign . api . constant . Sign Message Code Ċ import Ġcom . tencent . devops . sign . api . enums . Enum Res ign Status Ċ import Ġcom . tencent . devops . sign . api . pojo . I pa Sign Info Ċ import Ġcom . tencent . devops . sign . dao . Sign History Dao Ċ import Ġcom . tencent . devops . sign . dao . Sign I pa Info Dao Ċ import Ġcom . tencent . devops . sign . utils . I pa File Util Ċ import Ġorg . jo lok ia . util . Base 6 4 Util Ċ import Ġorg . jooq . DSL Context Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . io . File Ċ Ċ @ Service Ċ class ĠSign Info Service ( ĊĠĠĠ Ġprivate Ġval Ġd sl Context : ĠDSL Context , ĊĠĠĠ Ġprivate Ġval Ġsign I pa Info Dao : ĠSign I pa Info Dao , ĊĠĠĠ Ġprivate Ġval Ġsign History Dao : ĠSign History Dao , ĊĠĠĠ Ġprivate Ġval Ġbuild Log Printer : ĠBuild Log Printer Ċ ) Ġ{ ĊĊĠĠĠ Ġfun Ġsave ( res ign Id : ĠString , Ġi pa Sign Info Header : ĠString , Ġinfo : ĠI pa Sign Info ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ res ign Id ] Ġsave Ġi pa Sign Info | header =$ ipa Sign Info Header | info =$ info ") ĊĠĠĠĠĠĠĠ Ġsign I pa Info Dao . save Sign Info ( dsl Context , Ġres ign Id , Ġi pa Sign Info Header , Ġinfo ) ĊĠĠĠĠĠĠĠ Ġval Ġexecute Count Ġ= Ġsign History Dao . init History ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl Context Ġ= Ġd sl Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres ign Id Ġ= Ġres ign Id , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠuserId Ġ= Ġinfo . userId , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprojectId Ġ= Ġinfo . projectId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġinfo . pipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġinfo . build Id , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠtaskId Ġ= Ġinfo . taskId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarchive Type Ġ= Ġinfo . archive Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarchive Path Ġ= Ġinfo . archive Path , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmd 5 Ġ= Ġinfo . md 5 ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! info . build Id . isNull Or Blank () Ġ&& Ġ! info . taskId . isNull Or Blank ()) Ġbuild Log Printer . add Line ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġinfo . build Id !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Start Ġres ign Ġi pa Ġpackage Ġwith Ġinfo : Ġ$ info ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġinfo . taskId !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Id Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġexecute Count ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġreturn Ġexecute Count ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfinish Upload ( res ign Id : ĠString , Ġi pa File : ĠFile , Ġinfo : ĠI pa Sign Info , Ġexecute Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ res ign Id ] Ġfinish Upload | ipa File =${ ipa File . canonical Path }| build Id =${ info . build Id }") ĊĠĠĠĠĠĠĠ Ġif Ġ(! info . build Id . isNull Or Blank () Ġ&& Ġ! info . taskId . isNull Or Blank ()) Ġbuild Log Printer . add Line ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġinfo . build Id !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Finished Ġi pa Ġpackage Ġupload : Ġ${ ipa File . name }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġinfo . taskId !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Id Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġexecute Count ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsign History Dao . finish Upload ( dsl Context , Ġres ign Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfinish Un zip ( res ign Id : ĠString , Ġunzip Dir : ĠFile , Ġinfo : ĠI pa Sign Info , Ġexecute Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ res ign Id ] Ġfinish Un zip | unzip Dir =${ unzip Dir . canonical Path }| build Id =${ info . build Id }") ĊĠĠĠĠĠĠĠ Ġif Ġ(! info . build Id . isNull Or Blank () Ġ&& Ġ! info . taskId . isNull Or Blank ()) Ġbuild Log Printer . add Line ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġinfo . build Id !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Finished Ġunzip Ġi pa Ġpackage : Ġ${ unzip Dir . name }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġinfo . taskId !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Id Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġexecute Count ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsign History Dao . finish Un zip ( dsl Context , Ġres ign Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfinish Res ign ( res ign Id : ĠString , Ġinfo : ĠI pa Sign Info , Ġexecute Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ res ign Id ] Ġfinish Res ign | build Id =${ info . build Id }") ĊĠĠĠĠĠĠĠ Ġif Ġ(! info . build Id . isNull Or Blank () Ġ&& Ġ! info . taskId . isNull Or Blank ()) Ġbuild Log Printer . add Line ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġinfo . build Id !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Finished Ġres ign !", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġinfo . taskId !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Id Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġexecute Count ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsign History Dao . finish Res ign ( dsl Context , Ġres ign Id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfinish Zip ( res ign Id : ĠString , Ġsigned I pa File : ĠFile , Ġinfo : ĠI pa Sign Info , Ġexecute Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult File Md 5 Ġ= ĠI pa File Util . get MD 5 ( signed I pa File ) ĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ res ign Id ] Ġfinish Zip | result File Md 5 =$ result File Md 5 | signed I pa File =${ signed I pa File . canonical Path }| build Id =${ info . build Id }") ĊĠĠĠĠĠĠĠ Ġif Ġ(! info . build Id . isNull Or Blank () Ġ&& Ġ! info . taskId . isNull Or Blank ()) Ġbuild Log Printer . add Line ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġinfo . build Id !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Finished Ġzip Ġthe Ġsigned Ġi pa Ġfile Ġwith Ġresult :${ signed I pa File . name }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġinfo . taskId !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Id Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġexecute Count ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsign History Dao . finish Zip ( dsl Context , Ġres ign Id , Ġsigned I pa File . name , Ġresult File Md 5 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfinish Archive ( res ign Id : ĠString , Ġinfo : ĠI pa Sign Info , Ġexecute Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ res ign Id ] Ġfinish Archive | build Id =${ info . build Id }") ĊĠĠĠĠĠĠĠ Ġif Ġ(! info . build Id . isNull Or Blank () Ġ&& Ġ! info . taskId . isNull Or Blank ()) Ġbuild Log Printer . add Line ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġinfo . build Id !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" Finished Ġarchive Ġthe Ġsigned Ġi pa Ġfile . Ġ( archive Type =${ info . archive Type }, archive Path =${ info . archive Path })", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġinfo . taskId !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Id Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġexecute Count ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsign History Dao . finish Archive ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl Context Ġ= Ġd sl Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres ign Id Ġ= Ġres ign Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġsuccess Res ign ( res ign Id : ĠString , Ġinfo : ĠI pa Sign Info , Ġexecute Count : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ res ign Id ] Ġsuccess Ġres ign | build Id =${ info . build Id }") ĊĠĠĠĠĠĠĠ Ġif Ġ(! info . build Id . isNull Or Blank () Ġ&& Ġ! info . taskId . isNull Or Blank ()) Ġbuild Log Printer . add Line ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġinfo . build Id !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" End Ġres ign Ġi pa Ġfile .", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġinfo . taskId !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Id Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġexecute Count ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsign History Dao . success Res ign ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl Context Ġ= Ġd sl Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres ign Id Ġ= Ġres ign Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġfail Res ign ( res ign Id : ĠString , Ġinfo : ĠI pa Sign Info , Ġexecute Count : ĠInt Ġ= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" [$ res ign Id ] Ġfail Ġres ign | build Id =${ info . build Id }") ĊĠĠĠĠĠĠĠ Ġif Ġ(! info . build Id . isNull Or Blank () Ġ&& Ġ! info . taskId . isNull Or Blank ()) Ġbuild Log Printer . add Line ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Id Ġ= Ġinfo . build Id !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage Ġ= Ġ" End Ġres ign Ġi pa Ġfile .", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= Ġinfo . taskId !! , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Id Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexecute Count Ġ= Ġexecute Count ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġsign History Dao . fail Res ign ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġd sl Context Ġ= Ġd sl Context , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġres ign Id Ġ= Ġres ign Id ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Sign Status ( res ign Id : ĠString ): ĠEnum Res ign Status Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrecord Ġ= Ġsign History Dao . get Sign History ( dsl Context , Ġres ign Id ) ĊĠĠĠĠĠĠĠ Ġreturn ĠEnum Res ign Status . parse ( record ?. status ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/* ĊĠĠĠ Ġ* Ġæ£Ģ æŁ¥ I pa Sign Info ä¿¡æģ¯ ï¼Į å¹¶ è¡¥ é½Ĳ é»ĺè®¤ åĢ¼ ï¼Į å¦Ĥæŀľ è¿ĶåĽŀ null åĪĻ è¡¨ç¤º I pa Sign Info çļĦåĢ¼ ä¸į åĲĪ æ³ķ ĊĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġfun Ġcheck ( info : ĠI pa Sign Info ): ĠI pa Sign Info Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! info . wildcard ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . mobile Provision Id . isNull Or Blank ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠErrorCode Exception ( errorCode Ġ= ĠSign Message Code . ERROR _ CHECK _ SIGN _ INFO _ HEADER , Ġdefault Message Ġ= Ġ" éĿŀ éĢļ éħį ç¬¦ éĩį çŃ¾ æľª æĮĩå®ļ ä¸» æııè¿° æĸĩä»¶ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . cert Id . isBlank ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠErrorCode Exception ( errorCode Ġ= ĠSign Message Code . ERROR _ CHECK _ SIGN _ INFO _ HEADER , Ġdefault Message Ġ= Ġ" éĿŀ éĢļ éħį ç¬¦ éĩį çŃ¾ æľª æĮĩå®ļ è¯ģ ä¹¦ SHA ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġinfo ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdecode I pa Sign Info ( ipa Sign Info Header : ĠString , ĠobjectMapper : ĠObjectMapper ): ĠI pa Sign Info Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi pa Sign Info Header Decode Ġ= ĠString ( Base 6 4 Util . decode ( ipa Sign Info Header )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠobjectMapper . readValue ( ipa Sign Info Header Decode , ĠI pa Sign Info :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" è§£æŀĲ çŃ¾åĲį ä¿¡æģ¯ å¤±è´¥ ï¼ļ $ e ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠErrorCode Exception ( errorCode Ġ= ĠSign Message Code . ERROR _ PARSE _ SIGN _ INFO _ HEADER , Ġdefault Message Ġ= Ġ" è§£æŀĲ çŃ¾åĲį ä¿¡æģ¯ å¤±è´¥ ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġencode I pa Sign Info ( ipa Sign Info : ĠI pa Sign Info ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠobjectMapper Ġ= ĠObjectMapper () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġi pa Sign Info Json Ġ= ĠobjectMapper . writeValue AsString ( ipa Sign Info ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBase 6 4 Util . encode ( ipa Sign Info Json . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" ç¼ĸçłģ çŃ¾åĲį ä¿¡æģ¯ å¤±è´¥ ï¼ļ $ e ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠErrorCode Exception ( errorCode Ġ= ĠSign Message Code . ERROR _ ENCODE _ SIGN _ INFO , Ġdefault Message Ġ= Ġ" ç¼ĸçłģ çŃ¾åĲį ä¿¡æģ¯ å¤±è´¥ ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Sign Info Service :: class . java ) ĊĠĠĠ Ġ} Ċ }