diff --git a/h5p.classes.php b/h5p.classes.php index 9fcca19..3cb07c9 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -334,6 +334,16 @@ interface H5PFrameworkInterface { */ public function getLibraryUsage($libraryId); + /** + * Get a key value list of library version and count of content created + * using that library. + * + * @return array + * Array containing library, major and minor version - content count + * e.g. "H5P.CoursePresentation 1.6" => "14" + */ + public function getLibraryContentCount(); + /** * Loads a library * @@ -1664,7 +1674,7 @@ class H5PCore { 'js/h5p-utils.js', ); - public static $defaultContentWhitelist = 'json png jpg jpeg gif bmp tif tiff svg eot ttf woff otf webm mp4 ogg mp3 txt pdf rtf doc docx xls xlsx ppt pptx odt ods odp xml csv diff patch swf md textile'; + public static $defaultContentWhitelist = 'json png jpg jpeg gif bmp tif tiff svg eot ttf woff woff2 otf webm mp4 ogg mp3 txt pdf rtf doc docx xls xlsx ppt pptx odt ods odp xml csv diff patch swf md textile'; public static $defaultLibraryWhitelistExtras = 'js css'; public $librariesJsonData, $contentJsonData, $mainJsonData, $h5pF, $fs, $development_mode, $h5pD, $disableFileCheck; @@ -1713,6 +1723,8 @@ class H5PCore { if ($development_mode & H5PDevelopment::MODE_LIBRARY) { $this->h5pD = new H5PDevelopment($this->h5pF, $path . '/', $language); } + + $this->detectSiteType(); } /** @@ -2390,6 +2402,51 @@ class H5PCore { return $html; } + /** + * Detects if the site was accessed from localhost, + * through a local network or from the internet. + */ + public function detectSiteType() { + $type = $this->h5pF->getOption('site_type', 'local'); + + // Determine remote/visitor origin + $localhostPattern = '/^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$/i'; + + // localhost + if ($type !== 'internet' && !preg_match($localhostPattern, $_SERVER['REMOTE_ADDR'])) { + if (filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)) { + // Internet + $this->h5pF->setOption('site_type', 'internet'); + } + elseif ($type === 'local') { + // Local network + $this->h5pF->setOption('site_type', 'network'); + } + } + } + + /** + * Get a list of installed libraries, different minor versions will + * return separate entries. + * + * @return array + * A distinct array of installed libraries + */ + public function getLibrariesInstalled() { + $librariesInstalled = []; + + $libs = $this->h5pF->loadLibraries(); + + foreach($libs as $library) { + foreach($library as $libVersion) { + + $librariesInstalled[] = $libVersion->name.' '.$libVersion->major_version.'.'.$libVersion->minor_version.'.'.$libVersion->patch_version; + } + } + + return $librariesInstalled; + } + /** * Fetch a list of libraries' metadata from h5p.org. * Save URL tutorial to database. Each platform implementation @@ -2399,6 +2456,10 @@ class H5PCore { $platformInfo = $this->h5pF->getPlatformInfo(); $platformInfo['autoFetchingDisabled'] = $fetchingDisabled; $platformInfo['uuid'] = $this->h5pF->getOption('site_uuid', ''); + $platformInfo['siteType'] = $this->h5pF->getOption('site_type', 'local'); + $platformInfo['libraryContentCount'] = $this->h5pF->getLibraryContentCount(); + $platformInfo['librariesInstalled'] = $this->getLibrariesInstalled(); + // Adding random string to GET to be sure nothing is cached $random = substr(str_shuffle("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), 0, 5); $json = $this->h5pF->fetchExternalData('http://h5p.org/libraries-metadata.json?api=1&platform=' . urlencode(json_encode($platformInfo)) . '&x=' . urlencode($random)); diff --git a/js/disable.js b/js/disable.js index 83d740c..0bfbb07 100644 --- a/js/disable.js +++ b/js/disable.js @@ -16,4 +16,4 @@ $frame.change(toggle); toggle(); }); -})(jQuery); +})(H5P.jQuery); diff --git a/js/h5p.js b/js/h5p.js index b51842f..e55ad20 100644 --- a/js/h5p.js +++ b/js/h5p.js @@ -1610,8 +1610,7 @@ H5P.setFinished = function (contentId, score, maxScore, time) { }; // Post the results - // TODO: Should we use a variable with the complete path? - H5P.jQuery.post(H5PIntegration.ajaxPath + 'setFinished', { + H5P.jQuery.post(H5PIntegration.ajax.setFinished, { contentId: contentId, score: score, maxScore: maxScore,