ClientHelper.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. <?php
  2. namespace MGModule\DNSManager2\mgLibs\custom\manager;
  3. use \MGModule\DNSManager2\mgLibs\lang;
  4. use \MGModule\DNSManager2\mgLibs\MySQL\query;
  5. use MGModule\DNSManager2\models\custom\globalsetting\GlobalSetting;
  6. use \MGModule\DNSManager2\models\custom\package;
  7. use \MGModule\DNSManager2\models\custom\package\setting\PackageSettingEnum;
  8. use \MGModule\DNSManager2\models\custom\zone;
  9. use \MGModule\DNSManager2\models\custom\zone\ZoneTypeEnum;
  10. use \MGModule\DNSManager2\models\custom\package\item\PackageItemTypeEnum;
  11. use \MGModule\DNSManager2\models\whmcs\service;
  12. use \MGModule\DNSManager2\models\whmcs\clients;
  13. class ClientHelper {
  14. private $clientid;
  15. public function __construct($clientid) {
  16. $this->clientid = $clientid;
  17. }
  18. public function canUserCreatesNewZonesIn($type, $relid)
  19. {
  20. $zone = new zone\Zone();
  21. $zone->type = $type;
  22. $zone->relid = $relid;
  23. $zone->clientid = $this->clientid;
  24. $item = $zone->getRelatedItem();
  25. if($item->packageItemType() === PackageItemTypeEnum::ADDON)
  26. {
  27. $hostingClient = $item->__call('client', array());
  28. $tempClientId = $hostingClient->id;
  29. }
  30. else
  31. {
  32. $tempClientId = $item->clientID();
  33. }
  34. if($tempClientId != $this->clientid)
  35. {
  36. return false;
  37. }
  38. if(!in_array($item->status(), array('ACTIVE','PENDING TRANSFER','PENDING REGISTRATION')))
  39. return false;
  40. $package = $zone->getPackage();
  41. if($package === false)
  42. return false;
  43. $count = zone\Repository::factory()->byClientID($this->clientid)->byType($type)->byRelID($relid)->count();
  44. return $package->getSettings(package\setting\PackageSettingEnum::OWN_ZONES_PER_ITEM)->value > $count;
  45. }
  46. public function isZoneOwnedByClient($zone) {
  47. return $zone->clientid == $this->clientid;
  48. }
  49. public function getIPsForService($serviceid) {
  50. return service\service::factory($serviceid)->getIPs();
  51. }
  52. public function getClientIPs() {
  53. return service\repository::factory()->byDomainStatus('Active')->byClientID($this->clientid)->getIPs();
  54. }
  55. public function getClientDomains() {
  56. $out = array();
  57. $res = query::query('SELECT domain FROM tblhosting WHERE userid = :userid AND domainstatus = "Active"', array('userid' => $this->clientid));
  58. while($domain = $res->fetchColumn()) {
  59. $out[] = $domain;
  60. }
  61. $res = query::query('SELECT domain FROM tbldomains WHERE userid = :userid AND status = "Active"', array('userid' => $this->clientid));
  62. while($domain = $res->fetchColumn()) {
  63. $out[] = $domain;
  64. }
  65. return array_unique(array_filter($out));
  66. }
  67. public function getGroups() {
  68. $hostings = query::query("SELECT CONCAT('#', tblhosting.id, ' ', tblproductgroups.name, ' - ', tblproducts.name) AS group_name,
  69. tblhosting.id AS product_id, tblproductgroups.name AS product_group_name, tblproducts.name AS product_name,
  70. zones.value AS zones_available,ips.value AS ips_available, blacklist.value AS blacklist,
  71. :type `type`, tblhosting.id AS relid,
  72. dns_manager2_zone.id AS zone_id, dns_manager2_zone.name AS zone_name, dns_manager2_zone.status AS zone_status,
  73. dns_manager2_zone.is_locked as locked,
  74. tblhosting.domain AS domain
  75. FROM tblhosting
  76. INNER JOIN tblproducts ON tblproducts.id = tblhosting.packageid
  77. INNER JOIN tblproductgroups ON tblproductgroups.id = tblproducts.gid
  78. INNER JOIN dns_manager2_packageitem ON dns_manager2_packageitem.relid = tblproducts.id
  79. AND dns_manager2_packageitem.type = :type2
  80. INNER JOIN dns_manager2_packagesetting AS zones ON zones.packageid = dns_manager2_packageitem.packageid
  81. AND zones.key = :setting
  82. LEFT JOIN dns_manager2_packagesetting AS ips ON ips.packageid = dns_manager2_packageitem.packageid
  83. AND ips.key = :setting2
  84. LEFT JOIN dns_manager2_packagesetting AS blacklist ON blacklist.packageid = dns_manager2_packageitem.packageid
  85. AND blacklist.key = :setting3
  86. LEFT JOIN dns_manager2_zone ON dns_manager2_zone.type = :type3
  87. AND dns_manager2_zone.relid = tblhosting.id AND dns_manager2_zone.clientid = :clientid
  88. WHERE tblhosting.domainstatus IN ('Active')
  89. AND tblhosting.userid = :clientid2 ", array(
  90. 'type' => ZoneTypeEnum::HOSTING,
  91. 'type2' => ZoneTypeEnum::HOSTING,
  92. 'type3' => ZoneTypeEnum::HOSTING,
  93. 'clientid' => $this->clientid,
  94. 'clientid2' => $this->clientid,
  95. 'setting' => PackageSettingEnum::OWN_ZONES_PER_ITEM,
  96. 'setting2' => PackageSettingEnum::ALLOWED_IPS,
  97. 'setting3' => PackageSettingEnum::IP_BLACKLIST,
  98. ))->fetchAll();
  99. if(GlobalSetting::byKey('prevent_zone_delete_after_terminate') == 'on'){
  100. $zonesForTerminatedProducts = query::query("SELECT CONCAT('#', tblhosting.id, ' ', tblproductgroups.name, ' - ', tblproducts.name) AS group_name,
  101. tblhosting.id AS product_id, tblproductgroups.name AS product_group_name, tblproducts.name AS product_name,
  102. zones.value AS zones_available,ips.value AS ips_available, blacklist.value AS blacklist,
  103. :type `type`, tblhosting.id AS relid,
  104. dns_manager2_zone.id AS zone_id, dns_manager2_zone.name AS zone_name, dns_manager2_zone.status AS zone_status,
  105. dns_manager2_zone.is_locked as locked,
  106. tblhosting.domain AS domain
  107. FROM tblhosting
  108. INNER JOIN tblproducts ON tblproducts.id = tblhosting.packageid
  109. INNER JOIN tblproductgroups ON tblproductgroups.id = tblproducts.gid
  110. INNER JOIN dns_manager2_packageitem ON dns_manager2_packageitem.relid = tblproducts.id
  111. AND dns_manager2_packageitem.type = :type2
  112. INNER JOIN dns_manager2_packagesetting AS zones ON zones.packageid = dns_manager2_packageitem.packageid
  113. AND zones.key = :setting
  114. LEFT JOIN dns_manager2_packagesetting AS ips ON ips.packageid = dns_manager2_packageitem.packageid
  115. AND ips.key = :setting2
  116. LEFT JOIN dns_manager2_packagesetting AS blacklist ON blacklist.packageid = dns_manager2_packageitem.packageid
  117. AND blacklist.key = :setting3
  118. LEFT JOIN dns_manager2_zone ON dns_manager2_zone.type = :type3
  119. AND dns_manager2_zone.relid = tblhosting.id AND dns_manager2_zone.clientid = :clientid
  120. WHERE tblhosting.domainstatus IN ('Suspended', 'Terminated')
  121. AND tblhosting.userid = :clientid2 AND dns_manager2_zone.relid = tblhosting.id", [
  122. 'type' => ZoneTypeEnum::HOSTING,
  123. 'type2' => ZoneTypeEnum::HOSTING,
  124. 'type3' => ZoneTypeEnum::HOSTING,
  125. 'clientid' => $this->clientid,
  126. 'clientid2' => $this->clientid,
  127. 'setting' => PackageSettingEnum::OWN_ZONES_PER_ITEM,
  128. 'setting2' => PackageSettingEnum::ALLOWED_IPS,
  129. 'setting3' => PackageSettingEnum::IP_BLACKLIST,
  130. ])->fetchAll();
  131. $hostings = array_merge($hostings, $zonesForTerminatedProducts);
  132. }
  133. $domains = query::query("SELECT CONCAT('#', tbldomains.id, ' ', tbldomains.domain) AS group_name,
  134. tbldomains.id AS product_id, '' AS product_group_name, tbldomains.domain AS product_name,
  135. zones.value AS zones_available, ips.value AS allowed_ips, blacklist.value AS blacklist,
  136. :type `type`, tbldomains.id AS relid,
  137. dns_manager2_zone.id AS zone_id, dns_manager2_zone.name AS zone_name, dns_manager2_zone.status AS zone_status,
  138. dns_manager2_zone.is_locked as locked,
  139. tbldomains.domain AS domain
  140. FROM tbldomains
  141. INNER JOIN dns_manager2_packageitem ON dns_manager2_packageitem.relid = (SELECT tbldomainpricing.id FROM tbldomainpricing WHERE tbldomainpricing.extension = SUBSTRING(tbldomains.domain, LOCATE('.', tbldomains.domain)) LIMIT 1)
  142. AND dns_manager2_packageitem.type = :type2
  143. INNER JOIN dns_manager2_packagesetting AS zones ON zones.packageid = dns_manager2_packageitem.packageid
  144. AND zones.key = :setting
  145. LEFT JOIN dns_manager2_packagesetting AS ips ON ips.packageid = dns_manager2_packageitem.packageid
  146. AND ips.key = :setting2
  147. LEFT JOIN dns_manager2_packagesetting AS blacklist ON blacklist.packageid = dns_manager2_packageitem.packageid
  148. AND blacklist.key = :setting3
  149. LEFT JOIN dns_manager2_zone ON dns_manager2_zone.type = :type3
  150. AND dns_manager2_zone.relid = tbldomains.id AND dns_manager2_zone.clientid = :clientid
  151. WHERE tbldomains.status IN ('Active','Pending Transfer','Pending Registration')
  152. AND tbldomains.userid = :clientid2 ", array(
  153. 'type' => ZoneTypeEnum::DOMAIN,
  154. 'type2' => ZoneTypeEnum::DOMAIN,
  155. 'type3' => ZoneTypeEnum::DOMAIN,
  156. 'clientid' => $this->clientid,
  157. 'clientid2' => $this->clientid,
  158. 'setting' => PackageSettingEnum::OWN_ZONES_PER_ITEM,
  159. 'setting2' => PackageSettingEnum::ALLOWED_IPS,
  160. 'setting3' => PackageSettingEnum::IP_BLACKLIST,
  161. ))->fetchAll();
  162. //INNER JOIN dns_manager2_packageitem ON dns_manager2_packageitem.relid = SUBSTRING(tbldomains.domain, LOCATE('.', tbldomains.domain))
  163. $addons = query::query("SELECT CONCAT('#', tblhostingaddons.id, ' ', tbladdons.name) AS group_name, zones.value AS zones_available,ips.value AS ips_available,
  164. blacklist.value AS blacklist, tblhostingaddons.id AS product_id, '' AS product_group_name, tbladdons.name AS product_name,
  165. :type `type`, tblhostingaddons.id AS relid,
  166. dns_manager2_zone.id AS zone_id, dns_manager2_zone.name AS zone_name, dns_manager2_zone.status AS zone_status,
  167. dns_manager2_zone.is_locked as locked,
  168. tblhosting.domain AS domain
  169. FROM tblhostingaddons
  170. INNER JOIN tbladdons ON tbladdons.id = tblhostingaddons.addonid
  171. INNER JOIN tblhosting ON tblhosting.id = tblhostingaddons.hostingid
  172. INNER JOIN dns_manager2_packageitem ON dns_manager2_packageitem.relid = tbladdons.id
  173. AND dns_manager2_packageitem.type = :type2
  174. INNER JOIN dns_manager2_packagesetting AS zones ON zones.packageid = dns_manager2_packageitem.packageid
  175. AND zones.key = :setting
  176. LEFT JOIN dns_manager2_packagesetting AS ips ON ips.packageid = dns_manager2_packageitem.packageid
  177. AND ips.key = :setting2
  178. LEFT JOIN dns_manager2_packagesetting AS blacklist ON blacklist.packageid = dns_manager2_packageitem.packageid
  179. AND blacklist.key = :setting3
  180. LEFT JOIN dns_manager2_zone ON dns_manager2_zone.type = :type3
  181. AND dns_manager2_zone.relid = tblhostingaddons.id AND dns_manager2_zone.clientid = :clientid
  182. WHERE tblhostingaddons.status IN ('Active')
  183. AND tblhosting.userid = :clientid2 ", array(
  184. 'type' => ZoneTypeEnum::ADDON,
  185. 'type2' => ZoneTypeEnum::ADDON,
  186. 'type3' => ZoneTypeEnum::ADDON,
  187. 'clientid' => $this->clientid,
  188. 'clientid2' => $this->clientid,
  189. 'setting' => PackageSettingEnum::OWN_ZONES_PER_ITEM,
  190. 'setting2' => PackageSettingEnum::ALLOWED_IPS,
  191. 'setting3' => PackageSettingEnum::IP_BLACKLIST,
  192. ))->fetchAll();
  193. $other = query::query("SELECT :othergroupname AS group_name, zones.value AS zones_available, ips.value AS ips_available, blacklist.value AS blacklist,
  194. 0 `type`, 0 AS relid,
  195. dns_manager2_zone.id AS zone_id, dns_manager2_zone.name AS zone_name, dns_manager2_zone.status AS zone_status,
  196. dns_manager2_zone.is_locked as locked,
  197. '' AS domain
  198. FROM dns_manager2_packageitem
  199. INNER JOIN dns_manager2_packagesetting AS zones ON zones.packageid = dns_manager2_packageitem.packageid
  200. AND zones.key = :setting
  201. LEFT JOIN dns_manager2_packagesetting AS ips ON ips.packageid = dns_manager2_packageitem.packageid
  202. AND ips.key = :setting2
  203. LEFT JOIN dns_manager2_packagesetting AS blacklist ON blacklist.packageid = dns_manager2_packageitem.packageid
  204. AND blacklist.key = :setting3
  205. LEFT JOIN dns_manager2_zone ON dns_manager2_zone.type = :type
  206. AND dns_manager2_zone.relid = 0 AND dns_manager2_zone.clientid = :clientid
  207. WHERE dns_manager2_packageitem.relid = 0
  208. AND dns_manager2_packageitem.type = 0",
  209. array(
  210. 'othergroupname'=>lang::absoluteT('otherGroupName'),
  211. 'type' => ZoneTypeEnum::OTHER,
  212. 'clientid' => $this->clientid,
  213. 'setting' => PackageSettingEnum::OWN_ZONES_PER_ITEM,
  214. 'setting2' => PackageSettingEnum::ALLOWED_IPS,
  215. 'setting3' => PackageSettingEnum::IP_BLACKLIST,
  216. ))->fetchAll();
  217. $groups = array(); //TODO: zrobić coś z tymi query i foreachmi; brzydkie!!!
  218. foreach($hostings as $hosting)
  219. $groups[lang::T('service') . ' ' . $hosting['group_name'] . (empty($hosting['domain'])?'':" ({$hosting['domain']})")][] = $hosting;
  220. foreach($domains as $domain)
  221. $groups[lang::T('domain') . ' ' . $domain['group_name'] . (empty($domain['domain'])?'':" ({$domain['domain']})")][] = $domain;
  222. foreach($addons as $addon)
  223. $groups[lang::T('addon') . ' ' . $addon['group_name'] . (empty($addon['domain'])?'':" ({$addon['domain']})")][] = $addon;
  224. foreach($other as $item)
  225. $groups[$item['group_name']][] = $item;
  226. return $groups;
  227. }
  228. public function getPackageAllowedIps($relid,$type){
  229. switch ( $type )
  230. {
  231. case 0:
  232. $type = 'dns_manager2_packageitem';
  233. break;
  234. case 1:
  235. $type = 'tbldomains';
  236. break;
  237. case 2:
  238. $type = 'tblhosting';
  239. break;
  240. case 3:
  241. $type = 'tblhostingaddons';
  242. break;
  243. default :
  244. $type = false;
  245. break;
  246. }
  247. if ( $type )
  248. {
  249. $sql = "SELECT ips.value AS allowed_ips
  250. FROM $type
  251. INNER JOIN dns_manager2_packagesetting AS ips ON ips.packageid = ips.packageid AND ips.key = 'allowed_ips'
  252. WHERE $type.id = :relid;";
  253. $result = query::query($sql, ['relid' => $relid])->fetch();
  254. }
  255. else
  256. {
  257. $result = false;
  258. }
  259. return $result;
  260. }
  261. public function getPackageIpBlacklist($relid,$type){
  262. switch ( $type )
  263. {
  264. case 0:
  265. $type = 'dns_manager2_packageitem';
  266. break;
  267. case 1:
  268. $type = 'tbldomains';
  269. break;
  270. case 2:
  271. $type = 'tblhosting';
  272. break;
  273. case 3:
  274. $type = 'tblhostingaddons';
  275. break;
  276. default :
  277. $type = false;
  278. break;
  279. }
  280. if ( $type )
  281. {
  282. $sql = "SELECT ips.value AS ip_blacklist
  283. FROM $type
  284. INNER JOIN dns_manager2_packagesetting AS ips ON ips.packageid = ips.packageid AND ips.key = 'ip_blacklist'
  285. WHERE $type.id = :relid;";
  286. $result = query::query($sql, ['relid' => $relid])->fetch();
  287. }
  288. else
  289. {
  290. $result = false;
  291. }
  292. return $result;
  293. }
  294. public static function getAllClients()
  295. {
  296. $query = query::query("SELECT id,firstname,lastname FROM tblclients")->fetchAll();
  297. $clients = array();
  298. foreach($query as $q)
  299. {
  300. $clients[] = [
  301. 'id' => $q['id'],
  302. 'name' => $q['firstname'] . ' ' . $q['lastname']
  303. ];
  304. }
  305. return $clients;
  306. }
  307. public static function getZones($clientId)
  308. {
  309. return query::query("SELECT * FROM dns_manager2_zone WHERE clientid = {$clientId}")->fetchAll();
  310. }
  311. public static function getServerStatusByZoneId($zoneId)
  312. {
  313. return query::query("SELECT dns_manager2_server.status FROM dns_manager2_server
  314. INNER JOIN dns_manager2_zone ON dns_manager2_server.id = dns_manager2_zone.serverid
  315. WHERE dns_manager2_zone.id = ?" , [$zoneId]
  316. )->fetch();
  317. }
  318. public static function getClientLink($clientId)
  319. {
  320. $clientRecord = clients\client::factory($clientId);
  321. return $clientRecord->getProfileLink();
  322. }
  323. }