Merge pull request #8691 from eileenmcnaughton/merge_like
[civicrm-core.git] / CRM / Utils / SoapServer.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.7 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2016 |
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-2016
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 return civicrm_api('Mailing', 'event_bounce', $params);
161 }
162
163 /**
164 * Mailer event unsubscribe.
165 *
166 * @param string $key
167 * @param int $job
168 * @param int $queue
169 * @param string $hash
170 *
171 * @return array|int
172 * @throws SoapFault
173 */
174 public function mailer_event_unsubscribe($key, $job, $queue, $hash) {
175 $this->verify($key);
176 $params = array(
177 'job_id' => $job,
178 'time_stamp' => date('YmdHis'),
179 'org_unsubscribe' => 0,
180 'event_queue_id' => $queue,
181 'hash' => $hash,
182 'version' => 3,
183 );
184 return civicrm_api('MailingGroup', 'event_unsubscribe', $params);
185 }
186
187 /**
188 * @param $key
189 * @param $job
190 * @param $queue
191 * @param $hash
192 *
193 * @return array|int
194 * @throws SoapFault
195 */
196 public function mailer_event_domain_unsubscribe($key, $job, $queue, $hash) {
197 $this->verify($key);
198 $params = array(
199 'job_id' => $job,
200 'time_stamp' => date('YmdHis'),
201 'org_unsubscribe' => 1,
202 'event_queue_id' => $queue,
203 'hash' => $hash,
204 'version' => 3,
205 );
206 return civicrm_api('MailingGroup', 'event_domain_unsubscribe', $params);
207 }
208
209 /**
210 * @param $key
211 * @param $job
212 * @param $queue
213 * @param $hash
214 *
215 * @return array|int
216 * @throws SoapFault
217 */
218 public function mailer_event_resubscribe($key, $job, $queue, $hash) {
219 $this->verify($key);
220 $params = array(
221 'job_id' => $job,
222 'time_stamp' => date('YmdHis'),
223 'org_unsubscribe' => 0,
224 'event_queue_id' => $queue,
225 'hash' => $hash,
226 'version' => 3,
227 );
228 return civicrm_api('MailingGroup', 'event_resubscribe', $params);
229 }
230
231 /**
232 * @param $key
233 * @param $email
234 * @param $domain
235 * @param $group
236 *
237 * @return array|int
238 * @throws SoapFault
239 */
240 public function mailer_event_subscribe($key, $email, $domain, $group) {
241 $this->verify($key);
242 $params = array(
243 'email' => $email,
244 'group_id' => $group,
245 'version' => 3,
246 );
247 return civicrm_api('MailingGroup', 'event_subscribe', $params);
248 }
249
250 /**
251 * @param $key
252 * @param $contact
253 * @param $subscribe
254 * @param $hash
255 *
256 * @return array|int
257 * @throws SoapFault
258 */
259 public function mailer_event_confirm($key, $contact, $subscribe, $hash) {
260 $this->verify($key);
261 $params = array(
262 'contact_id' => $contact,
263 'subscribe_id' => $subscribe,
264 'time_stamp' => date('YmdHis'),
265 'event_subscribe_id' => $subscribe,
266 'hash' => $hash,
267 'version' => 3,
268 );
269 return civicrm_api('Mailing', 'event_confirm', $params);
270 }
271
272 /**
273 * @param $key
274 * @param $job
275 * @param $queue
276 * @param $hash
277 * @param $bodyTxt
278 * @param $rt
279 * @param null $bodyHTML
280 * @param null $fullEmail
281 *
282 * @return array|int
283 * @throws SoapFault
284 */
285 public function mailer_event_reply($key, $job, $queue, $hash, $bodyTxt, $rt, $bodyHTML = NULL, $fullEmail = NULL) {
286 $this->verify($key);
287 $params = array(
288 'job_id' => $job,
289 'event_queue_id' => $queue,
290 'hash' => $hash,
291 'bodyTxt' => $bodyTxt,
292 'replyTo' => $rt,
293 'bodyHTML' => $bodyHTML,
294 'fullEmail' => $fullEmail,
295 'time_stamp' => date('YmdHis'),
296 'version' => 3,
297 );
298 return civicrm_api('Mailing', 'event_reply', $params);
299 }
300
301 /**
302 * @param $key
303 * @param $job
304 * @param $queue
305 * @param $hash
306 * @param $email
307 *
308 * @return array|int
309 * @throws SoapFault
310 */
311 public function mailer_event_forward($key, $job, $queue, $hash, $email) {
312 $this->verify($key);
313 $params = array(
314 'job_id' => $job,
315 'event_queue_id' => $queue,
316 'hash' => $hash,
317 'email' => $email,
318 'version' => 3,
319 );
320 return civicrm_api('Mailing', 'event_forward', $params);
321 }
322
323 /**
324 * @param $key
325 * @param array $params
326 *
327 * @return array|int
328 * @throws SoapFault
329 */
330 public function get_contact($key, $params) {
331 $this->verify($key);
332 $params['version'] = 3;
333 return civicrm_api('contact', 'get', $params);
334 }
335
336 }