Merge pull request #12340 from eileenmcnaughton/merge_cleanup
[civicrm-core.git] / CRM / Utils / SoapServer.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 5 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2018 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
13 | |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
26 */
27
28 /**
29 * This class handles all SOAP client requests.
30 *
31 * @package CRM
32 * @copyright CiviCRM LLC (c) 2004-2018
33 */
34 class CRM_Utils_SoapServer {
35
36 /**
37 * Number of seconds we should let a soap process idle
38 */
39 static $soap_timeout = 0;
40
41 /**
42 * Cache the actual UF Class
43 */
44 public $ufClass;
45
46 /**
47 * Class constructor. This caches the real user framework class locally,
48 * so we can use it for authentication and validation.
49 *
50 * @internal param string $uf The userframework class
51 */
52 public function __construct() {
53 // any external program which call SoapServer is responsible for
54 // creating and attaching the session
55 $args = func_get_args();
56 $this->ufClass = array_shift($args);
57 }
58
59 /**
60 * Simple ping function to test for liveness.
61 *
62 * @param string $var
63 * The string to be echoed.
64 *
65 * @return string
66 */
67 public function ping($var) {
68 $session = CRM_Core_Session::singleton();
69 $key = $session->get('key');
70 $session->set('key', $var);
71 return "PONG: $var ($key)";
72 }
73
74 /**
75 * Verify a SOAP key.
76 *
77 * @param string $key
78 * The soap key generated by authenticate().
79 *
80 * @throws SoapFault
81 */
82 public function verify($key) {
83 $session = CRM_Core_Session::singleton();
84
85 $soap_key = $session->get('soap_key');
86 $t = time();
87
88 if ($key !== sha1($soap_key)) {
89 throw new SoapFault('Client', 'Invalid key');
90 }
91
92 if (self::$soap_timeout &&
93 $t > ($session->get('soap_time') + self::$soap_timeout)
94 ) {
95 throw new SoapFault('Client', 'Expired key');
96 }
97
98 // otherwise, we're ok. update the timestamp
99
100 $session->set('soap_time', $t);
101 }
102
103 /**
104 * Authentication wrapper to the UF Class.
105 *
106 * @param string $name
107 * Login name.
108 * @param string $pass
109 * Password.
110 *
111 * @param bool $loadCMSBootstrap
112 *
113 * @throws SoapFault
114 * @return string
115 * The SOAP Client key
116 */
117 public function authenticate($name, $pass, $loadCMSBootstrap = FALSE) {
118 require_once str_replace('_', DIRECTORY_SEPARATOR, $this->ufClass) . '.php';
119
120 if ($this->ufClass == 'CRM_Utils_System_Joomla'
121 || $this->ufClass == 'CRM_Utils_System_WordPress') {
122 $loadCMSBootstrap = TRUE;
123 }
124
125 $result = CRM_Utils_System::authenticate($name, $pass, $loadCMSBootstrap);
126
127 if (empty($result)) {
128 throw new SoapFault('Client', 'Invalid login');
129 }
130
131 $session = CRM_Core_Session::singleton();
132 $session->set('soap_key', $result[2]);
133 $session->set('soap_time', time());
134
135 return sha1($result[2]);
136 }
137
138 /**
139 * MAILER API.
140 *
141 * @param string $key
142 * @param int $job
143 * @param int $queue
144 * @param string $hash
145 * @param string $body
146 *
147 * @return array|int
148 * @throws \SoapFault
149 */
150 public function mailer_event_bounce($key, $job, $queue, $hash, $body) {
151 $this->verify($key);
152 $params = array(
153 'job_id' => $job,
154 'time_stamp' => date('YmdHis'),
155 'event_queue_id' => $queue,
156 'hash' => $hash,
157 'body' => $body,
158 'version' => 3,
159 );
160 $result = civicrm_api('Mailing', 'event_bounce', $params);
161 return CRM_Utils_Array::encode_items($result);
162 }
163
164 /**
165 * Mailer event unsubscribe.
166 *
167 * @param string $key
168 * @param int $job
169 * @param int $queue
170 * @param string $hash
171 *
172 * @return array|int
173 * @throws SoapFault
174 */
175 public function mailer_event_unsubscribe($key, $job, $queue, $hash) {
176 $this->verify($key);
177 $params = array(
178 'job_id' => $job,
179 'time_stamp' => date('YmdHis'),
180 'org_unsubscribe' => 0,
181 'event_queue_id' => $queue,
182 'hash' => $hash,
183 'version' => 3,
184 );
185 $result = civicrm_api('MailingGroup', 'event_unsubscribe', $params);
186 return CRM_Utils_Array::encode_items($result);
187 }
188
189 /**
190 * @param $key
191 * @param $job
192 * @param $queue
193 * @param $hash
194 *
195 * @return array|int
196 * @throws SoapFault
197 */
198 public function mailer_event_domain_unsubscribe($key, $job, $queue, $hash) {
199 $this->verify($key);
200 $params = array(
201 'job_id' => $job,
202 'time_stamp' => date('YmdHis'),
203 'org_unsubscribe' => 1,
204 'event_queue_id' => $queue,
205 'hash' => $hash,
206 'version' => 3,
207 );
208 $result = civicrm_api('MailingGroup', 'event_domain_unsubscribe', $params);
209 return CRM_Utils_Array::encode_items($result);
210 }
211
212 /**
213 * @param $key
214 * @param $job
215 * @param $queue
216 * @param $hash
217 *
218 * @return array|int
219 * @throws SoapFault
220 */
221 public function mailer_event_resubscribe($key, $job, $queue, $hash) {
222 $this->verify($key);
223 $params = array(
224 'job_id' => $job,
225 'time_stamp' => date('YmdHis'),
226 'org_unsubscribe' => 0,
227 'event_queue_id' => $queue,
228 'hash' => $hash,
229 'version' => 3,
230 );
231 $result = civicrm_api('MailingGroup', 'event_resubscribe', $params);
232 return CRM_Utils_Array::encode_items($result);
233 }
234
235 /**
236 * @param $key
237 * @param $email
238 * @param $domain
239 * @param $group
240 *
241 * @return array|int
242 * @throws SoapFault
243 */
244 public function mailer_event_subscribe($key, $email, $domain, $group) {
245 $this->verify($key);
246 $params = array(
247 'email' => $email,
248 'group_id' => $group,
249 'version' => 3,
250 );
251 $result = civicrm_api('MailingGroup', 'event_subscribe', $params);
252 return CRM_Utils_Array::encode_items($result);
253 }
254
255 /**
256 * @param $key
257 * @param $contact
258 * @param $subscribe
259 * @param $hash
260 *
261 * @return array|int
262 * @throws SoapFault
263 */
264 public function mailer_event_confirm($key, $contact, $subscribe, $hash) {
265 $this->verify($key);
266 $params = array(
267 'contact_id' => $contact,
268 'subscribe_id' => $subscribe,
269 'time_stamp' => date('YmdHis'),
270 'event_subscribe_id' => $subscribe,
271 'hash' => $hash,
272 'version' => 3,
273 );
274 $result = civicrm_api('Mailing', 'event_confirm', $params);
275 return CRM_Utils_Array::encode_items($result);
276 }
277
278 /**
279 * @param $key
280 * @param $job
281 * @param $queue
282 * @param $hash
283 * @param $bodyTxt
284 * @param $rt
285 * @param null $bodyHTML
286 * @param null $fullEmail
287 *
288 * @return array|int
289 * @throws SoapFault
290 */
291 public function mailer_event_reply($key, $job, $queue, $hash, $bodyTxt, $rt, $bodyHTML = NULL, $fullEmail = NULL) {
292 $this->verify($key);
293 $params = array(
294 'job_id' => $job,
295 'event_queue_id' => $queue,
296 'hash' => $hash,
297 'bodyTxt' => $bodyTxt,
298 'replyTo' => $rt,
299 'bodyHTML' => $bodyHTML,
300 'fullEmail' => $fullEmail,
301 'time_stamp' => date('YmdHis'),
302 'version' => 3,
303 );
304 $result = civicrm_api('Mailing', 'event_reply', $params);
305 return CRM_Utils_Array::encode_items($result);
306 }
307
308 /**
309 * @param $key
310 * @param $job
311 * @param $queue
312 * @param $hash
313 * @param $email
314 *
315 * @return array|int
316 * @throws SoapFault
317 */
318 public function mailer_event_forward($key, $job, $queue, $hash, $email) {
319 $this->verify($key);
320 $params = array(
321 'job_id' => $job,
322 'event_queue_id' => $queue,
323 'hash' => $hash,
324 'email' => $email,
325 'version' => 3,
326 );
327 $result = civicrm_api('Mailing', 'event_forward', $params);
328 return CRM_Utils_Array::encode_items($result);
329 }
330
331 /**
332 * @param $key
333 * @param array $params
334 *
335 * @return array|int
336 * @throws SoapFault
337 */
338 public function get_contact($key, $params) {
339 $this->verify($key);
340 $params['version'] = 3;
341 $result = civicrm_api('contact', 'get', $params);
342 return CRM_Utils_Array::encode_items($result);
343 }
344
345 }