EditAccountDataProvider.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. <?php
  2. namespace ModulesGarden\Servers\ZimbraEmail\App\UI\Client\EmailAccount\Providers;
  3. use ModulesGarden\Servers\ZimbraEmail\App\Enums\Zimbra;
  4. use ModulesGarden\Servers\ZimbraEmail\App\Helpers\ZimbraManager;
  5. use ModulesGarden\Servers\ZimbraEmail\App\Libs\Product\ProductManager;
  6. use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\Account;
  7. use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Models\ClassOfService;
  8. use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Repository;
  9. use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Repository\ClassOfServices;
  10. use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Response;
  11. use ModulesGarden\Servers\ZimbraEmail\App\Libs\Zimbra\Components\Api\Soap\Services\Update\UpdateAccount;
  12. use ModulesGarden\Servers\ZimbraEmail\App\Services\ConfigurableOptions\Strategy\Types\ClassOfServicesOptions;
  13. use function ModulesGarden\Servers\ZimbraEmail\Core\Helper\di;
  14. use ModulesGarden\Servers\ZimbraEmail\Core\Models\Whmcs\Hosting;
  15. use ModulesGarden\Servers\ZimbraEmail\Core\UI\ResponseTemplates\HtmlDataJsonResponse;
  16. use ModulesGarden\Servers\ZimbraEmail\Core\UI\Widget\Forms\DataProviders\BaseDataProvider;
  17. /**
  18. *
  19. * Created by PhpStorm.
  20. * User: Tomasz Bielecki ( tomasz.bi@modulesgarden.com )
  21. * Date: 18.09.19
  22. * Time: 09:35
  23. * Class EditAccountDataProvider
  24. */
  25. class EditAccountDataProvider extends BaseDataProvider
  26. {
  27. /**
  28. *
  29. */
  30. public function read()
  31. {
  32. /**
  33. * hosting id
  34. */
  35. $hid = $this->getRequestValue('id');
  36. /**
  37. * load hosting
  38. */
  39. $hosting = Hosting::where('id', $hid)->first();
  40. /**
  41. * load api
  42. */
  43. $api = (new ZimbraManager())->getApiByServer($hosting->server);
  44. $repository = new Repository($api->soap);
  45. $result = $repository->accounts->getAccountOptionsById($this->actionElementId);
  46. if($result instanceof Response && $result->getLastError())
  47. {
  48. throw new \Exception($result->getLastError());
  49. }
  50. $mailBoxParams = explode('@', $result->getName());
  51. $this->data['id'] = $result->getId();
  52. $this->data['username'] = $mailBoxParams[0];
  53. $this->data['domain'] = $mailBoxParams[1];
  54. $this->data['firstname'] = $result->getDataResourceA(Account::ATTR_FIRSTNAME);
  55. $this->data['lastname'] = $result->getDataResourceA(Account::ATTR_LASTNAME);
  56. $this->data['display_name'] = $result->getDataResourceA(Account::ATTR_DISPLAY_NAME);
  57. $this->data['status'] = $result->getDataResourceA(Account::ATTR_ACCOUNT_STATUS);
  58. $this->data['company'] = $result->getDataResourceA(Account::ATTR_COMPANY);
  59. $this->data['title'] = $result->getDataResourceA(Account::ATTR_PROF_TITLE);
  60. $this->data['phone'] = $result->getDataResourceA(Account::ATTR_PHONE);
  61. $this->data['home_phone'] = $result->getDataResourceA(Account::ATTR_HOME_PHONE);
  62. $this->data['mobile_phone'] = $result->getDataResourceA(Account::ATTR_MOBILE_PHONE);
  63. $this->data['fax'] = $result->getDataResourceA(Account::ATTR_FAX);
  64. $this->data['pager'] = $result->getDataResourceA(Account::ATTR_PAGER);
  65. $this->data['country'] = $result->getDataResourceA(Account::ATTR_COUNTRY);
  66. $this->data['city'] = $result->getDataResourceA(Account::ATTR_CITY);
  67. $this->data['street'] = $result->getDataResourceA(Account::ATTR_STREET);
  68. $this->data['post_code'] = $result->getDataResourceA(Account::ATTR_POSTAL_CODE);
  69. $this->data['currentCosId'] = $result->getDataResourceA(Account::ATTR_CLASS_OF_SERVICE_ID);
  70. $this->data['cosId'] = $result->getDataResourceA(Account::ATTR_CLASS_OF_SERVICE_ID);
  71. $this->data['state'] = $result->getDataResourceA(Account::ATTR_STATE);
  72. $this->data['zimbraPrefMailForwardingAddress'] = $result->getDataResourceA(Account::ATTR_MAIL_FORWARD);
  73. if (empty($this->data['zimbraPrefMailForwardingAddress'])) {
  74. $this->data['forward'] = 'off';
  75. } else {
  76. $this->data['forward'] = 'on';
  77. }
  78. $lang = di('lang');
  79. $this->availableValues['status'] = [
  80. Zimbra::ACC_STATUS_ACTIVE => $lang->absoluteT('zimbra','account','status','active'),
  81. Zimbra::ACC_STATUS_LOCKED => $lang->absoluteT('zimbra','account','status','locked'),
  82. Zimbra::ACC_STATUS_MAINTENANCE => $lang->absoluteT('zimbra','account','status','maintenance'),
  83. Zimbra::ACC_STATUS_CLOSED => $lang->absoluteT('zimbra','account','status','closed'),
  84. Zimbra::ACC_STATUS_LOCKOUT => $lang->absoluteT('zimbra','account','status','lockout'),
  85. Zimbra::ACC_STATUS_PENDING => $lang->absoluteT('zimbra','account','status','pending')
  86. ];
  87. $this->readCosParams();
  88. }
  89. /**
  90. * @return HtmlDataJsonResponse
  91. */
  92. public function update()
  93. {
  94. /**
  95. * hosting id
  96. */
  97. $hid = $this->request->get('id');
  98. $fieldToProtection = ['firstname', 'lastname', 'display_name', 'company', 'title', 'country', 'state', 'city', 'street', 'post_code' ];
  99. foreach ($this->formData as $field => &$value)
  100. {
  101. $value = in_array($field, $fieldToProtection) ? htmlentities($value) : $value;
  102. }
  103. /**
  104. * product manager allow to check product settings
  105. */
  106. $productManager = new ProductManager();
  107. $productManager->loadByHostingId($hid);
  108. /**
  109. *
  110. * get soap create domain service
  111. */
  112. $service =(new ZimbraManager())
  113. ->getApiByHosting($hid)
  114. ->soap
  115. ->service()
  116. ->updateAccount($productManager->get('cos_name'));
  117. /**
  118. *
  119. * set product manager & form data to service
  120. */
  121. $service
  122. ->setProductManager($productManager)
  123. ->setFormData($this->formData);
  124. logModuleCall(
  125. 'zimbraEmail',
  126. __FUNCTION__,
  127. $service,
  128. 'Debug Update',
  129. $this->formData
  130. );
  131. /**
  132. * run service
  133. */
  134. $result = $service->run();
  135. /**
  136. * return success or error response
  137. */
  138. if(!$result)
  139. {
  140. return (new HtmlDataJsonResponse())->setMessageAndTranslate($service->getError())->setStatusError();
  141. }
  142. return (new HtmlDataJsonResponse())->setMessageAndTranslate('emailAccountHasBeenUpdated')->setStatusSuccess();
  143. }
  144. /**
  145. * @return HtmlDataJsonResponse
  146. */
  147. public function updateStatus()
  148. {
  149. /**
  150. * hosting id
  151. */
  152. $hid = $this->request->get('id');
  153. /**
  154. * product manager allow to check product settings
  155. */
  156. $productManager = new ProductManager();
  157. $productManager->loadByHostingId($hid);
  158. /**
  159. *
  160. * get soap create domain service
  161. */
  162. $service =(new ZimbraManager())
  163. ->getApiByHosting($hid)
  164. ->soap
  165. ->service()
  166. ->updateAccountStatus()
  167. ->setProductManager($productManager)
  168. ;
  169. /**
  170. *
  171. * set product manager & form data to service
  172. */
  173. /**
  174. * run service for each id
  175. */
  176. $service->setFormData($this->formData);
  177. $result = $service->run();
  178. if(!$result)
  179. {
  180. return (new HtmlDataJsonResponse())->setMessageAndTranslate($service->getError())->setStatusError();
  181. }
  182. /**
  183. * return success
  184. */
  185. return (new HtmlDataJsonResponse())->setMessageAndTranslate('emailAccountStatusHasBeenUpdated')->setStatusSuccess();
  186. }
  187. /**
  188. * @return HtmlDataJsonResponse
  189. */
  190. public function changePassword()
  191. {
  192. /**
  193. * hosting id
  194. */
  195. $hid = $this->request->get('id');
  196. /**
  197. * product manager allow to check product settings
  198. */
  199. $productManager = new ProductManager();
  200. $productManager->loadByHostingId($hid);
  201. /**
  202. *
  203. * get soap create domain service
  204. */
  205. $service =(new ZimbraManager())
  206. ->getApiByHosting($hid)
  207. ->soap
  208. ->service()
  209. ->updateAccountPassword()
  210. ->setProductManager($productManager)
  211. ;
  212. /**
  213. *
  214. * set product manager & form data to service
  215. */
  216. /**
  217. * run service for each id
  218. */
  219. $service->setFormData($this->formData);
  220. $result = $service->run();
  221. if(!$result)
  222. {
  223. return (new HtmlDataJsonResponse())->setMessageAndTranslate($service->getError())->setStatusError();
  224. }
  225. return (new HtmlDataJsonResponse())->setMessageAndTranslate('passwordChangedSuccessfully')->setStatusSuccess();
  226. }
  227. /**
  228. *
  229. */
  230. public function readCosParams()
  231. {
  232. $hid = $this->getRequestValue('id');
  233. /**
  234. * product manager allow to check product settings
  235. */
  236. $productManager = new ProductManager();
  237. $productManager->loadByHostingId($hid);
  238. if($productManager->get('cos_name') === ClassOfServices::CLASS_OF_SERVICE_QUOTA)
  239. {
  240. /**
  241. *
  242. * get soap create domain service
  243. */
  244. $api =(new ZimbraManager())
  245. ->getApiByHosting($hid)
  246. ->soap;
  247. /**
  248. *
  249. * get cos from API
  250. */
  251. $classOfServices = $api->repository()->cos->all();
  252. /**
  253. *
  254. * load configurable options coses
  255. */
  256. $supportedCos = $productManager->getSettingCos();
  257. /**
  258. *
  259. * add COS to array
  260. */
  261. $configoptions = $this->getFilteredCosConfigurableOptions();
  262. foreach($classOfServices as $cos)
  263. {
  264. /**
  265. *
  266. *
  267. * skip COS which is not used in configurable options
  268. */
  269. if(!($supportedCos && array_key_exists($cos->getId(), $supportedCos)))
  270. {
  271. continue;
  272. }
  273. /**
  274. *
  275. * skip if class of services doesnt exists in config option list
  276. */
  277. if($configoptions && !array_key_exists('cosQuota_'.$cos->getId(), $configoptions))
  278. {
  279. continue;
  280. }
  281. /**
  282. * skip not purchased as CO
  283. */
  284. if ($configoptions && $configoptions['cosQuota_'.$cos->getId()] == 0)
  285. {
  286. continue;
  287. }
  288. /**
  289. * 1. check if config opts are not available
  290. * 2. skip if quantity === 0
  291. */
  292. if(!$configoptions && $supportedCos[$cos->getId()] == 0)
  293. {
  294. continue;
  295. }
  296. /* @var $cos ClassOfService*/
  297. $this->availableValues['cosId'][$cos->getId()] = $cos->getMbMailQuote().' MB';
  298. }
  299. }
  300. }
  301. /**
  302. * @return bool|mixed
  303. */
  304. protected function getFilteredCosConfigurableOptions()
  305. {
  306. $configoptions = $this->getWhmcsParamByKey('configoptions');
  307. foreach($configoptions as $key => $value)
  308. {
  309. if(strpos($key, ClassOfServicesOptions::COS_CONFIG_OPT_PREFIX) === false)
  310. {
  311. unset($configoptions[$key]);
  312. }
  313. }
  314. return $configoptions;
  315. }
  316. }