ILIAS  release_6 Revision v6.24-5-g0c8bfefb3b8
XapiProxyPolyFill.php
Go to the documentation of this file.
1<?php
2 namespace XapiProxy;
3
5 protected $client;
6 protected $token;
7
8 protected $plugin;
9 protected $table_prefix;
10 protected $lrsType;
11 protected $authToken = NULL;
12 protected $objId = NULL;
13 protected $specificAllowedStatements = NULL;
14 protected $replacedValues = NULL;
15 protected $blockSubStatements = false;
16 protected $cmdParts;
17 protected $method;
18
19 protected $defaultLrsEndpoint = '';
20 protected $defaultLrsKey = '';
21 protected $defaultLrsSecret = '';
22
23 protected $fallbackLrsEndpoint = '';
24 protected $fallbackLrsKey = '';
25 protected $fallbackLrsSecret = '';
26
27 const PARTS_REG = '/^(.*?xapiproxy\.php)(\/([^?]+)?\??(.*))/';
28
29 protected $sniffVerbs = array (
30 "http://adlnet.gov/expapi/verbs/completed" => "completed",
31 "http://adlnet.gov/expapi/verbs/passed" => "passed",
32 "http://adlnet.gov/expapi/verbs/failed" => "failed",
33 "http://adlnet.gov/expapi/verbs/satisfied" => "passed"
34 );
35
36 const TERMINATED_VERB = "http://adlnet.gov/expapi/verbs/terminated";
37
38 public function __construct($client, $token, $plugin=false) {
39 $this->client = $client;
40 $this->token = $token;
41 $this->plugin = $plugin;
42 if ($this->plugin) {
43 $this->table_prefix = "xxcf";
44 }
45 else {
46 $this->table_prefix = "cmix";
47 }
48 preg_match(self::PARTS_REG, $GLOBALS['DIC']->http()->request()->getUri(), $this->cmdParts);
49 $this->method = strtolower($GLOBALS['DIC']->http()->request()->getMethod());
50 }
51
52 public function log() {
53 global $log;
54 if ($this->plugin) {
55 return $log;
56 }
57 else {
58 return \ilLoggerFactory::getLogger('cmix');
59 }
60 }
61
62 public function msg($msg) {
63 if ($this->plugin) {
64 return "XapiCmi5Plugin: " . $msg;
65 }
66 else {
67 return $msg;
68 }
69 }
70
71 public function initLrs() {
72 $this->log()->debug($this->msg('initLrs'));
73 if ($this->plugin) {
74 require_once __DIR__.'/../class.ilXapiCmi5LrsType.php';
75 require_once __DIR__.'/../class.ilXapiCmi5AuthToken.php';
76 try {
77 $authToken = \ilXapiCmi5AuthToken::getInstanceByToken($this->token);
78 }
79 catch (\ilXapiCmi5Exception $e) {
80 $this->log()->error($this->msg($e->getMessage()));
81 header('HTTP/1.1 401 Unauthorized');
82 header('Access-Control-Allow-Origin: '.$_SERVER["HTTP_ORIGIN"]);
83 header('Access-Control-Allow-Credentials: true');
84 exit;
85 }
86 $this->authToken = $authToken;
87 $this->getLrsTypePlugin();
88 }
89 else {
90 require_once __DIR__.'/../class.ilCmiXapiLrsType.php';
91 require_once __DIR__.'/../class.ilCmiXapiAuthToken.php';
92 try {
93 $authToken = \ilCmiXapiAuthToken::getInstanceByToken($this->token);
94 }
95 catch (\ilCmiXapiException $e) {
96 $this->log()->error($this->msg($e->getMessage()));
97 header('HTTP/1.1 401 Unauthorized');
98 header('Access-Control-Allow-Origin: '.$_SERVER["HTTP_ORIGIN"]);
99 header('Access-Control-Allow-Credentials: true');
100 exit;
101 }
102
103 $this->authToken = $authToken;
104 $this->getLrsType();
105 }
106 }
107
108 private function getLrsTypePlugin() {
109 try {
110 $lrsType = $this->getLrsTypeAndMoreByToken();
111 if ($lrsType == null) {
112 // why not using $log?
113 $GLOBALS['DIC']->logger()->root()->log("XapiCmi5Plugin: 401 Unauthorized for token");
114 header('HTTP/1.1 401 Unauthorized');
115 header('Access-Control-Allow-Origin: '.$_SERVER["HTTP_ORIGIN"]);
116 header('Access-Control-Allow-Credentials: true');
117 exit;
118 }
119 $this->defaultLrsEndpoint = $lrsType->getDefaultLrsEndpoint();
120 $this->defaultLrsKey = $lrsType->getDefaultLrsKey();
121 $this->defaultLrsSecret = $lrsType->getDefaultLrsSecret();
122
123 $this->fallbackLrsEndpoint = $lrsType->getFallbackLrsEndpoint();
124 $this->fallbackLrsKey = $lrsType->getFallbackLrsKey();
125 $this->fallbackLrsSecret = $lrsType->getFallbackLrsSecret();
126
127 $this->lrsType = $lrsType;
128 }
129 catch(\Exception $e)
130 {
131 // why not using $log?
132 $GLOBALS['DIC']->logger()->root()->log("XapiCmi5Plugin: " . $e->getMessage());
133 header('HTTP/1.1 401 Unauthorized');
134 header('Access-Control-Allow-Origin: '.$_SERVER["HTTP_ORIGIN"]);
135 header('Access-Control-Allow-Credentials: true');
136 exit;
137 }
138 }
139
140
141 private function getLrsType() { // Core new > 6
142 try {
143
144 $lrsType = $this->getLrsTypeAndMoreByToken();
145 $this->defaultLrsEndpoint = $lrsType->getLrsEndpoint();
146 $this->defaultLrsKey = $lrsType->getLrsKey();
147 $this->defaultLrsSecret = $lrsType->getLrsSecret();
148 $this->lrsType = $lrsType;
149 // one query IS better :-)
150 // $lrsType = new ilCmiXapiLrsType($authToken->getLrsTypeId());
151 $objId = $this->authToken->getObjId();
152 $this->objId = $objId;
153 if (!$lrsType->isAvailable()) {
154 throw new \ilCmiXapiException(
155 'lrs endpoint (id=' . $this->authToken->getLrsTypeId() . ') unavailable (responded 401-unauthorized)'
156 );
157 }
158 } catch (\ilCmiXapiException $e) {
159 $this->log()->error($this->msg($e->getMessage()));
160 header('Access-Control-Allow-Origin: '.$_SERVER["HTTP_ORIGIN"]);
161 header('Access-Control-Allow-Credentials: true');
162 header('HTTP/1.1 401 Unauthorized');
163 exit;
164 }
165 \ilCmiXapiUser::saveProxySuccess($this->authToken->getObjId(), $this->authToken->getUsrId(),$this->lrsType->getPrivacyIdent());
166 return $lrsType;
167 }
171 private function getLrsTypeAndMoreByToken() {
172 $type_id = null;
173 $lrs = null;
174 $db = $GLOBALS['DIC']->database();
175 $query ="SELECT {$this->table_prefix}_settings.lrs_type_id,
176 {$this->table_prefix}_settings.only_moveon,
177 {$this->table_prefix}_settings.achieved,
178 {$this->table_prefix}_settings.answered,
179 {$this->table_prefix}_settings.completed,
180 {$this->table_prefix}_settings.failed,
181 {$this->table_prefix}_settings.initialized,
182 {$this->table_prefix}_settings.passed,
183 {$this->table_prefix}_settings.progressed,
184 {$this->table_prefix}_settings.satisfied,
185 {$this->table_prefix}_settings.c_terminated,
186 {$this->table_prefix}_settings.hide_data,
187 {$this->table_prefix}_settings.c_timestamp,
188 {$this->table_prefix}_settings.duration,
189 {$this->table_prefix}_settings.no_substatements,
190 {$this->table_prefix}_settings.privacy_ident
191 FROM {$this->table_prefix}_settings, {$this->table_prefix}_token
192 WHERE {$this->table_prefix}_settings.obj_id = {$this->table_prefix}_token.obj_id AND {$this->table_prefix}_token.token = " . $db->quote($this->token, 'text');
193
194 $res = $db->query($query);
195 while ($row = $db->fetchObject($res))
196 {
197 $type_id = $row->lrs_type_id;
198 if ($type_id) {
199 $lrs = ($this->plugin) ? new \ilXapiCmi5LrsType($type_id) : new \ilCmiXapiLrsType($type_id);
200 }
201
202 $sarr = [];
203 if ((bool)$row->only_moveon) {
204 if ((bool)$row->achieved) {
205 $sarr[] = "https://w3id.org/xapi/dod-isd/verbs/achieved";
206 }
207 if ((bool)$row->answered) {
208 $sarr[] = "http://adlnet.gov/expapi/verbs/answered";
209 $sarr[] = "https://w3id.org/xapi/dod-isd/verbs/answered";
210 }
211 if ((bool)$row->completed) {
212 $sarr[] = "http://adlnet.gov/expapi/verbs/completed";
213 $sarr[] = "https://w3id.org/xapi/dod-isd/verbs/completed";
214 }
215 if ((bool)$row->failed) {
216 $sarr[] = "http://adlnet.gov/expapi/verbs/failed";
217 }
218 if ((bool)$row->initialized) {
219 $sarr[] = "http://adlnet.gov/expapi/verbs/initialized";
220 $sarr[] = "https://w3id.org/xapi/dod-isd/verbs/initialized";
221 }
222 if ((bool)$row->passed) {
223 $sarr[] = "http://adlnet.gov/expapi/verbs/passed";
224 }
225 if ((bool)$row->progressed) {
226 $sarr[] = "http://adlnet.gov/expapi/verbs/progressed";
227 }
228 if ((bool)$row->satisfied) {
229 $sarr[] = "https://w3id.org/xapi/adl/verbs/satisfied";
230 }
231 if ((bool)$row->c_terminated) {
232 $sarr[] = "http://adlnet.gov/expapi/verbs/terminated";
233 }
234 if (count($sarr) > 0) {
235 $this->specificAllowedStatements = $sarr;
236 $this->log()->debug($this->msg('getSpecificAllowedStatements: ' . var_export($this->specificAllowedStatements,TRUE)));
237 }
238 }
239 if ((bool)$row->hide_data) {
240 $rarr = array();
241 if ((bool)$row->c_timestamp) $rarr['timestamp'] = '1970-01-01T00:00:00.000Z';
242 if ((bool)$row->duration) $rarr['result.duration'] = 'PT00.000S';
243 if (count($rarr) > 0) {
244 $this->replacedValues = $rarr;
245 $this->log()->debug($this->msg('getReplacedValues: ' . var_export($this->replacedValues,TRUE)));
246 }
247 }
248 if ((bool)$row->no_substatements) {
249 $this->blockSubStatements = true;
250 $this->log()->debug($this->msg('getBlockSubStatements: ' . $this->blockSubStatements));
251 }
252 $lrs->setPrivacyIdent((int)$row->privacy_ident);
253 }
254 return $lrs;
255 }
256 }
257?>
if(!defined('PATH_SEPARATOR')) $GLOBALS['_PEAR_default_error_mode']
Definition: PEAR.php:64
An exception for terminatinating execution or to throw for unit testing.
__construct($client, $token, $plugin=false)
getLrsTypeAndMoreByToken()
hybrid function, maybe two distinct functions would be better?
static saveProxySuccess($objId, $usrId, $privacyIdent)
if($_SERVER['argc']< 4) $client
Definition: cron.php:12
exit
Definition: login.php:29
static http()
Fetches the global http state from ILIAS.
$query
$_SERVER['HTTP_HOST']
Definition: raiseError.php:10
$log
Definition: result.php:15
foreach($_POST as $key=> $value) $res
$token
Definition: xapitoken.php:57
$objId
Definition: xapitoken.php:41