Mercurial > hg > rc1
comparison plugins/password/drivers/plesk.php @ 0:1e000243b222
vanilla 1.3.3 distro, I hope
author | Charlie Root |
---|---|
date | Thu, 04 Jan 2018 15:50:29 -0500 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:1e000243b222 |
---|---|
1 <?php | |
2 | |
3 /** | |
4 * Roundcube Password Driver for Plesk-RPC. | |
5 * | |
6 * This driver changes a E-Mail-Password via Plesk-RPC | |
7 * Deps: PHP-Curl, SimpleXML | |
8 * | |
9 * @author Cyrill von Wattenwyl <cyrill.vonwattenwyl@adfinis-sygroup.ch> | |
10 * @copyright Adfinis SyGroup AG, 2014 | |
11 * | |
12 * Config needed: | |
13 * $config['password_plesk_host'] = '10.0.0.5'; | |
14 * $config['password_plesk_user'] = 'admin'; | |
15 * $config['password_plesk_pass'] = 'pass'; | |
16 * $config['password_plesk_rpc_port'] = 8443; | |
17 * $config['password_plesk_rpc_path'] = enterprise/control/agent.php; | |
18 * | |
19 * This program is free software: you can redistribute it and/or modify | |
20 * it under the terms of the GNU General Public License as published by | |
21 * the Free Software Foundation, either version 3 of the License, or | |
22 * (at your option) any later version. | |
23 * | |
24 * This program is distributed in the hope that it will be useful, | |
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
27 * GNU General Public License for more details. | |
28 * | |
29 * You should have received a copy of the GNU General Public License | |
30 * along with this program. If not, see http://www.gnu.org/licenses/. | |
31 */ | |
32 | |
33 /** | |
34 * Roundcube Password Driver Class | |
35 * | |
36 * See {ROUNDCUBE_ROOT}/plugins/password/README for API description | |
37 * | |
38 * @author Cyrill von Wattenwyl <cyrill.vonwattenwyl@adfinis-sygroup.ch> | |
39 */ | |
40 class rcube_plesk_password | |
41 { | |
42 /** | |
43 * this method is called from roundcube to change the password | |
44 * | |
45 * roundcube allready validated the old password so we just need to change it at this point | |
46 * | |
47 * @author Cyrill von Wattenwyl <cyrill.vonwattenwyl@adfinis-sygroup.ch> | |
48 * @param string $curpass Current password | |
49 * @param string $newpass New password | |
50 * @returns int PASSWORD_SUCCESS|PASSWORD_ERROR | |
51 */ | |
52 function save($currpass, $newpass) | |
53 { | |
54 // get config | |
55 $rcmail = rcmail::get_instance(); | |
56 $host = $rcmail->config->get('password_plesk_host'); | |
57 $user = $rcmail->config->get('password_plesk_user'); | |
58 $pass = $rcmail->config->get('password_plesk_pass'); | |
59 $port = $rcmail->config->get('password_plesk_rpc_port'); | |
60 $path = $rcmail->config->get('password_plesk_rpc_path'); | |
61 | |
62 // create plesk-object | |
63 $plesk = new plesk_rpc; | |
64 $plesk->init($host, $port, $path, $user, $pass); | |
65 | |
66 // try to change password and return the status | |
67 $result = $plesk->change_mailbox_password($_SESSION['username'], $newpass); | |
68 //$plesk->destroy(); | |
69 | |
70 if ($result) { | |
71 return PASSWORD_SUCCESS; | |
72 } | |
73 | |
74 return PASSWORD_ERROR; | |
75 } | |
76 } | |
77 | |
78 | |
79 /** | |
80 * Plesk RPC-Class | |
81 * | |
82 * Striped down version of Plesk-RPC-Class | |
83 * Just functions for changing mail-passwords included | |
84 * | |
85 * Documentation of Plesk RPC-API: http://download1.parallels.com/Plesk/PP11/11.0/Doc/en-US/online/plesk-api-rpc/ | |
86 * | |
87 * @author Cyrill von Wattenwyl <cyrill.vonwattenwyl@adfinis-sygroup.ch> | |
88 */ | |
89 class plesk_rpc | |
90 { | |
91 /** | |
92 * init plesk-rpc via curl | |
93 * | |
94 * @param string $host plesk host | |
95 * @param string $port plesk rpc port | |
96 * @param string $path plesk rpc path | |
97 * @param string $user plesk user | |
98 * @param string $user plesk password | |
99 * @returns void | |
100 */ | |
101 function init($host, $port, $path, $user, $pass) | |
102 { | |
103 $headers = array( | |
104 sprintf("HTTP_AUTH_LOGIN: %s", $user), | |
105 sprintf("HTTP_AUTH_PASSWD: %s", $pass), | |
106 "Content-Type: text/xml" | |
107 ); | |
108 | |
109 $url = sprintf("https://%s:%s/%s", $host, $port, $path); | |
110 $this->curl = curl_init(); | |
111 | |
112 curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT , 5); | |
113 curl_setopt($this->curl, CURLOPT_SSL_VERIFYHOST , 0); | |
114 curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER , false); | |
115 curl_setopt($this->curl, CURLOPT_HTTPHEADER , $headers); | |
116 curl_setopt($this->curl, CURLOPT_URL , $url); | |
117 } | |
118 | |
119 /** | |
120 * send a request to the plesk | |
121 * | |
122 * @param string $packet XML-Packet to send to Plesk | |
123 * @returns bool request was successful or not | |
124 */ | |
125 function send_request($packet) | |
126 { | |
127 curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, true); | |
128 curl_setopt($this->curl, CURLOPT_POSTFIELDS, $packet); | |
129 $retval = curl_exec($this->curl); | |
130 | |
131 return $retval; | |
132 } | |
133 | |
134 /** | |
135 * close curl | |
136 */ | |
137 function destroy(){ | |
138 curl_close($this->curl); | |
139 } | |
140 | |
141 /** | |
142 * Creates an Initial SimpleXML-Object for Plesk-RPC | |
143 * | |
144 * @returns object SimpleXML object | |
145 */ | |
146 function get_request_obj() | |
147 { | |
148 $request = new SimpleXMLElement("<packet></packet>"); | |
149 $request->addAttribute("version", "1.6.3.0"); | |
150 | |
151 return $request; | |
152 } | |
153 | |
154 /** | |
155 * Get all hosting-information of a domain | |
156 * | |
157 * @param string $domain domain-name | |
158 * @returns object SimpleXML object | |
159 */ | |
160 function domain_info($domain) | |
161 { | |
162 // build xml | |
163 $request = $this->get_request_obj(); | |
164 $site = $request->addChild("site"); | |
165 $get = $site->addChild("get"); | |
166 $filter = $get->addChild("filter"); | |
167 | |
168 $filter->addChild("name", utf8_encode($domain)); | |
169 $dataset = $get->addChild("dataset"); | |
170 | |
171 $dataset->addChild("hosting"); | |
172 $packet = $request->asXML(); | |
173 | |
174 // send the request | |
175 $res = $this->send_request($packet); | |
176 | |
177 // make it to simple-xml-object | |
178 $xml = new SimpleXMLElement($res); | |
179 | |
180 return $xml; | |
181 } | |
182 | |
183 /** | |
184 * Get psa-id of a domain | |
185 * | |
186 * @param string $domain domain-name | |
187 * | |
188 * @returns bool|int false if failed and integer if successed | |
189 */ | |
190 function get_domain_id($domain) | |
191 { | |
192 $xml = $this->domain_info($domain); | |
193 $id = intval($xml->site->get->result->id); | |
194 $id = (is_int($id)) ? $id : false; | |
195 | |
196 return $id; | |
197 } | |
198 | |
199 /** | |
200 * Change Password of a mailbox | |
201 * | |
202 * @param string $mailbox full email-address (user@domain.tld) | |
203 * @param string $newpass new password of mailbox | |
204 * | |
205 * @returns bool | |
206 */ | |
207 function change_mailbox_password($mailbox, $newpass) | |
208 { | |
209 list($user, $domain) = explode("@", $mailbox); | |
210 $domain_id = $this->get_domain_id($domain); | |
211 | |
212 // if domain cannot be resolved to an id, do not continue | |
213 if (!$domain_id) { | |
214 return false; | |
215 } | |
216 | |
217 // build xml-packet | |
218 $request = $this -> get_request_obj(); | |
219 $mail = $request -> addChild("mail"); | |
220 $update = $mail -> addChild("update"); | |
221 $add = $update -> addChild("set"); | |
222 $filter = $add -> addChild("filter"); | |
223 $filter->addChild("site-id", $domain_id); | |
224 | |
225 $mailname = $filter->addChild("mailname"); | |
226 $mailname->addChild("name", $user); | |
227 | |
228 $password = $mailname->addChild("password"); | |
229 $password->addChild("value", $newpass); | |
230 $password->addChild("type", "plain"); | |
231 | |
232 $packet = $request->asXML(); | |
233 | |
234 // send the request to plesk | |
235 $res = $this->send_request($packet); | |
236 $xml = new SimpleXMLElement($res); | |
237 $res = strval($xml->mail->update->set->result->status); | |
238 | |
239 return $res == "ok"; | |
240 } | |
241 } |