-
Notifications
You must be signed in to change notification settings - Fork 7
/
KPSSoapClient.php
415 lines (324 loc) · 35.8 KB
/
KPSSoapClient.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
<?php
/**
* KPSSOapCLient
*
* @copyright Copyright (c) Engin Aygen <[email protected]>
* @license http://opensource.org/licenses/gpl-license.php GNU General Public License, Version 3
* @version 1.0
*/
class KPSSoapClient extends SoapClient
{
/**
* XML Templates
*/
const STS_TEMPLATE = "PHM6RW52ZWxvcGUgeG1sbnM6cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMy8wNS9zb2FwLWVudmVsb3BlIiB4bWxuczphPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1LzA4L2FkZHJlc3NpbmciIHhtbG5zOnU9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3Mtd3NzZWN1cml0eS11dGlsaXR5LTEuMC54c2QiPgogICAgPHM6SGVhZGVyPgogICAgICAgIDxhOkFjdGlvbiBzOm11c3RVbmRlcnN0YW5kPSIxIj5odHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93cy1zeC93cy10cnVzdC8yMDA1MTIvUlNUL0lzc3VlPC9hOkFjdGlvbj4KICAgICAgICA8YTpNZXNzYWdlSUQ+PC9hOk1lc3NhZ2VJRD4KICAgICAgICA8YTpSZXBseVRvPgogICAgICAgICAgICA8YTpBZGRyZXNzPmh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L2E6QWRkcmVzcz4KICAgICAgICA8L2E6UmVwbHlUbz4KICAgICAgICA8YTpUbyBzOm11c3RVbmRlcnN0YW5kPSIxIj48L2E6VG8+CiAgICAgICAgPG86U2VjdXJpdHkgczptdXN0VW5kZXJzdGFuZD0iMSIgeG1sbnM6bz0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIj4KICAgICAgICAgICAgPHU6VGltZXN0YW1wIHU6SWQ9Il8xIj4KICAgICAgICAgICAgICAgIDx1OkNyZWF0ZWQ+PC91OkNyZWF0ZWQ+CiAgICAgICAgICAgICAgICA8dTpFeHBpcmVzPjwvdTpFeHBpcmVzPgogICAgICAgICAgICA8L3U6VGltZXN0YW1wPgogICAgICAgICAgICA8bzpVc2VybmFtZVRva2VuIHU6SWQ9Il8yIj4KICAgICAgICAgICAgICAgIDxvOlVzZXJuYW1lPjwvbzpVc2VybmFtZT4KICAgICAgICAgICAgICAgIDxvOlBhc3N3b3JkIFR5cGU9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIwMDQwMS13c3MtdXNlcm5hbWUtdG9rZW4tcHJvZmlsZS0xLjAjUGFzc3dvcmRUZXh0Ij48L286UGFzc3dvcmQ+CiAgICAgICAgICAgIDwvbzpVc2VybmFtZVRva2VuPgogICAgICAgIDwvbzpTZWN1cml0eT4KICAgIDwvczpIZWFkZXI+CiAgICA8czpCb2R5PgogICAgICAgIDx0cnVzdDpSZXF1ZXN0U2VjdXJpdHlUb2tlbiB4bWxuczp0cnVzdD0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3Mtc3gvd3MtdHJ1c3QvMjAwNTEyIj4KICAgICAgICAgICAgPHdzcDpBcHBsaWVzVG8geG1sbnM6d3NwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA0LzA5L3BvbGljeSI+CiAgICAgICAgICAgICAgICA8YTpFbmRwb2ludFJlZmVyZW5jZT4KICAgICAgICAgICAgICAgICAgICA8YTpBZGRyZXNzPjwvYTpBZGRyZXNzPgogICAgICAgICAgICAgICAgPC9hOkVuZHBvaW50UmVmZXJlbmNlPgogICAgICAgICAgICA8L3dzcDpBcHBsaWVzVG8+CiAgICAgICAgICAgIDx0cnVzdDpSZXF1ZXN0VHlwZT5odHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93cy1zeC93cy10cnVzdC8yMDA1MTIvSXNzdWU8L3RydXN0OlJlcXVlc3RUeXBlPgogICAgICAgIDwvdHJ1c3Q6UmVxdWVzdFNlY3VyaXR5VG9rZW4+CiAgICA8L3M6Qm9keT4KPC9zOkVudmVsb3BlPg==";
const KPS_TEMPLATE = "77u/DQo8czpFbnZlbG9wZSB4bWxuczpzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAzLzA1L3NvYXAtZW52ZWxvcGUiIHhtbG5zOmE9Imh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZyIgeG1sbnM6dT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXV0aWxpdHktMS4wLnhzZCI+DQogICAgPHM6SGVhZGVyPg0KICAgICAgICA8YTpBY3Rpb24gczptdXN0VW5kZXJzdGFuZD0iMSI+PC9hOkFjdGlvbj4NCiAgICAgICAgPGE6TWVzc2FnZUlEPjwvYTpNZXNzYWdlSUQ+DQogICAgICAgIDxhOlJlcGx5VG8+DQogICAgICAgICAgICA8YTpBZGRyZXNzPmh0dHA6Ly93d3cudzMub3JnLzIwMDUvMDgvYWRkcmVzc2luZy9hbm9ueW1vdXM8L2E6QWRkcmVzcz4NCiAgICAgICAgPC9hOlJlcGx5VG8+DQogICAgICAgIDxhOlRvIHM6bXVzdFVuZGVyc3RhbmQ9IjEiPjwvYTpUbz4NCiAgICAgICAgPG86U2VjdXJpdHkgczptdXN0VW5kZXJzdGFuZD0iMSIgeG1sbnM6bz0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzLzIwMDQvMDEvb2FzaXMtMjAwNDAxLXdzcy13c3NlY3VyaXR5LXNlY2V4dC0xLjAueHNkIj4NCiAgICAgICAgICAgIDx1OlRpbWVzdGFtcCB1OklkPSJfMCI+DQogICAgICAgICAgICAgICAgPHU6Q3JlYXRlZD48L3U6Q3JlYXRlZD4NCiAgICAgICAgICAgICAgICA8dTpFeHBpcmVzPjwvdTpFeHBpcmVzPg0KICAgICAgICAgICAgPC91OlRpbWVzdGFtcD4NCiAgICAgICAgICAgIDx4ZW5jOkVuY3J5cHRlZERhdGEgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjRWxlbWVudCIgeG1sbnM6eGVuYz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjIj4NCiAgICAgICAgICAgICAgICA8eGVuYzpFbmNyeXB0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjYWVzMjU2LWNiYyIvPg0KICAgICAgICAgICAgICAgIDxLZXlJbmZvIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4NCiAgICAgICAgICAgICAgICAgICAgPGU6RW5jcnlwdGVkS2V5IHhtbG5zOmU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDQveG1sZW5jIyI+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZTpFbmNyeXB0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjcnNhLW9hZXAtbWdmMXAiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIvPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9lOkVuY3J5cHRpb25NZXRob2Q+DQogICAgICAgICAgICAgICAgICAgICAgICA8S2V5SW5mbz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bzpTZWN1cml0eVRva2VuUmVmZXJlbmNlPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8WDUwOURhdGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8WDUwOUlzc3VlclNlcmlhbD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8WDUwOUlzc3Vlck5hbWU+PC9YNTA5SXNzdWVyTmFtZT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8WDUwOVNlcmlhbE51bWJlcj48L1g1MDlTZXJpYWxOdW1iZXI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1g1MDlJc3N1ZXJTZXJpYWw+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvWDUwOURhdGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vOlNlY3VyaXR5VG9rZW5SZWZlcmVuY2U+DQogICAgICAgICAgICAgICAgICAgICAgICA8L0tleUluZm8+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZTpDaXBoZXJEYXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlOkNpcGhlclZhbHVlPjwvZTpDaXBoZXJWYWx1ZT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZTpDaXBoZXJEYXRhPg0KICAgICAgICAgICAgICAgICAgICA8L2U6RW5jcnlwdGVkS2V5Pg0KICAgICAgICAgICAgICAgIDwvS2V5SW5mbz4NCiAgICAgICAgICAgICAgICA8eGVuYzpDaXBoZXJEYXRhPg0KICAgICAgICAgICAgICAgICAgICA8eGVuYzpDaXBoZXJWYWx1ZT5TcWlEWXF6N25LM2RaSTZ1TkU5UUt1eVdLVVVENFlBWFpNeVRKaHdmN2I4WEQxOGtiK2I3STBGYW11RU83cVJxYkJ1ZEpORHZDUzdCWG5QeFZ5NXE0ZnJSY0FhY3ZIeEk4TDh3UjE2d3BvY2tBZUxSd01TQTVYeE41aWQwSnFYdll5QWNWejNqbVpHeENMYUd3U0JKTXkvaDg2Ly90TkFETXJSR3dQZ3hMZmYxVWxXUWw1TG9Ka3VPRVJDZ0ZWelJ4TE43c1ByNDdjUm03Qkc5dDJtaGhBNWZiMkIycUFpR0taS1RGQWFNaEZZTlFKaG1waU4xTEw5NHZWZEQyTjNwSHVGaExzcTh4aUNoRStuUHNTa1Z4S2dES3VwMDYrdkpRa2hYQnRFTVdIU2FJdWgrclltVE9IOWZTenV0Nkp4bTk2WkRIRk9pbmFlMi9CMGtlRVVhSHpVWWJGY3hvdEJFZ1pDZkllQjRSbU1xZGMyVkcrR3h0VFN5VGtPMFZXUXlMRXluNUJkVFhHQmNWVmk2YytZL1RDclkrZlcyT0dhdkJ3MHVzSzdxb2ozMkFuRGhwVWY3NEdCNExRWFhIRlRvT1NRY0hIZURjMitLSEJiNmFlTURtV3cwTU5uaFRNRndna2pDWW1vUWpjVFg2ZXpmSUdjTzdRRFZKd3JzUkY0UzRIb1U0TnA3N3dHdW9JQ3MyMGVCRzdCSG1hakx3a2VIRkdwU3FxZ2pxNjc0RHNWQVB4VStwcHk3clFoa0Q2amFaemVoOEZncW5QNVNZWFdQVngyMTFoejRwcm91OHJtTFpPK21TQ1NJTzBUV0hXRUkzZ05kVVBGU0hFZlRVcHU5WmRSUDFnZERRREJSdldFMDlSWkZqL3RhY0E0MVpyQ0R0YUpTbXFCVFdLSmVKNXpub1QrZ0RRNlk3dUFtVjJac3hObmQ2RnNtTTlHKzdmTjVoUmpkQXBPMDMyR2dWQ2tQUkNsRkVmd3Rqd3BGR3UvMTRYUmNKU3R6RDdxbVpYcEQwQmRFa05SWnk3MFpkNGlnUW5iSC9jUVltaVNyRDJKWUczaWhtUEFGR2poaXFaRU9CanF3blBTRDdPVjhIMzRscTlvUk5DV1Q0bTJFL01YUVAxY3Q3OHB6U08vOWc5ZVdGS09SRGlRQ0Q0bzNYN3pidndCRUwydkgxTGRvbDJ6OGxoSVRMT0JNWkx3TUhTaEhDZU5BWDlVK3Q0bXRCbnN5ZGpTcGZoVU4vSUV0NWFFUlFTYkwrb1EzS1BhZ1Y1Z0pDajNnaXhUM24wTGFaaDZWK2picGhoQXVtTUhrbjA2YUZtMmhKKzZWM2VXK0R6RW15bGNrRzlTWUpvZ0N2dHRBbjU5N2x0YWNpdko3MkYzUlM3V0UzOFJPOHlpUm9La3Zvb2FCWVJWYXNSLytQSGtnQ2JoSmwzWm8xUVplNE05M1hlNzl0V1lLTWIwWjY5dld0cDZwN3hpWWwxWVU0MjhzQmdPVGhaUlFFNHhmWXNMaU9PMnhsMVVGMDVVODRnSnN4dUNsdGxwS1lOVVV6ZHZyY29HYm1SZy8xRmpqZUNFMVVBSWNWYndvMmtxb05UU1dEREpUd1ZNQVZuaXNYNkI3K1dmeFpTcyttcHBlVGJhc3ZaVUNMWUE0NGl6L0pvMUdrc0dPeGpZMnM1U05pSS8yRytCVDFnb0FaMHZ6WlNkT01qWG9NQmRRRkVSZUkzUDlaRmszOUlmcGZXUmhvMUxDaDIrNm1uZFJZRTRjZkd5OFJMd2h4MWU1Y3AxbmMyb3hMOHNLZVF0eDd5cituSDJiT0N1NERLSk5Gb0dIVE5IMUxVcCtPTnhNM2xTeEZaOUFMTU0xb2VxNThvUWU3MkZaRnZFS3Jyd0I0cE1wdU1RUDg4bWpoZi8zOG9IZHh3OWs0UjVzc0FIMGFoZ1NYL1Fvck53LzB3ZVNMZGN3TlF6WFV6N1RuNE85bVY1Vm4wTDBPNmJvc1FlR0VpbVh0Y0VNRkVZUXVPWlVHOHRFRy9zeE5vNG1GYThLZmFyOFk2SUgxYTRQYnc4cUJaa3d2RllxN05ZYVQyQWpwSE12L3E2RHFmTTJleWFScU95SDJEYVpWSkJ2K0xIYWtnTzVsU1ZlOERZZlNrNWFCMjBLdTAyaGprcGVmaVZwZXpFV25TeW5ibG9sOHIxNFFPWVdsd0NsWWpEbGJFY3VEK3ZBT3I2cFNtbEY3NWRHa0c4TVdmdlAyTCtkK3l0U3NyckgxZFFUMHpBTXJRdTI0R0NYQ3pTNmM0SWtvUzVWUGhLbC9xUmJsaTlCVmpXR0htWXkwdUYxTjZDZko5WE1ZY2tuWWVvQTJTLzJCN2tvZmhIUmZCWUJMU3NTKzlZZDBjb2FwUmgzbVVIWmNMN2oyTE9EY2lUT1k2QnQ0aXMwM0thTnA0YzQraDRQaHZnUVZSNlcvNk1rYmVjc1hZZXZmaW1rOVdqd0F3cE9BREx2cVlEb1o3Njc0c0p1Z29OR3EwNHVpTjlvR2JFVnYxaW5xem1meEtWb3NIS092NkxkNXZGUEpDajluZHhQS21LMnV1M0dzeGtpQlNMUEJ3YnlGMjlIc2FMZUlPcjZnOU9vYys0VEtBQksyeDJTRk5wNGt6bUJ6anZyS0c2ZzNrTm9lQ0VEd211Yk4yUzRhbWpOc2ErdmRMRUpoTTJ0SUFtZ0ppMG5zM0dXMWNjWXQzTkJZY2VKMmE4dWY0cTBVdjBuMU1xVGtwTng1MHQ0SHdLTklWaFMyaWVzaWNaSVpOTUNvSGdSUUxWUEtsZThlUnpDM3JUMDlUbzFpSHpCdVk4ckxYSm9MbS9qSEZmUUN2Rm1rK3dsZ1pzOG94K25FTlpJaFVtVEhKV2srbEU3ci9KT3gzOEVOaWlJcTFOQXoybU1Ma3hTWm5rV3A0U1VuYktWSUoySEY0UFNsamg0Qm1RK0o4OTM2UmVaUWNzNXFJcjR0b0xLK1ZjVi9ZbUhKcDZuV3FZZHQ0VnVwaGV2RkEvcksvR1J4TFdUNU9lRVpPb2JGT3VMMkQ4TVIvWlA2T0M3ZHB3UThvejUydXJaNWVDVTdoSktaQUlwWHo2UGp2Wkd5TEhDNXJ1ZXkrS2l6Z0VmZkpXOHFhR2cvK3o5RVZQRzJxenpsbDVQYnM0TlY5aEV4dlRGaWY3SjZQY2h4eXhOazM3TjhYcFBEMjR1UnBQc0RDMmpuYU1GK1k5SlN3cVZHT0hWbm5oUS9ZUEJkNFFpYm96UlE4NWZLbTN4N254Z3V4MkxTMUNXa1VXc011bW5tQm9raXNpT3hiY09oVVNLS2h5aEorRVB6L0NwazlkWWlONjA2WVdkbmltdGlCYUNsSW9XNHNtNE16RmREdUFzd3h1Nkh0Rk5GSitjUi9ZcHkraTdndVMvTXJtVE1sOTQzcC9qSGhvQVowditlNkFYMjQ3RlptbGlRSlpaYlFUZnlsVlc0NnBncHVXQ1NkRU5LcjRZUDIyOEhLQjlJbTc4ZzdrUFVTdDMyNjBNUVNSanhlQWRjVDdOZlZEQkRKVHpablpFT25GSmFhNFpoa0V2YkdqVUszdGFFMUJHMTQwMEYvSFJ0ZmFMM2c2cC8yNEpBa095T3lnZm5TbUhiVHQycGY1bUtnaXlwVzViZVh1U1BaN0xsVVA5d1VEcGp2b3V6VVpRMzQvRDRKRHBsZnlveVBmb1VTZHhBQjlYdFJPdUN2aW9IYm9HM0lKOEtVZHk0MUtUOXk5WkdJbEtqaTFiSGVEd1NQTXdrWWVocGdKMUVpb3duN29qUXJlSzR4bTEzVncwUmR2M3kxeXBoakl1RndoRDUwWXlkTjJjMGp1Q3NBSm1OTmg4K1FMaEdEUEhyQUNMRWxsQWw2aWdWNkw1NjlQbmdUQkQyazZFRWpRT3RmTkZibjJ6NFFMUllVWTNKWWh1ZEowdXU3cXZQT1hlejc2Nnh4ODRLQmdHVDc5bTVuUnNKRmRGVW8vQlFpVER4Z3grWkJKZHZ1T2ZGekptdTViMVNzYUZNRWpjQ05KTmsrV0V1aGR5N2pQSzRaT1BFUFR0SWgyQWJzbVpxNHdlTURDcHFmUU1CNGNwQTZWTzREYkNuU0c1SUFWSWptZytxVWdWYktUTkJvZ1ovZ0NoUmZBTDFZaVJlVHJmMzA1Zm52RTFnVUJFL0FiK2ZrdlZGRkZDWXhDakhwSnlHVnU2Tk10NU5sNkYyajFpU1JRcXN4SUpxODNxb3pqT1c5eHNTN0lJc1FwZUsrYXFiTVVFcUFSa1JJTGFWdHIxMVp1TS9rMXBNQWIxdW50bEx5NDUzNmN2THJRUkVjSHhSbDZ5dWtDTDlqL2poWTFqYk1rTHJXRE1jTHdEVy9yT1VURW11MUoyQTY2bVAvOTA0VG9kS09GWkZQTlhMM2hFZHBzcGtKOW9lTGova3VBRmxBUlAxcy8wNzhFUG9GRjl2SVRqaHJxN1grSHQ2NnZwREw5dXU4ZUhzMFhuRkh2QWd3MGcyVmJxSHk1blJ0eEJQUXhWbSt2c04vNG42ZTZlVGtKSkt4aGU0eUd5QXlXRk9vQXJ0cGttSzQ4a1Q1cFFKWWlWZFRRa3ZSUXJ0SDFBamRpVTQwTFBsL2F3clppL3lDcy9uZldJU3prMGFLaXlwcXY0T0JoSFhyUnV1K0NCZVJZUDZOK2s3VGdRcjNKa0JCZ0JrQmRIcGhJaC9JQURDQ080K2xkTEs3b3ZSYlYzbVBrcDNDU1NqU1J4Sm5NWnVGRk5YeVVkamlmMWhCNHlXNG1ZWnpuV1czczFVRzFqbkpGblU5NUp2cUI0ZGEzYTRIV21TaWZ0RlhOTjRjVHNjbzRzMDN6VDVqR2dLN09QbzAveHZlSTB0RC9mdFpScHJwc2F2VlpjSlVEMzhwT09YQVpFQ0ptM0dEQWw2bDdKai9FTXloWUdEcnBkcjdtRlV1TnhxWFp3a0Y0TkR2cWJtdXVMVS9TRTJtcjdhZ0lPT3NVbmVVMjNneE1ZSjRPbEQvYWl4OUl0eGF2NHlYMVdlN0ovT3dhcVdvUVMzaGFGd1gybWVHS0pQeXhXdUJ3R0dncWVnWHhzMElBRVZBRmdVeDJLbUVHaVN4NkI3MUlHeTdGajFrUzdvdHZocGtOa1lvWGxCOWNFY2cxSHUyT216dnlVWWgvSGFZK1FHOGpvNGhyaG9PR29ENXZPRkhtWXNVSzR3QlVKMEk5TStZWGZvQkIvczg5b2wwV1dUMnRpKzFISkZJbVVlTG5BMm5yOGkwMGhqZGFldXduUDQzdEo4c0sxVktvOUllY3NDdktudFJCRFBmSThlbVg4L1JINGV0L2NFdXBIYkwwbENLbTV2eVo2YXpOOUp5dmk4NFhtSmNEOGZkQ0VnN3N1NU9LekFZUFk5c3RUQURpbUNaYmlsMU5MSnVRd1lmZzlpV3V0Q2lYYlBJVzRyQ3l1V2VqUmhWSHNnMlhUZE0wRjk3VHdGcUY4MEYzWitweENSbDQxQm9aLy9rRFlaNzJUa0VTWXBtdFdtbVNHUlR3ZmYxYVErWWw5dkQrQ2R2bVIrMDJpZWFQQTVFNmpuZTV0QTVoeEhPWW5WblhxK1M1dVEvTkJCRE5xZmFSdk5pOHN2R2ZDVjlpS1ZUZUI4bjYyaEk5eWUwZVYyRWl1bVVRVUUrZlZsd0VkQVlHZ0JtalFJeWVMNGtMdmxpOWtkSEF0RmNQdUpMWWxMb1JiOGtzbTMwYWZyc0JSMGJaVWNkdmU2c0xWY3Y0UWNGQmRmNkY1enRxUUNkR0dyTVFWR1FGNlB5djZReXJYallDMEpLVzBoN0ZEL3NnZzd5WlFDVlROaEVTVGYxUzJXTW0xNTFQOEdXNGNka1pqZ3NEWEFTMlc1d09TbW1LVno3NmMxL0lMZ29haS9xRnQzd2dSM0lndTBkSEJlN1VmaTRqR0tBaTdSUHRUTkZXY3dwRHlqUUJOVERTZ3E2REtJclJ2OXhCT1FxZXY2Z2NueTFoV3drc09XbFhjRENLV2xDKzZybXdDclRSNDRNVGh1dzgyMWNUWUxxQm12RjM4aG56WE9oR3lvclJocDJUKzJNelBCS09wS1cxUUNINE9rdlhETTFQZDk1RDZQeTFOVmJUbENwaXJ6eXE0M3MrdTFPbXhoOFY1TXR3T2FxMXNlVlIwQXphSnJXY0ZDemN4bzBqMkV6emF2dmV4OUxrc0U0WWNmZEFCVHBLUUR3NlR0MnNSdEFkTnRXYnkrK0VFU0V2RjNDWk1EZTVRK2o3V1QwVlUvbC8wd1BmQmozT1hmRmRlVHRtU3Y5RzB5R2JDQ0J1bGg0c3J2SkxLcmZKMTZmSzBQRkJEUHcyY0MyMUFtR1E3TlQyeTcvZ0p3ZTdZN0hKLzRLd2wyd3k3STlJYWM1aDVPRHZOb0tURFpBUjQwQXhFRFk2ZFgzZ3ljZ3hCZTM3NGZNeGZrbkxEbllzWlA5V21CbytlZkp3SGo4d2ZTQlhnc1VCQW5GVjhPK1AzRUhXRmJ4UnFqam5sc1p4cm9jVGg1UlNUSlo3MVo5OFI0MnZLWS9OWHlzckp5OGdmVkcveERXMll5U2pYQlJpNC9rb0ZUYjdVbVIwcFpEYmloYUpoejhwbklyVUFOR3dla1ZUMjFuNTVDc1lrOUU0YnZ4Z3hheHZNQVhmQzZncUIyTyt3T1RrUzM5Y3RSTDFnU2JBVk1vd0dCdzBuaEFna1FrREkxd2hpSGJXZVlpazNGSUplMHJscFdXYllhMkVFVHJzc2xaWCtIaUg5b2JlYWgrY3MydHNHOVlXd1hFWVJZVjcyWnArWFdyVkNYMEE4RGk5Q3ZEcmU2WXRidVJtWE1tNzBtTkJQVzBkczVNNUxnWUJ2Z0NtbTVOY2swZ0ZJTVNvc2ZKOE5raWZYTEc3U1hpdU5mRStESW5iMGdINEhZbURLY0dVZk9LTGJncG95dXpEcEo5QzJ6RHk2elVpbU10SjZ5MExFY293SDBoZktMeFpKR0IxcTdraFZsT001YXd4VlVmVlJDazlEZXIzVFpveENnclljaDBpckdzOGloc01iRVZ6YUJqdlR4U1V4WXlGckMvY2wzWUNlUFd4bGhHeFIwV1hxMzM3RmJjQnlIMnF6RWhPWndKek1PczFFZzJYUGIvRnVBV1FyZTM3eWc1UndZZXBOQkJYTFNjdnQ2YVdBUlIxdHVWZWpaWERQK1k5K2txQTAraWNSNTBOK3lvNXZQbjR2T0JsV1FBcC9lalRuZGZISVhoeklkTHd4c1dxWWhBS2xzamlQT1hqbDg4bDlSRTJvMys0ZG9PRS9ob3hlU0dZMlZ5bHBib0hnYm03Mjh6cjBwOUFXUXArZjJwYkN4dGhYQ2hpbkYzM3Mwb1Zjd25kRU5IYktKcnR5K3VTc1BSQXdwNnR0empyYjYyQUhrY1dKZGhMRjFKemlwcCtQVlZzUnFuYzA2T2dSU0pidkM1NkVQWWY0aDBCZUdrUm9YamV0Qm90NnU0eWJNci9hUitObnl5TU1manRpTXRCbzZjRmgwZDlhZzhnR0hQSm50UDk5bGZvK3FBNFFNU2FZRGxEK3NkK3dKeTY5OXBrR01ibjJ1WTFtWFhpUGxRNjhWMW5FY2RJN3kvUmRna3NSZXN4SytwRnhxTmoza1l4YkovUElhbXp3bEZUdXR6TkJkcS90eGNQUndkNEphdEFTZC9wVUFEeEFpZmc2bnJLcjdlNVBwTThSbVZBUjRVbitycFRtY0czNUdQN2RKcUIyeGpqQUJCSlNUQzFwdzBnWGtXaUtsWEwyb0FldHdnNm0rVjlrUURSd0REbDE4VHk3Y0UvYmFWbHNSWC9SNk81c2lEVFdaMVhoaU9WeU9EemJEaEk5K3JoN29sMDJsbjJycUlpOVJ4RmY4WTRLdmFuTzNwUHNidU50dTg0QlZPN2xMTUp6WG1pZmVocTlIU1dWaWpBVjhkTEozMjJlSjNBbCtJaGR4MHdJZjRWNDlkeFU1SndreTBwVVJZelV6cEJwa2dJNGZpdlJMZXBjaE4rUzJsWTc2bTZJb3FnRVJjemVVYlJPd3NBRkRLMWM4RVJCNDBMS2JKdkVLZXV4ODBaM3ZvcWYwN2J1OTVlTkZrcHNEd3JvNkZDVTZhYUM5aFlOSUpEQy84WDZSUWIzeC9SODlrM2s0UndlWDhLTFRQdVZwZjBtN0FJTE5KSVhXOTcyMERCM1lrQjZJeGFHanBHZ3VsZDVoZGNnSFRmSndFMGdQUU5SWGFLeEFhdnhYazE4QldYNkhoc2FnQ0c3aklEZnBKczdGcUZGaWpiOEhabEJVL0hhL3F4ZHZZWWdyWG8zQmk0dmlOeklabEtvclN3WEswRERrczNrVnE2R29KS3ZVUmhYSTVOcFJaeXFqbFdSek9KaVd4YXpaWS9Jd1NZZ1RjMzMwelRCbUd2d1ZSbjdJQnVuSklkWmo4ZjhCOUEvRDBISGN1bFBMOEhIb09tYU5Jc1pXbmE5SXN4UzYwY00xSmZQK3VBd3poVEhhUHY4SGJBMEExc0owSjJEVTdLcE10M3hlWGNIbWh0M0kwWkU2blI1STVBMTRPMFZvaDlwZlQ3VUtObnNtdGI5WGpwZnhlbS9meGxScTVVZXpxeUJmcXVyQzZRM1dCdU1pUVpBdGVSUjJxUTByYjBjZ2NjRmFuVmJDU1R4UHBtZTU4QW53dHRLUHZpYlpHMitMb3VETGwwTjF1cWNwWlpHNXllS2NpSmxKK3RxTkpkT0JCZ1QzL1Jrcmo0bUpmOTYyckdINHNtazI5S1MxbXc1MExCUnlZRjZkTjVsSm9jcERoSGxob0I1cFBycjdnQ3FsRmlRWXhmUFlXTERrVVo3ZlFIRFA5QzMrai9DWTlUeDZFMTVlOEpIb29QdWd5bGtpU2pGaVNqV0Vsd0Uya3dHYjhmMXBqd1FxZU40eklCQlRMV0N6ODJUODhhYzJsdlRDcUxEcVh5N1dXK0Rsdk5rU3pFeTNwcjdZbXBiZEVJc0V3WVZWWXpUOUFjeXR5R015OXViRXhNK3BnRnNRUWE2WWJydHJmNXZJSWd1S3dBN1JXWnczSjB1UW16MllobmUvYzRFRWl2R3JhdUxTWitJeStaNkZZbW9Vb0Y3cEZLazltR2htakN5UHlVeVNMTzhHSWNDS2FUL0xLMEZxamRyaG5WY1lDamNLNFlFYzZ6Uy81bzV1MFdNQWpXcmZ6eE1MUkVVc1JMbSt0bEgwSVpCcTNtWUNvZjdLeVNPNjFSYzhRZEZVbmVBNnRndkdEUFJ6VUtsSHdqWUkwZTNxbDRtNjhRd0JMS2xRdmI5OEw4R3dxMm5HaFJzRWI2Y05EYnlkSU5mYlNLOTNIOU9USnY0UnRSbWZLdlRPbjlqS09sQmRlZHdQSDlvdHRKOUtrMHh3NG95eXpqUVludmhQSi9IN0hOd3BVSnhOa0ZFTXZPWGxYS05tNGh1VElLenNyL1ErODdFaWhPNkNZbW5zSHhkbHNYeTRQVjI3aUgxSU9IcXBQNFFCN0N6aVV3bDdLVXlyVzZFa0pMSGpBSmR3WWN3WVhibVpVMEJEQytlVU8xMWREWlpKdktQTHlYOG1nNnNzaDIyVEFBQ2RuK3ROSGF4NThOL1ZGL0R2YUZsZE5DL3pEeXVFa0FhSEx6WWZZZE5xTkthOTh2bHV1S2lJakdNNVgwaDRvdDBDZElsUTNFMkQra1FnWGdyV2xPZ2xtdGtUNWtVems2bkRoa0Jya3dBSFVEcVVlVGM3MEdRSCtqUlB4eVQzOW83SFBVeVA0OWtOQnBDVlFCaEZTaEZ2NjlsY3N1VHRndVVJeHlvUjlyRzQ5aTBzdXd2NDBjTWlXMDh5NWFyNlYvSk9VRzRpdSs5S0tSSzNPSmFDR0dCekRncjZQNUp6T05abEsyOWovdFJFMmo2ZmZXcXE3aUxWVWJyeXplVTVCVmY5eE4rZkpEclFJVGRibEo5cW9ZZHMwNEtmYTBhekRFb09Nek9XV2VwejViKzZWdERHTkpJbDByRVlaVkVaYjhGQllsQWI2NWgvNkJQSGxEZ1dXMk9kb1JOY1VnRnVySHFTQklJejgrUldia0lzQis0UmJpYUJaU1JVc2NWVXpoamtrNGhBZFlPdWRIMHA4TWdmaFlXdWFLWFJFbUo5aFFVaVpJQzBpNGMwQ2VqWGIwd0E1R2hsbjBBT1FmU0hmL2puTWl4WTAxQzJFdmNNc3J5bTlHNmxMOVZNNkNyd2pvQUp0emw1ek1WRklIWENVSEI4eDh0SVdtQWdiVi8vemlVYnZTTmdIZ3hyMUJJMDAwa29tUUU3T1h3OHZxZGZRaUFxbzFwNTZSaVZoTDYxbW54d2tuRFhYYndTVDMzUHpMVXE5Nit0ZXErc1ZzWmorWms3QzRzZFhCd3V5RzA0SmNvRWhMZXBYaERQZkk3WUo3K1I4UjRzeXVRNkZjVHp6TG0vTlBEdlZqT1NBMzhXQTZETC91V0tkMlJrdUdDUUhxTUZYc2x4aGtIZmpYWWkvaDl5YU9pdmkxeVpFMCsvM2MzcEVSbENtYlRRRE9WVjdmTVhaQ1huYzhudlBkUERlaTV4RnNPWDRJRkZXRmRZLzJCUnhodTZkOGpRNnI1ZFFKRStPOUxHdWNEZEJ3S1ZnMVBVcjlIVngwMktIaWZkSHZja1Z3Y3FxS2JTTy80ZytzSi84TXVZNW9acWpMTFdjMDVsZmRlOU1SU0N2eTJZNCtPUWVRYzZnWFBPTWxTZnMyQncrRi9ublBOMk1GOVMraU9lOGRJVWJDd1JjS1lXUmgxRlY5R2x4MHpxOUVuVlpHMTlTZ2VtYzcrUUpGQmdTSEtsYzFob3YwTnZ1V1FnYlh1QzMxa3Z1anlWaEhhL0xLbzhOblJIQ000R1VuUndncFgyRzNENlhxYXhvRFN3UFhKNlZ1MWFpam5IUGdNcy9WSnl5ZzN2OVRzQnZaNDVRaGtORkF3ekljdk4xQk80aHBFUVVsSWZzcm5VZFFMRW4va0ExQVBZbm1BMjRpbFJVejdkYUJudFRqK1l0U1pxeEdiWGhhNkZ1Y0x3S0V1L1dEN3g0enVkTENvTk95T0V5Y0ZUQzRaSFZudHN6UUE4MkpsVEQ3ZWRRSkYvdlBBclZYeWttdWlybXRYZHJHWlQ4K3grbzNRTmd3MVpFYkZVVXVhUU5WYTdSV2hUOVoyOTlMWmlaTys5VGpJM0ZYTVZlWmJYWGtSeFg3OVFZdGo1b09sdngwSmN1eWtWdkIrNFlrbEJHakJ6Q2VkeXRhYzhuQTY2VDNUM1hhVzZnN1lvSm55SkNMUEQwbEVDMVRRdHdXRjBpb0laanh5RFhpNWFqSU1EWk1PRUpzMVNmVkdwd1ZMSWtwVFBFblBLeHZzb1lXeDFuMTQzQXVDRjZ2QzBNSmYzU25BSm1lcGRDV0NxbTNTdENaUU9mMVc0MzYyMmYyaHBPRWVOeWZCY01aVjh5UXNRZkhISTY4Y00wdTZpRGdSWGY3Wm80a2dnSm1rSFp0SWtqS1Nqdk4zd3BRZ3RDZXBqTFBYM1l4WlVXTSs1ZU5VTWFSTitOK0F4Ukd2OUk3eFRxb2V2T3k1ZWY5TVRtOW5TQTlrN0poZmlBNS9EVk9NNDNpL293aWtFTVlqSm9TRGVkbHRzajA0blNHUGlMU0dCK0hWajZKb3pjY1BvbXk3UERUMVgzcW5GdGtMZjFCdzNxVk1XMlVZbmVmcDdIMThkazVKTmc3a2s3cWt6eGlJakszQm5zVzVXRGovZHJTUjQ1ZXRrQ3VNZVlmMHNsSDhqdWQ4dHljdEpYMzBUNGdWSEJLNGMwSktXOVB1cmVQWE90M2VKYWlBTUl0blhnSUdjekxNZUpTZWJhWlhHekVTU09QZnJvWFRzMWpRMlhpa3NyZXVLdXZGcnVkMUU4dWtwT2Q0ckxLbHJENStlNkNxQVM2NFpoYlUxcGplN3JzTkVNOEF6dnZrYXhFeWxHdzQ2R1NRbXg4WWZzb2FqQi9uaEdYUmdFdnUzWk1BRU5KMjM3bWJKeVBZUy8yMy9iVEQrYnk1d1BwUlVqT0ZqcStrc00zZEFUdWtDZUdiYWEyQWxEMUdTYUhrV0dBWCs1b1phdm9IeE1zSVRPYVFNQm5JNDRLRDNFNkVETnBVYlJOTW1Bb1Z6V211WXBkM2g0NDNReXZMYzB5QjJlSTB1Nkl1aE9lU2szZGc1QWc9PC94ZW5jOkNpcGhlclZhbHVlPg0KICAgICAgICAgICAgICAgIDwveGVuYzpDaXBoZXJEYXRhPg0KICAgICAgICAgICAgPC94ZW5jOkVuY3J5cHRlZERhdGE+DQogICAgICAgICAgICA8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4NCiAgICAgICAgICAgICAgICA8U2lnbmVkSW5mbz4NCiAgICAgICAgICAgICAgICAgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzEwL3htbC1leGMtYzE0biMiLz4NCiAgICAgICAgICAgICAgICAgICAgPFNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNobWFjLXNoYTEiLz4NCiAgICAgICAgICAgICAgICAgICAgPFJlZmVyZW5jZSBVUkk9IiNfMCI+DQogICAgICAgICAgICAgICAgICAgICAgICA8VHJhbnNmb3Jtcz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMC94bWwtZXhjLWMxNG4jIi8+DQogICAgICAgICAgICAgICAgICAgICAgICA8L1RyYW5zZm9ybXM+DQogICAgICAgICAgICAgICAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxEaWdlc3RWYWx1ZT5YRDJRL1VJYXZRNFpMT3NpSEtkYmE0WUcwT1E9PC9EaWdlc3RWYWx1ZT4NCiAgICAgICAgICAgICAgICAgICAgPC9SZWZlcmVuY2U+DQogICAgICAgICAgICAgICAgPC9TaWduZWRJbmZvPg0KICAgICAgICAgICAgICAgIDxTaWduYXR1cmVWYWx1ZT5sNFRwRlhod3dLQmdGQWpCMTFOZko5bkF3WFU9PC9TaWduYXR1cmVWYWx1ZT4NCiAgICAgICAgICAgICAgICA8S2V5SW5mbz4NCiAgICAgICAgICAgICAgICAgICAgPG86U2VjdXJpdHlUb2tlblJlZmVyZW5jZSBrOlRva2VuVHlwZT0iaHR0cDovL2RvY3Mub2FzaXMtb3Blbi5vcmcvd3NzL29hc2lzLXdzcy1zYW1sLXRva2VuLXByb2ZpbGUtMS4xI1NBTUxWMS4xIiB4bWxuczprPSJodHRwOi8vZG9jcy5vYXNpcy1vcGVuLm9yZy93c3Mvb2FzaXMtd3NzLXdzc2VjdXJpdHktc2VjZXh0LTEuMS54c2QiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPG86S2V5SWRlbnRpZmllciBWYWx1ZVR5cGU9Imh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy9vYXNpcy13c3Mtc2FtbC10b2tlbi1wcm9maWxlLTEuMCNTQU1MQXNzZXJ0aW9uSUQiPl9jN2ZjNzhlZi0wMzA1LTQ5Y2YtYjY4MC0yNGQ1MjBhMTFkODE8L286S2V5SWRlbnRpZmllcj4NCiAgICAgICAgICAgICAgICAgICAgPC9vOlNlY3VyaXR5VG9rZW5SZWZlcmVuY2U+DQogICAgICAgICAgICAgICAgPC9LZXlJbmZvPg0KICAgICAgICAgICAgPC9TaWduYXR1cmU+DQogICAgICAgIDwvbzpTZWN1cml0eT4NCiAgICA8L3M6SGVhZGVyPg0KPC9zOkVudmVsb3BlPg==";
/**
* Namespaces
*/
const S11 = "http://schemas.xmlsoap.org/soap/envelope/";
const S12 = "http://www.w3.org/2003/05/soap-envelope";
const WSU = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
const WSSE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
const WSSE11 = "http://docs.oasis-open.org/wss/oasis-wss-wsecurity-secext-1.1.xsd";
const WST = "http://docs.oasis-open.org/ws-sx/ws-trust/200512";
const DS = "http://www.w3.org/2000/09/xmldsig#";
const XENC = "http://www.w3.org/2001/04/xmlenc#";
const WSP = "http://schemas.xmlsoap.org/ws/2004/09/policy";
const WSA = "http://www.w3.org/2005/08/addressing";
const XS = "http://www.w3.org/2001/XMLSchema";
const WSDL = "http://schemas.xmlsoap.org/wsdl/";
const SP = "http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702";
/**
* Certificate
*/
protected $certificate;
/**
* STS Properties
*/
protected $stsHostName;
protected $stsEndpoint;
protected $stsUsername;
protected $stsPassword;
/**
* RSTR Properties
*/
protected $rstrKeySize;
protected $rstrCreated;
protected $rstrExpires;
protected $rstrKeyInfoX509IssuerName;
protected $rstrKeyInfoX509SerialNumber;
protected $rstrKeyInfoCipherValue;
protected $rstrCipherValue;
protected $rstrBinarySecret;
protected $rstrKeyIdentifier;
function __construct($username, $password, $wsdl, array $options = array())
{
date_default_timezone_set("Europe/Istanbul");
$this->setStsUsername($username);
$this->setStsPassword($password);
if (isset($options['local_cert']))
{
if (is_readable($options['local_cert']) === true)
{
$this->certificate = $options['local_cert'];
}
else {
throw new Exception("Could not load local certificate.");
}
}
$wsdlXml = @file_get_contents($wsdl);
if ($wsdlXml === false)
{
throw new Exception("Could not load WSDL.");
}
$wsdlDom = new DOMDocument("1.0", "utf-8");
$wsdlDom->preserveWhiteSpace = false;
$wsdlDom->loadXML($wsdlXml);
$wsdlXpath = new DOMXPath($wsdlDom);
$wsdlXpath->registerNamespace('WSDL', static::WSDL);
$wsdlXpath->registerNamespace('WSA', static::WSA);
$wsdlXpath->registerNamespace('WSP', static::WSP);
$wsdlXpath->registerNamespace('SP', static::SP);
$addressPath = $wsdlXpath->query("//WSDL:definitions/WSP:Policy/WSP:ExactlyOne/WSP:All/SP:EndorsingSupportingTokens/WSP:Policy/SP:IssuedToken/SP:Issuer/WSA:Address");
if ($addressPath->length === 0)
{
throw new Exception("WSDL has no policy.");
}
$address = $addressPath->item(0)->nodeValue;
$this->stsHostName = parse_url($address, PHP_URL_HOST);
$this->stsEndpoint = $address;
$wsdlData = sprintf("data://text/plain;base64,%s", base64_encode($wsdlXml));
parent::__construct($wsdlData, array_merge($options, array('soap_version' => SOAP_1_2)));
}
function __doRequest($request, $location, $action, $version, $oneWay = 0)
{
$this->stsRequest($location);
$kpsXml = base64_decode(static::KPS_TEMPLATE);
$kpsDom = new DOMDocument("1.0", "utf-8");
$kpsDom->preserveWhiteSpace = false;
$kpsDom->loadXML($kpsXml);
$kpsXpath = new DOMXPath($kpsDom);
$kpsXpath->registerNamespace('S12', static::S12);
$kpsXpath->registerNamespace('WSA', static::WSA);
$kpsXpath->registerNamespace('WSU', static::WSU);
$kpsXpath->registerNamespace('WSSE', static::WSSE);
$kpsXpath->registerNamespace('XENC', static::XENC);
$kpsXpath->registerNamespace('DS', static::DS);
// Addressing
$uuid = $this->uuid();
$actionPath = $kpsXpath->query("//S12:Envelope/S12:Header/WSA:Action");
$messageIDPath = $kpsXpath->query("//S12:Envelope/S12:Header/WSA:MessageID");
$toPath = $kpsXpath->query("//S12:Envelope/S12:Header/WSA:To");
$actionPath->item(0)->nodeValue = $action;
$messageIDPath->item(0)->nodeValue = sprintf("urn:uuid:%s", $uuid);
$toPath->item(0)->nodeValue = $location;
// Timestamp
$time = time();
$dateCreated = gmdate('Y-m-d\TH:i:s\Z', $time);
$dateExpires = gmdate('Y-m-d\TH:i:s\Z', $time + (5 * 60));
$timestampPath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/WSU:Timestamp");
$timestampDateCreatedPath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/WSU:Timestamp/WSU:Created");
$timestampDateExpiresPath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/WSU:Timestamp/WSU:Expires");
$timestampDateCreatedPath->item(0)->nodeValue = $dateCreated;
$timestampDateExpiresPath->item(0)->nodeValue = $dateExpires;
$timestampC14N = $timestampPath->item(0)->C14N(true, false);
// DigestValue
$digestValue = base64_encode(hash('sha1', $timestampC14N, true));
// Issuer
$keyInfoX509IssuerNamePath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/XENC:EncryptedData/DS:KeyInfo/XENC:EncryptedKey/DS:KeyInfo/WSSE:SecurityTokenReference/DS:X509Data/DS:X509IssuerSerial/DS:X509IssuerName");
$keyInfoX509SerialNumberPath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/XENC:EncryptedData/DS:KeyInfo/XENC:EncryptedKey/DS:KeyInfo/WSSE:SecurityTokenReference/DS:X509Data/DS:X509IssuerSerial/DS:X509SerialNumber");
$keyInfoCipherValuePath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/XENC:EncryptedData/DS:KeyInfo/XENC:EncryptedKey/XENC:CipherData/XENC:CipherValue");
$cipherValuePath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/XENC:EncryptedData/XENC:CipherData/XENC:CipherValue");
$keyInfoX509IssuerNamePath->item(0)->nodeValue = $this->rstrKeyInfoX509IssuerName;
$keyInfoX509SerialNumberPath->item(0)->nodeValue = $this->rstrKeyInfoX509SerialNumber;
$keyInfoCipherValuePath->item(0)->nodeValue = $this->rstrKeyInfoCipherValue;
$cipherValuePath->item(0)->nodeValue = $this->rstrCipherValue;
// DigestValue
$digestValuePath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/DS:Signature/DS:SignedInfo/DS:Reference/DS:DigestValue");
$digestValuePath->item(0)->nodeValue = $digestValue;
// Signature
$signaturePath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/DS:Signature/DS:SignedInfo");
$signatureValuePath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/DS:Signature/DS:SignatureValue");
$signatureC14N = $signaturePath->item(0)->C14N(true, false);
$signatureValue = base64_encode(hash_hmac("sha1", $signatureC14N, $this->rstrBinarySecret, true));
$signatureValuePath->item(0)->nodeValue = $signatureValue;
// SAML Assertion
$keyIdentifierPath = $kpsXpath->query("//S12:Envelope/S12:Header/WSSE:Security/DS:Signature/DS:KeyInfo/WSSE:SecurityTokenReference/WSSE:KeyIdentifier");
$keyIdentifierPath->item(0)->nodeValue = $this->rstrKeyIdentifier;
// Message
$domRequest = new DOMDocument("1.0", "utf-8");
$domRequest->preserveWhiteSpace = false;
$domRequest->loadXML($request);
$xpathRequest = new DOMXPath($domRequest);
$xpathRequest->registerNamespace('S12', static::S12);
$bodyPath = $xpathRequest->query("//S12:Envelope/S12:Body");
$bodyItem = $bodyPath->item(0);
$bodyElement = $kpsDom->importNode($bodyItem, true);
$kpsDom->documentElement->appendChild($bodyElement);
$kpsRequest = $kpsDom->saveXML();
return parent::__doRequest($kpsRequest, $location, $action, $version, $oneWay);
}
/**
* Set STS username
*
* @param string $username API user
*/
public function setStsUsername($username)
{
$this->stsUsername = $username;
}
/**
* Returns STS username
*
* @return string STS username
*/
public function getStsUsername()
{
return $this->stsUsername;
}
/**
* Set STS password
*
* @param string $password API password
*/
public function setStsPassword($password)
{
$this->stsPassword = $password;
}
/**
* Returns STS password
*
* @return string STS password
*/
public function getStsPassword()
{
return $this->stsPassword;
}
/**
* Returns STS endpoint
*
* @return string STS endpoint
*/
public function getStsEndpoint()
{
return $this->stsEndpoint;
}
/**
* Performs a STS request
*
* @param string $location Request location
*/
protected function stsRequest($location)
{
$rstXml = base64_decode(static::STS_TEMPLATE);
$rstDom = new DOMDocument("1.0", "utf-8");
$rstDom->preserveWhiteSpace = false;
$rstDom->loadXML($rstXml);
$rstXpath = new DOMXPath($rstDom);
$rstXpath->registerNamespace('S12', static::S12);
$rstXpath->registerNamespace('WSA', static::WSA);
$rstXpath->registerNamespace('WSU', static::WSU);
$rstXpath->registerNamespace('WSSE', static::WSSE);
$rstXpath->registerNamespace('XENC', static::XENC);
$rstXpath->registerNamespace('DS', static::DS);
$rstXpath->registerNamespace('WST', static::WST);
$rstXpath->registerNamespace('WSP', static::WSP);
// Addressing
$uuid = $this->uuid();
$messageIDPath = $rstXpath->query("//S12:Envelope/S12:Header/WSA:MessageID");
$toPath = $rstXpath->query("//S12:Envelope/S12:Header/WSA:To");
$messageIDPath->item(0)->nodeValue = sprintf("urn:uuid:%s", $uuid);
$toPath->item(0)->nodeValue = $this->stsEndpoint;
// Timestamp
$time = time();
$dateCreated = gmdate('Y-m-d\TH:i:s\Z', $time);
$dateExpires = gmdate('Y-m-d\TH:i:s\Z', $time + (10 * 60));
$timestampDateCreatedPath = $rstXpath->query("//S12:Envelope/S12:Header/WSSE:Security/WSU:Timestamp/WSU:Created");
$timestampDateExpiresPath = $rstXpath->query("//S12:Envelope/S12:Header/WSSE:Security/WSU:Timestamp/WSU:Expires");
$timestampDateCreatedPath->item(0)->nodeValue = $dateCreated;
$timestampDateExpiresPath->item(0)->nodeValue = $dateExpires;
// Credentials
$usernamePath = $rstXpath->query("//S12:Envelope/S12:Header/WSSE:Security/WSSE:UsernameToken/WSSE:Username");
$passwordPath = $rstXpath->query("//S12:Envelope/S12:Header/WSSE:Security/WSSE:UsernameToken/WSSE:Password");
$usernamePath->item(0)->nodeValue = $this->stsUsername;
$passwordPath->item(0)->nodeValue = $this->stsPassword;
// Endpoint
$addressPath = $rstXpath->query("//S12:Envelope/S12:Body/WST:RequestSecurityToken/WSP:AppliesTo/WSA:EndpointReference/WSA:Address");
$addressPath->item(0)->nodeValue = $location;
$stsRequest = $rstDom->saveXML();
// Request
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->stsEndpoint);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
if (isset($this->certificate))
{
curl_setopt($ch, CURLOPT_CAINFO, $this->certificate);
}
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Host: " . $this->stsHostName,
"Content-Type: application/soap+xml; charset=utf-8",
"Content-Length: " . strlen($stsRequest),
));
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $stsRequest);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$stsResponse = curl_exec($ch);
if ($stsResponse === false)
{
throw new Exception(curl_error($ch));
}
curl_close($ch);
$rstrDom = new DOMDocument("1.0", "utf-8");
$rstrDom->preserveWhiteSpace = false;
$rstrDom->loadXML($stsResponse);
$rstrXpath = new DOMXPath($rstrDom);
$rstrXpath->registerNamespace('S12', static::S12);
$rstrXpath->registerNamespace('WSA', static::WSA);
$rstrXpath->registerNamespace('WSU', static::WSU);
$rstrXpath->registerNamespace('WSSE', static::WSSE);
$rstrXpath->registerNamespace('XENC', static::XENC);
$rstrXpath->registerNamespace('DS', static::DS);
$rstrXpath->registerNamespace('WST', static::WST);
$rstrXpath->registerNamespace('WSP', static::WSP);
$keySizePath = $rstrXpath->query("//S12:Envelope/S12:Body/WST:RequestSecurityTokenResponseCollection/WST:RequestSecurityTokenResponse/WST:KeySize");
$createdPath = $rstrXpath->query("//S12:Envelope/S12:Body/WST:RequestSecurityTokenResponseCollection/WST:RequestSecurityTokenResponse/WST:Lifetime/WSU:Created");
$expiresPath = $rstrXpath->query("//S12:Envelope/S12:Body/WST:RequestSecurityTokenResponseCollection/WST:RequestSecurityTokenResponse/WST:Lifetime/WSU:Expires");
$endpointPath = $rstrXpath->query("//S12:Envelope/S12:Body/WST:RequestSecurityTokenResponseCollection/WST:RequestSecurityTokenResponse/WSP:AppliesTo/WSA:EndpointReference/WSA:Address");
$keyInfoX509IssuerNamePath = $rstrXpath->query("//S12:Envelope/S12:Body/WST:RequestSecurityTokenResponseCollection/WST:RequestSecurityTokenResponse/WST:RequestedSecurityToken/XENC:EncryptedData/DS:KeyInfo/XENC:EncryptedKey/DS:KeyInfo/WSSE:SecurityTokenReference/DS:X509Data/DS:X509IssuerSerial/DS:X509IssuerName");
$keyInfoX509SerialNumberPath = $rstrXpath->query("//S12:Envelope/S12:Body/WST:RequestSecurityTokenResponseCollection/WST:RequestSecurityTokenResponse/WST:RequestedSecurityToken/XENC:EncryptedData/DS:KeyInfo/XENC:EncryptedKey/DS:KeyInfo/WSSE:SecurityTokenReference/DS:X509Data/DS:X509IssuerSerial/DS:X509SerialNumber");
$keyInfoCipherValuePath = $rstrXpath->query("//S12:Envelope/S12:Body/WST:RequestSecurityTokenResponseCollection/WST:RequestSecurityTokenResponse/WST:RequestedSecurityToken/XENC:EncryptedData/DS:KeyInfo/XENC:EncryptedKey/XENC:CipherData/XENC:CipherValue");
$cipherValuePath = $rstrXpath->query("//S12:Envelope/S12:Body/WST:RequestSecurityTokenResponseCollection/WST:RequestSecurityTokenResponse/WST:RequestedSecurityToken/XENC:EncryptedData/XENC:CipherData/XENC:CipherValue");
$binarySecretPath = $rstrXpath->query("//S12:Envelope/S12:Body/WST:RequestSecurityTokenResponseCollection/WST:RequestSecurityTokenResponse/WST:RequestedProofToken/WST:BinarySecret");
$keyIdentifierPath = $rstrXpath->query("//S12:Envelope/S12:Body/WST:RequestSecurityTokenResponseCollection/WST:RequestSecurityTokenResponse/WST:RequestedUnattachedReference/WSSE:SecurityTokenReference/WSSE:KeyIdentifier");
$this->rstrKeySize = $keySizePath->item(0)->nodeValue;
$this->rstrCreated = $createdPath->item(0)->nodeValue;
$this->rstrExpires = $expiresPath->item(0)->nodeValue;
$this->rstrEndpoint = $endpointPath->item(0)->nodeValue;
$this->rstrKeyInfoX509IssuerName = $keyInfoX509IssuerNamePath->item(0)->nodeValue;
$this->rstrKeyInfoX509SerialNumber = $keyInfoX509SerialNumberPath->item(0)->nodeValue;
$this->rstrKeyInfoCipherValue = $keyInfoCipherValuePath->item(0)->nodeValue;
$this->rstrCipherValue = $cipherValuePath->item(0)->nodeValue;
$this->rstrBinarySecret = base64_decode($binarySecretPath->item(0)->nodeValue);
$this->rstrKeyIdentifier = $keyIdentifierPath->item(0)->nodeValue;
}
/**
* Generates UUID
*
* @return string UUID
*/
protected function uuid()
{
return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', //
mt_rand(0, 0xffff), //
mt_rand(0, 0xffff), //
mt_rand(0, 0xffff), //
mt_rand(0, 0x0fff) | 0x4000, //
mt_rand(0, 0x3fff) | 0x8000, //
mt_rand(0, 0xffff), //
mt_rand(0, 0xffff), //
mt_rand(0, 0xffff) //
);
}
}