hooks.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. <?php
  2. use Illuminate\Database\Capsule\Manager as Capsule;
  3. add_hook('ClientAreaPage', 1, function ($vars) {
  4. global $whmcs;
  5. if (!class_exists('Net_EPP_Protocol')) {
  6. if (file_exists(__DIR__ . "/Net/EPP/Client.php"))
  7. require_once __DIR__ . "/Net/EPP/Client.php";
  8. }
  9. function getSwitchEPP_settinghook($id)
  10. {
  11. #select table domain data
  12. $domain_select_data = Capsule::table('tbldomains')->where('id', $id)->first();
  13. #select registrar data
  14. foreach (Capsule::table('tblregistrars')->where('registrar', $domain_select_data->registrar)->get() as $registrar_data) {
  15. $data[$registrar_data->setting] = decrypt($registrar_data->value);
  16. }
  17. return $data;
  18. }
  19. #*********************Create Epp Connection**************************#
  20. function switchepp_clientloginepp_hook($params)
  21. {
  22. try {
  23. $certFile = __DIR__ . '/cert/cert.pem';
  24. $client = new Net_EPP_Client();
  25. $use_ssl = true;
  26. if (file_exists($certFile)) {
  27. $context = stream_context_create();
  28. stream_context_set_option($context, 'ssl', 'verify_peer', false);
  29. stream_context_set_option($context, 'ssl', 'allow_self_signed', true);
  30. stream_context_set_option($context, 'ssl', 'local_cert', $certFile);
  31. stream_context_set_option($context, 'ssl', 'passphrase', $params['passphrase']);
  32. $client->connect($params['eppurl'], $params['eppport'], 300, $use_ssl, $context) or die("Not connected with epp server");
  33. } else {
  34. $context = false;
  35. $client->connect($params['eppurl'], $params['eppport'], 300, $use_ssl, $context) or die("Not connected with epp server");
  36. }
  37. } catch (Exception $e) {
  38. $port = $params['eppport'];
  39. throw new exception("Connection Error: " . $e->getMessage());
  40. }
  41. return $client;
  42. }
  43. #*********************Epp client login**************************#
  44. function switchepp_loggedinepp_hook($client, $params)
  45. {
  46. $xml = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  47. <epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
  48. <command>
  49. <login>
  50. <clID>' . $params['registrar_id'] . '</clID>
  51. <pw>' . $params['registrar_password'] . '</pw>
  52. <options>
  53. <version>1.0</version>
  54. <lang>en</lang>
  55. </options>
  56. <svcs>
  57. <objURI>urn:ietf:params:xml:ns:domain-1.0</objURI>
  58. <objURI>urn:ietf:params:xml:ns:contact-1.0</objURI>
  59. <objURI>urn:ietf:params:xml:ns:host-1.0</objURI>
  60. <svcExtension>
  61. <extURI>urn:ietf:params:xml:ns:secDNS-1.1</extURI>
  62. <extURI>urn:ietf:params:xml:ns:rgp-1.0</extURI>
  63. <extURI>urn:ietf:params:xml:ns:changePoll-1.0</extURI>
  64. <extURI>https://www.nic.ch/epp/balance-1.0</extURI>
  65. <extURI>urn:ietf:params:xml:ns:epp:unhandled-namespaces-1.0</extURI>
  66. </svcExtension>
  67. </svcs>
  68. </login>
  69. <clTRID>' . rand(9999999, 100000) . '</clTRID>
  70. </command>
  71. </epp>';
  72. $response = $client->request($xml);
  73. logModuleCall('SWITCH EPP', 'login', $xml, $response);
  74. $result = new SimpleXMLElement($response);
  75. if ($result->response->result->attributes()->code >= 2000) {
  76. throw new exception($result->response->result->msg . '. ' . $result->response->result->extValue->reason);
  77. }
  78. return $result;
  79. }
  80. function switchepp_write_xml_hook($client, $xml, $action, $extra = NULL)
  81. {
  82. $response = $client->request($xml);
  83. if (empty($extra)) {
  84. logModuleCall('SWITCH EPP hook', 'domain update extension(DNSSEC)', $xml, $response);
  85. $result = new SimpleXMLElement($response);
  86. if ($result->response->result->attributes()->code >= 2000) {
  87. throw new exception($result->response->result->msg . '. ' . $result->response->result->extValue->reason);
  88. }
  89. return $result;
  90. }
  91. }
  92. function switchepp_logoutepp_hook($client, $params)
  93. {
  94. $xml = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  95. <epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
  96. <epp:command xmlns:epp="urn:ietf:params:xml:ns:epp-1.0">
  97. <epp:logout />
  98. <epp:clTRID>' . $params['registrar_id'] . '</epp:clTRID>
  99. </epp:command>
  100. </epp>';
  101. $response = $client->request($xml);
  102. logModuleCall('SWITCH EPP', 'logout', $xml, $response);
  103. }
  104. function switchepp_generateDigestRandomString_hook($length = 15)
  105. {
  106. $characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  107. $charactersLength = strlen($characters);
  108. $randomString = '';
  109. for ($i = 0; $i < $length; $i++) {
  110. $randomString .= $characters[rand(0, $charactersLength - 1)];
  111. }
  112. return $randomString;
  113. }
  114. if (isset($_POST['updatednsdata']) && isset($_POST['dnscheck']) && !empty($whmcs->get_req_var('id'))) {
  115. $params = [];
  116. $dnscheck = $whmcs->get_req_var('dnscheck');
  117. $domain_zoneid = $whmcs->get_req_var('id');
  118. $domaindata = Capsule::table('dns_manager2_zone')->where('id', $domain_zoneid)->first();
  119. $domainname = $domaindata->name;
  120. $domaindetail = Capsule::table('tbldomains')->where('domain', $domainname)->first();
  121. $settingArr = getSwitchEPP_settinghook($domaindetail->id);
  122. $params = array_merge($params, $settingArr);
  123. $client = switchepp_clientloginepp_hook($params); #Epp Connection
  124. $login = switchepp_loggedinepp_hook($client, $params);
  125. /*$digestType = $params['digest_type'];
  126. if (empty($digestType))
  127. $digestType = 1;
  128. if ($digestType == 1) {
  129. $string = switchepp_generateDigestRandomString_hook(40);
  130. $digest = strtoupper(bin2hex($string));
  131. $digest = substr($digest, 0, 40);
  132. } elseif ($digestType == 2) {
  133. $string = switchepp_generateDigestRandomString_hook(64);
  134. $digest = strtoupper(bin2hex($string));
  135. $digest = substr($digest, 0, 64);
  136. } elseif ($digestType == 3 || $digestType == 4) {
  137. $string = switchepp_generateDigestRandomString_hook(96);
  138. $digest = strtoupper(bin2hex($string));
  139. $digest = substr($digest, 0, 96);
  140. }*/
  141. //$params['algorithm'] = (!empty($params['algorithm'])) ? $params['algorithm'] : '5';
  142. //$params['algorithm'] = 13;
  143. $algorithm = $whmcs->get_req_var('algotype');
  144. $digestType = $whmcs->get_req_var('digesttype');
  145. $digest = $whmcs->get_req_var('digest');
  146. $keytag = $whmcs->get_req_var('keytag');
  147. if ($dnscheck == 'disableDnssec') {
  148. $dnssec = '<extension>
  149. <secDNS:update xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1">
  150. <secDNS:rem>
  151. <secDNS:all>true</secDNS:all>
  152. </secDNS:rem>
  153. </secDNS:update>
  154. </extension>';
  155. }
  156. if ($dnscheck == 'enableDnssec') {
  157. $dnssec = '<extension>
  158. <secDNS:update xmlns:secDNS="urn:ietf:params:xml:ns:secDNS-1.1">
  159. <secDNS:add>
  160. <secDNS:dsData>
  161. <secDNS:keyTag>' . $keytag . '</secDNS:keyTag>
  162. <secDNS:alg>' . $algorithm . '</secDNS:alg>
  163. <secDNS:digestType>' . $digestType . '</secDNS:digestType>
  164. <secDNS:digest>' . $digest . '</secDNS:digest>
  165. </secDNS:dsData>
  166. </secDNS:add>
  167. </secDNS:update>
  168. </extension>';
  169. }
  170. try {
  171. $xmlUpdate = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>
  172. <epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
  173. <command>
  174. <update>
  175. <domain:update xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
  176. <domain:name>' . $domainname . '</domain:name>
  177. </domain:update>
  178. </update>
  179. ' . $dnssec . '
  180. <clTRID>clientref-' . rand(1000, 9999) . '</clTRID>
  181. </command>
  182. </epp>';
  183. $update_domain = switchepp_write_xml_hook($client, $xmlUpdate, __FUNCTION__ . ' (Domain update)');
  184. } catch (Exception $ex) {
  185. $error = $ex->getMessage();
  186. }
  187. switchepp_logoutepp_hook($client, $params);
  188. }
  189. });
  190. function hook_changedns($vars)
  191. {
  192. global $whmcs;
  193. if ($whmcs->get_req_var('m') == 'DNSManager3' && $whmcs->get_req_var('mg-action') == 'dnssec' && !empty($whmcs->get_req_var('id'))) {
  194. $domaindata = Capsule::table('dns_manager2_zone')->where('id', $_GET['id'])->first();
  195. $domaindetail = Capsule::table('tbldomains')->where('domain', $domaindata->name)->first();
  196. $check = end(explode('.', $domaindata->name));
  197. if ($domaindetail->registrar == 'switchepp') {
  198. return <<<HTML
  199. <script type="text/javascript">
  200. jQuery(document).ready(function () {
  201. var checkdns = "";
  202. jQuery(".customNav").next('div').find('a').each(function(){
  203. if(jQuery(this).data("id") == "enableDNSSecButton"){
  204. if(jQuery(this).hasClass('lu-d-none'))
  205. checkdns = "disableDnssec";
  206. }else if(jQuery(this).data("id") == "disableDNSSecButton"){
  207. if(jQuery(this).hasClass('lu-d-none'))
  208. checkdns = "enableDnssec";
  209. }
  210. });
  211. dnsmanage(checkdns);
  212. });
  213. function dnsmanage(checkdns){
  214. var intervalcheck = setInterval(function(){
  215. if(jQuery(".toast-message").html()){
  216. jQuery("body").append("<input type='hidden' id='customdnssec' value='yes'>");
  217. cleartimedcheck();
  218. }
  219. });
  220. function cleartimedcheck(){
  221. clearInterval(intervalcheck);
  222. }
  223. var intervalId = setInterval(function(){
  224. var tbody = jQuery("#delegationSignerRecordsDataTable table tbody");
  225. console.log(tbody.children().length);
  226. console.log(jQuery("#customdnssec").val());
  227. console.log(checkdns);
  228. if (tbody.children().length != 0 && jQuery("#customdnssec").val() == "yes" && checkdns == "enableDnssec") {
  229. cleartime();
  230. var getkeytagtd = jQuery('#delegationSignerRecordsDataTable table tbody tr').eq(1).find('td').eq(0).text();
  231. var getsecondtd = jQuery('#delegationSignerRecordsDataTable table tbody tr').eq(1).find('td').eq(1).text();
  232. var getthirdtd = jQuery('#delegationSignerRecordsDataTable table tbody tr').eq(1).find('td').eq(2).text();
  233. var digest = jQuery('#delegationSignerRecordsDataTable table tbody tr').eq(1).find('td').eq(3).find('input').val();
  234. var algo = getsecondtd.split(" - ")[0];
  235. var digesttype = getthirdtd.split(" - ")[0];
  236. jQuery.ajax({
  237. "url": "",
  238. "type": "post",
  239. "data": "updatednsdata=true&dnscheck="+checkdns+"&algotype="+algo+"&digesttype="+digesttype+"&digest="+digest+"&keytag="+getkeytagtd,
  240. "success": function (response) {
  241. setTimeout(function(){
  242. jQuery(".customNav").next('div').find('a').each(function(){
  243. if(jQuery(this).data("id") == "enableDNSSecButton"){
  244. jQuery(this).attr('onClick','dnsmanage("enableDnssec")');
  245. }else if(jQuery(this).data("id") == "disableDNSSecButton"){
  246. jQuery(this).attr('onClick','dnsmanage("disableDnssec")');
  247. }
  248. });
  249. }, 3000);
  250. }
  251. });
  252. }else if(tbody.children().length == 0 && jQuery("#customdnssec").val() == "yes" && checkdns == "disableDnssec"){
  253. cleartime();
  254. jQuery.ajax({
  255. "url": "",
  256. "type": "post",
  257. "data": "updatednsdata=true&dnscheck="+checkdns,
  258. "success": function (response) {
  259. setTimeout(function(){
  260. jQuery(".customNav").next('div').find('a').each(function(){
  261. if(jQuery(this).data("id") == "enableDNSSecButton"){
  262. jQuery(this).attr('onClick','dnsmanage("enableDnssec")');
  263. }else if(jQuery(this).data("id") == "disableDNSSecButton"){
  264. jQuery(this).attr('onClick','dnsmanage("disableDnssec")');
  265. }
  266. });
  267. }, 3000);
  268. }
  269. });
  270. }
  271. }, 3000);
  272. function cleartime(){
  273. clearInterval(intervalId);
  274. jQuery("#customdnssec").remove();
  275. var checkdns = "";
  276. jQuery(".customNav").next('div').find('a').each(function(){
  277. if(jQuery(this).data("id") == "enableDNSSecButton"){
  278. if(jQuery(this).hasClass('lu-d-none'))
  279. checkdns = "disableDnssec";
  280. }else if(jQuery(this).data("id") == "disableDNSSecButton"){
  281. if(jQuery(this).hasClass('lu-d-none'))
  282. checkdns = "enableDnssec";
  283. }
  284. });
  285. dnsmanage(checkdns);
  286. }
  287. }
  288. </script>
  289. HTML;
  290. }
  291. }
  292. }
  293. add_hook('ClientAreaHeadOutput', 1, 'hook_changedns');