/******************************************************************************* Ċ Ġ* ĠThe ĠMIT ĠLicense Ġ( MIT ) Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 1 9 Ġvk . com Ċ Ġ* Ċ Ġ* Ġ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 . vk . api . sdk . internal Ċ Ċ import Ġandroid . net . Uri Ċ import Ġcom . vk . api . sdk . utils . VK Utils Ċ import Ġcom . vk . api . sdk . utils . thread Local Ċ Ċ /** Ċ Ġ* ĠHelper Ġobject Ġfor Ġrequests Ġsigning . Ċ Ġ*/ Ċ object ĠQuery String Generator Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġstr Builder Ġby Ġthread Local Ġ{ ĠStringBuilder () Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuild Ġsigned Ġquery Ġfor Ġapi Ġmethod Ġ( adds Ġsig Ġparam Ġif Ġsecret Ġis Ġnot Ġnull ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġalso Ġadds Ġnecessary Ġarguments Ġ( v Ġ& Ġhttps Ġ& Ġ( access _ token Ġ| Ġapp _ id )) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Signed QueryString For Method ( ĊĠĠĠĠĠĠĠ ĠmethodName : ĠString , ĊĠĠĠĠĠĠĠ Ġmethod Args : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġmethod Version : ĠString , ĊĠĠĠĠĠĠĠ ĠaccessToken : ĠString ?, ĊĠĠĠĠĠĠĠ Ġsecret : ĠString ?, ĊĠĠĠĠĠĠĠ ĠappId : ĠInt ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Signed QueryString ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= Ġ"/ method /$ methodName ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs Ġ= Ġmethod Args , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= Ġmethod Version , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken Ġ= ĠaccessToken , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecret Ġ= Ġsecret , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠappId Ġ= ĠappId ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuild Ġnot Ġsigned Ġquery Ġstring Ġ( without Ġadding Ġof Ġsig Ġparam ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġalso Ġadds Ġnecessary Ġarguments Ġ( v Ġ& Ġhttps Ġ& Ġ( access _ token Ġ| Ġapp _ id )) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Not Signed QueryString ( ĊĠĠĠĠĠĠĠ Ġargs : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġversion : ĠString , ĊĠĠĠĠĠĠĠ ĠaccessToken : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ ĠappId : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Signed QueryString ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargs Ġ= Ġargs , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion Ġ= Ġversion , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠaccessToken Ġ= ĠaccessToken , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecret Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠappId Ġ= ĠappId ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuild Ġsigned Ġquery Ġstring Ġfor Ġany Ġpath . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġmethod Ġalso Ġadds Ġnecessary Ġarguments Ġ( v Ġ& Ġhttps Ġ& Ġ( access _ token Ġ| Ġapp _ id )) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Signed QueryString ( ĊĠĠĠĠĠĠĠ Ġpath : ĠString , ĊĠĠĠĠĠĠĠ Ġargs : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġversion : ĠString , ĊĠĠĠĠĠĠĠ ĠaccessToken : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġsecret : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ ĠappId : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠÐĶ Ð¾Ð±Ð°Ð² Ð»Ñı ÐµÐ¼ ĠÐ¿Ð°ÑĢÐ°Ð¼ÐµÑĤ ÑĢÑĭ , ĠÐºÐ¾ÑĤÐ¾ÑĢÑĭÐµ ĠÐ½ ÑĥÐ¶ Ð½Ñĭ ĠÐ²Ñģ ÐµÐ¼ ĠÐ·Ð°Ð¿ ÑĢÐ¾Ñģ Ð°Ð¼ : ĊĠĠĠĠĠĠĠ Ġ// ĠÐĴ ÐµÑĢ Ñģ Ð¸ Ñİ Ġapi , Ġhttps = 1 Ġ( Ñĩ ÑĤÐ¾ - ÑĤÐ¾ Ġlegacy , ĠÐºÐ¾ÑĤÐ¾ÑĢ Ð¾Ðµ ĠÐ» ÑĥÑĩ ÑĪÐµ ĠÐ½Ðµ ĠÑĤÑĢ Ð¾Ð³ Ð°ÑĤÑĮ ), ĠAT ĠÐ¸Ð»Ð¸ Ġapi _ id ĊĠĠĠĠĠĠĠ Ġval Ġactual Args Ġ= Ġargs . to Mutable Map () ĊĠĠĠĠĠĠĠ Ġactual Args [" v "] Ġ= Ġversion ĊĠĠĠĠĠĠĠ Ġactual Args [" https "] Ġ= Ġ" 1 " ĊĠĠĠĠĠĠĠ Ġif Ġ(! accessToken . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Args [" access _ token "] Ġ= ĠaccessToken ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( appId Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactual Args [" api _ id "] Ġ= ĠappId . toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Signed QueryString Force ( path , Ġactual Args , Ġsecret ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠBuild Ġsigned Ġquery Ġwithout Ġadding Ġany Ġparams . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġbuild Signed QueryString Force ( ĊĠĠĠĠĠĠĠ Ġpath : ĠString , ĊĠĠĠĠĠĠĠ Ġargs : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠ Ġsecret : ĠString ? ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠÐĹ Ð°Ðº Ð¸Ð´ ÑĭÐ² Ð°ÐµÐ¼ ĠÐ²Ñģ Ñĳ ĠÐ² ĠUri , ĠÑĩ ÑĤ Ð¾Ð± ĠÐ¿Ð¾Ð»ÑĥÑĩ Ð¸ÑĤÑĮ ĠÑį Ð½ Ðº Ð¾Ð´ Ð¸Ð½ Ð³ ĠÐ¸Ð· ĠÐº Ð¾ÑĢ Ð¾Ð± ÐºÐ¸ ĊĠĠĠĠĠĠĠ Ġval Ġuri Builder Ġ= ĠUri . Builder () ĊĠĠĠĠĠĠĠ Ġargs . entries . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠÐŁ ÑĢ Ð¾Ð¿ ÑĥÑģ ÐºÐ° ÐµÐ¼ Ġsig , ĠÑĤ . Ðº . ĠÐ¼Ñĭ ĠÐ´Ð¾Ð»Ð¶ Ð½Ñĭ ĠÑģ Ð°Ð¼Ð¸ ĠÐ¿ Ð¾ÑģÑĤ ÑĢÐ¾ Ð¸ÑĤÑĮ ĠÐ¿ÑĢÐ°Ð² Ð¸Ð»ÑĮ Ð½ÑĥÑİ ĠÐ¿Ð¾Ð´ Ð¿Ð¸Ñģ ÑĮ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . key Ġ!= Ġ" sig ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Builder . append QueryParameter ( it . key , Ġit . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġuri Builder . build () ĊĊĠĠĠĠĠĠĠ Ġ// ĠÐĴ ĠÑģÐ» ÑĥÑĩ Ð° Ðµ , ĠÐµÑģÐ»Ð¸ ĠÐ¿Ð¾Ð´ Ð¿Ð¸Ñģ ÑĮ ĠÐ½Ðµ ĠÐ½ ÑĥÐ¶ Ð½Ð° , ĠÐ¿ÑĢ Ð¾ÑģÑĤ Ð¾ ĠÐ²Ð¾Ð· Ð²ÑĢÐ°Ñī Ð°ÐµÐ¼ ĠÐ¿ÑĢÐ°Ð² Ð¸Ð»ÑĮ Ð½Ð¾ ĠÐ·Ð° Ñį Ð½ Ðº Ð¾Ð¶ ÐµÐ½ Ð½ÑĭÐµ ĠÐ¿Ð°ÑĢÐ°Ð¼ÐµÑĤ ÑĢÑĭ ĊĠĠĠĠĠĠĠ Ġif Ġ( secret . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġuri . encoded Query Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠÐŁ Ð¾Ð´ Ð¿Ð¸Ñģ ÑĮ ĠÑģÑĤÑĢ Ð¾ Ð¸ÑĤ ÑģÑı ĠÐ¿Ð¾ ĠÑģÐ»ÐµÐ´ÑĥÑİ Ñī ÐµÐ¼ Ñĥ ĠÐ¿ÑĢ Ð¸Ð½ ÑĨÐ¸ Ð¿ Ñĥ : ĊĠĠĠĠĠĠĠ Ġ// ĠÐĳ ÐµÑĢ ÐµÑĤÑģÑı Ġpath Ġ(" / method / friends . get "), ĠÑĩ ÐµÑĢ ÐµÐ· Ġ? ĠÐ´Ð¾Ð±Ð°Ð² Ð»Ñı ÑİÑĤÑģÑı ĠÐ²ÑģÐµ ĠGET - Ð¿ Ð°ÑĢÐ°Ð¼ÐµÑĤ ÑĢÑĭ Ġ( Ð· Ð°Ð´ ÐµÐº Ð¾Ð¶ ÐµÐ½ Ð½ÑĭÐµ ! ), ĠÐ² ĠÐºÐ¾Ð½ ÑĨ Ðµ ĠÐ´Ð¾Ð±Ð°Ð² Ð»Ñı ÐµÑĤÑģÑı Ġsecret ĊĠĠĠĠĠĠĠ Ġ// ĠÐĺ Ð· ĠÐ¿Ð¾Ð»ÑĥÑĩ ÐµÐ½ Ð½Ð¾Ð¹ ĠÑģÑĤÑĢ Ð¾Ñĩ ÐºÐ¸ ĠÑģ Ñĩ Ð¸ÑĤ Ð°ÐµÑĤÑģÑı ĠMD 5 ĊĠĠĠĠĠĠĠ Ġ// ĠÐŁ ÑĢ Ð¸Ð¼ÐµÑĢ : ĊĠĠĠĠĠĠĠ Ġ// Ġpath : Ġ/ method / friends . get ĊĠĠĠĠĠĠĠ Ġ// ĠGET - Ð¿ Ð°ÑĢÐ°Ð¼ÐµÑĤ ÑĢÑĭ : Ġa Ġ-> Ġb , Ġc Ġ-> Ġd & f ĊĠĠĠĠĠĠĠ Ġ// Ġsecret : Ġsecret ĊĠĠĠĠĠĠĠ Ġ// ĠÐ¡ ÑĤÑĢ Ð¾Ñĩ ÐºÐ° ĠÐ´Ð»Ñı ĠÐ²Ñĭ Ñģ Ñĩ Ð¸ÑĤ ÑĭÐ² Ð°Ð½Ð¸Ñı ĠMD 5 : Ġ/ method / friends . get ? a = b & c = d & f secret ĊĠĠĠĠĠĠĠ Ġ// ĠMD 5 : Ġb ab ca 3 9 b 9 d 7 7 e 2 5 f 7 5 7 baf 5 0 4 baa 5 5 d 7 ĊĊĠĠĠĠĠĠĠ Ġval Ġdecoded Query Ġ= Ġuri . query ĊĊĠĠĠĠĠĠĠ Ġstr Builder . set Length ( 0 ) ĊĠĠĠĠĠĠĠ Ġstr Builder . append ( path ). append (' ?') ĊĠĠĠĠĠĠĠ Ġif Ġ(! decoded Query . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstr Builder . append ( decoded Query ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġstr Builder . append ( secret ) ĊĊĠĠĠĠĠĠĠ Ġval Ġquery To Sign Ġ= Ġstr Builder . toString () ĊĠĠĠĠĠĠĠ Ġval Ġsignature Ġ= ĠVK Utils . MD 5 . convert ( query To Sign ) ĊĊĠĠĠĠĠĠĠ Ġval Ġsigned Uri Ġ= Ġuri . build Up on () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. append QueryParameter (" sig ", Ġsignature ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsigned Uri . encoded Query Ġ?: Ġ"" ĊĠĠĠ Ġ} Ċ }