ZoneSettings.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. <?php
  2. namespace MGModule\DNSManager2\mgLibs\custom\helpers;
  3. use MGModule\DNSManager2\controllers\addon\admin\zones;
  4. use MGModule\DNSManager2\mgLibs\custom\manager\ClientHelper;
  5. use MGModule\DNSManager2\mgLibs\MySQL\result;
  6. use \MGModule\DNSManager2\models\custom\globalsetting;
  7. use MGModule\DNSManager2\models\custom\zone\ZoneTypeEnum;
  8. use MGModule\DNSManager2\models\whmcs\addon\addon;
  9. use MGModule\DNSManager2\models\whmcs\domains\domain;
  10. use MGModule\DNSManager2\models\whmcs\domains\repository;
  11. use MGModule\DNSManager2\models\whmcs\hostingaddon\hostingaddon;
  12. use MGModule\DNSManager2\models\whmcs\service\service;
  13. /**
  14. * Class Zone
  15. *
  16. * @author Artur Pilch <artur.pi@modulesgarden.com>
  17. */
  18. class ZoneSettings
  19. {
  20. CONST ALLOW_ONLY_DOMAINS_FROM_DOMAINS_ITEMS = 'allowOnlyDomainsFromDomainItems';
  21. CONST ALLOW_ONLY_DOMAINS_FROM_PRODUCT_ITEMS = 'allowOnlyDomainFromProductItems';
  22. CONST ALLOW_ONLY_DOMAINS_FROM_DOMAINS_AND_PRODUCT_ITEMS = 'allowOnlyDomainsFromDomainAndProductItems';
  23. CONST ALLOW_CUSTOM_DOMAINS = 'allowCustomDomain';
  24. CONST ALLOW_ONLY_THAT_DOMAIN = 'allowOnlyThatDomain';
  25. CONST ALLOW_ONLY_THAT_PRODUCT_DOMAIN = 'allowOnlyThatProductDomain';
  26. private static $usedZones = [];
  27. /**
  28. * Sponsored Custom Zones Options
  29. */
  30. public static function getSettingsForZonesCreate()
  31. {
  32. $basics = [
  33. SELF::ALLOW_ONLY_DOMAINS_FROM_DOMAINS_ITEMS,
  34. SELF::ALLOW_ONLY_DOMAINS_FROM_PRODUCT_ITEMS,
  35. SELF::ALLOW_ONLY_DOMAINS_FROM_DOMAINS_AND_PRODUCT_ITEMS,
  36. SELF::ALLOW_CUSTOM_DOMAINS,
  37. ];
  38. $vars[globalsetting\GlobalSettingEnum::DOMAIN_ITEM_OPTION] = [
  39. SELF::ALLOW_ONLY_THAT_DOMAIN,
  40. ];
  41. $vars[globalsetting\GlobalSettingEnum::PRODUCT_ITEM_OPTION] = [
  42. SELF::ALLOW_ONLY_THAT_PRODUCT_DOMAIN,
  43. ];
  44. $vars[globalsetting\GlobalSettingEnum::ADDON_ITEM_OPTION] = [
  45. SELF::ALLOW_ONLY_THAT_PRODUCT_DOMAIN,
  46. ];
  47. $vars[globalsetting\GlobalSettingEnum::OTHER_ITEM_OPTION] = [];
  48. foreach ($vars as &$item)
  49. {
  50. $item = array_merge($item, $basics);
  51. }
  52. return $vars;
  53. }
  54. public static function getZoneItemSettingForType($type)
  55. {
  56. switch ($type)
  57. {
  58. case ZoneTypeEnum::OTHER:
  59. return self::getSettingFromQuery(globalsetting\GlobalSettingEnum::OTHER_ITEM_OPTION);
  60. case ZoneTypeEnum::DOMAIN:
  61. return self::getSettingFromQuery(globalsetting\GlobalSettingEnum::DOMAIN_ITEM_OPTION);
  62. case ZoneTypeEnum::HOSTING:
  63. return self::getSettingFromQuery(globalsetting\GlobalSettingEnum::PRODUCT_ITEM_OPTION);
  64. case ZoneTypeEnum::ADDON:
  65. return self::getSettingFromQuery(globalsetting\GlobalSettingEnum::ADDON_ITEM_OPTION);
  66. }
  67. }
  68. public static function getProperlyItems($clientid, $relId, $relType)
  69. {
  70. $setting = self::getZoneItemSettingForType($relType)->value;
  71. switch ($setting)
  72. {
  73. case self::ALLOW_CUSTOM_DOMAINS:
  74. return self::ALLOW_CUSTOM_DOMAINS;
  75. case self::ALLOW_ONLY_THAT_DOMAIN:
  76. case self::ALLOW_ONLY_THAT_PRODUCT_DOMAIN:
  77. $domain = self::getOneDomain($relId, $relType)->domain;
  78. $domain = !in_array($domain, self::getUsedZones()) ? $domain : '';
  79. return [$domain];
  80. case self::ALLOW_ONLY_DOMAINS_FROM_DOMAINS_AND_PRODUCT_ITEMS:
  81. $records = array_merge(self::getAllDomainsFromDomainsRecords($clientid), self::getAllDomainsFromHostingRecords($clientid));
  82. asort($records);
  83. return $records;
  84. case self::ALLOW_ONLY_DOMAINS_FROM_DOMAINS_ITEMS:
  85. return self::getAllDomainsFromDomainsRecords($clientid);
  86. case self::ALLOW_ONLY_DOMAINS_FROM_PRODUCT_ITEMS;
  87. return self::getAllDomainsFromHostingRecords($clientid);
  88. }
  89. return false;
  90. }
  91. public static function getOneDomain($relId, $relType)
  92. {
  93. switch ($relType)
  94. {
  95. case ZoneTypeEnum::DOMAIN:
  96. return domain::factory($relId);
  97. case ZoneTypeEnum::HOSTING:
  98. return service::factory($relId);
  99. case ZoneTypeEnum::ADDON:
  100. return hostingaddon::factory($relId)->getHostingModel();
  101. }
  102. return false;
  103. }
  104. public static function getSettingFromQuery($key)
  105. {
  106. return globalsetting\Repository::factory()->byKey($key)->one();
  107. }
  108. public static function isDomainClient($zoneName, $type, $relid, $clientId)
  109. {
  110. $setting = self::getZoneItemSettingForType($type)->value;
  111. switch ($setting)
  112. {
  113. case self::ALLOW_CUSTOM_DOMAINS:
  114. return true;
  115. case self::ALLOW_ONLY_THAT_DOMAIN:
  116. case self::ALLOW_ONLY_THAT_PRODUCT_DOMAIN:
  117. $model = self::getOneDomain($relid, $type);
  118. return $model->domain == $zoneName && $model->userid == $clientId;
  119. case self::ALLOW_ONLY_DOMAINS_FROM_DOMAINS_AND_PRODUCT_ITEMS:
  120. $domains = array_merge(self::getAllDomainsFromDomainsRecords($clientId), self::getAllDomainsFromHostingRecords($clientId));
  121. return in_array($zoneName, $domains);
  122. case self::ALLOW_ONLY_DOMAINS_FROM_DOMAINS_ITEMS:
  123. return in_array($zoneName, self::getAllDomainsFromDomainsRecords($clientId));
  124. case self::ALLOW_ONLY_DOMAINS_FROM_PRODUCT_ITEMS;
  125. return in_array($zoneName, self::getAllDomainsFromHostingRecords($clientId));
  126. }
  127. return false;
  128. }
  129. public static function getAllDomainsFromHostingRecords($clientid)
  130. {
  131. $services = \MGModule\DNSManager2\models\whmcs\service\repository::factory()->byClientID($clientid)->get();
  132. $out = [];
  133. foreach ($services as $serviceModel)
  134. {
  135. $domain = $serviceModel->domain;
  136. if(!self::canAddZone($domain, $out))
  137. {
  138. continue;
  139. }
  140. array_push($out, $domain);
  141. }
  142. asort($out);
  143. return $out;
  144. }
  145. public static function getAllDomainsFromDomainsRecords($clientid)
  146. {
  147. $domains = repository::factory()->byClientID($clientid)->get();
  148. $out = [];
  149. foreach ($domains as $domainModel)
  150. {
  151. $domain = $domainModel->domain;
  152. if(!self::canAddZone($domain, $out))
  153. {
  154. continue;
  155. }
  156. array_push($out, $domain);
  157. }
  158. asort($out);
  159. return $out;
  160. }
  161. private static function canAddZone($domain, $domains)
  162. {
  163. if(!$domain || trim($domain) == '')
  164. {
  165. return false;
  166. }
  167. if(self::isExcludeUsedZones() && in_array($domain, self::getUsedZones()))
  168. {
  169. return false;
  170. }
  171. if(in_array($domain, $domains))
  172. {
  173. return false;
  174. }
  175. if(self::isSubdomain($domain))
  176. {
  177. return false;
  178. }
  179. return true;
  180. }
  181. private static function isSubdomain($domain)
  182. {
  183. $helper = new DomainHelper($domain);
  184. return $helper->isSubdamain();
  185. }
  186. public static function getUsedZones()
  187. {
  188. if(!empty(self::$usedZones))
  189. {
  190. return self::$usedZones;
  191. }
  192. $zones = \MGModule\DNSManager2\models\custom\zone\Repository::factory()->get();
  193. foreach ($zones as $zone)
  194. {
  195. array_push(self::$usedZones, $zone->name);
  196. }
  197. return self::$usedZones;
  198. }
  199. private function isExcludeUsedZones()
  200. {
  201. return globalsetting\GlobalSetting::byKey(globalsetting\GlobalSettingEnum::EXCLUDE_USED_ZONE_FROM_OPTIONS)->value == 'on';
  202. }
  203. }