summaryrefslogtreecommitdiffstats
path: root/modules/core/lib/ModuleDefinition.php
diff options
context:
space:
mode:
Diffstat (limited to 'modules/core/lib/ModuleDefinition.php')
-rw-r--r--modules/core/lib/ModuleDefinition.php122
1 files changed, 122 insertions, 0 deletions
diff --git a/modules/core/lib/ModuleDefinition.php b/modules/core/lib/ModuleDefinition.php
new file mode 100644
index 0000000..9499ed4
--- /dev/null
+++ b/modules/core/lib/ModuleDefinition.php
@@ -0,0 +1,122 @@
+<?php
+
+class sspmod_core_ModuleDefinition {
+
+ public $def;
+ private static $cache;
+
+ private function __construct($def) {
+ $this->def = $def;
+ $this->requireValidIdentifier();
+ }
+
+ public static function validId($id) {
+ return preg_match('|^[a-zA-Z_]+$|', $id);
+ }
+
+ public static function isDefined($id) {
+ $config = SimpleSAML_Configuration::getConfig('config.php');
+ $basedir = $config->getBaseDir();
+ $filename = $basedir . 'modules/' . $id . '/definition.json';
+ return (file_exists($filename));
+ }
+
+ public static function load($id, $force = NULL) {
+
+ if (isset($cache[$id])) return $cache[$id];
+
+ if (self::validId($id)) {
+ $config = SimpleSAML_Configuration::getConfig('config.php');
+ $basedir = $config->getBaseDir();
+ $filename = $basedir . 'modules/' . $id . '/definition.json';
+ if (!file_exists($filename))
+ throw new Exception('Could not read definition file for module [' . $id . '] : ' . $filename);
+ $defraw = file_get_contents($filename);
+ $def = json_decode($defraw, TRUE);
+
+ } elseif(preg_match('|^http(s)?://.*$|', $id)) {
+ $defraw = file_get_contents($id);
+ $def = json_decode($defraw, TRUE);
+ } else {
+ throw new Exception('Could not resolve [' . $id . '] as URL nor module identifier.');
+ }
+ $cache[$id] = new sspmod_core_ModuleDefinition($def);
+
+
+
+ if (isset($force)) {
+ if ($force === 'local') {
+ if(preg_match('|^http(s)?://.*$|', $id)) {
+ return self::load($def['id']);
+ }
+ } elseif($force === 'remote') {
+ if (self::validId($id)) {
+ if (!isset($def['definition']))
+ throw new Exception('Could not load remote definition file for module [' . $id . ']');
+ return self::load($def['definition']);
+ }
+ }
+ }
+
+ return $cache[$id];
+ }
+
+ private function requireValidIdentifier() {
+ if (!isset($this->def['id']))
+ throw new Exception('Missing [id] value in module definition');
+ if (!preg_match('|^[a-zA-Z_]+$|', $this->def['id']))
+ throw new Exception('Illegal characters in [id] in module definition');
+ }
+
+ public function getVersion($branch = NULL) {
+ if (!isset($this->def['access'])) throw new Exception('Missing [access] statement in module definition');
+ if (!isset($this->def['branch'])) throw new Exception('Missing [branch] statement in module definition');
+
+ if (is_null($branch)) $branch = $this->def['branch'];
+
+ if (!isset($this->def['access'][$branch])) throw new Exception('Missing [access] information for branch [' . var_export($branch, TRUE) . ']');
+ if (!isset($this->def['access'][$branch]['version'])) throw new Exception('Missing version information in [access] in branch [' . var_export($branch, TRUE) . ']');
+
+ return $this->def['access'][$branch]['version'];
+ }
+
+ public function alwaysUpdate($branch = NULL) {
+ $access = $this->getAccess($branch);
+ if ($access['type'] === 'svn') return TRUE;
+ return FALSE;
+ }
+
+ public function getBranch($branch = NULL) {
+ if (!isset($this->def['branch'])) throw new Exception('Missing [branch] statement in module definition');
+ if (is_null($branch)) $branch = $this->def['branch'];
+ return $branch;
+ }
+
+ public function updateExists($branch = NULL) {
+ $branch = $this->getBranch($branch);
+
+ $localDef = self::load($this->def['id'], 'local');
+ $thisVersion = $localDef->getVersion($branch);
+
+ $remoteDef = self::load($this->def['definition'], 'remote');
+ $remoteVersion = $remoteDef->getVersion($branch);
+
+ #echo ' Comparing versions localĀ [' . $thisVersion . '] and remote [' . $remoteVersion . ']' . "\n";
+
+ return version_compare($remoteVersion, $thisVersion, '>');
+ }
+
+
+ public function getAccess($branch = NULL) {
+ if (!isset($this->def['access'])) throw new Exception('Missing [access] statement in module definition');
+ if (!isset($this->def['branch'])) throw new Exception('Missing [branch] statement in module definition');
+
+ if (is_null($branch)) $branch = $this->def['branch'];
+
+ if (!isset($this->def['access'][$branch])) throw new Exception('Missing [access] information for branch [' . var_export($branch, TRUE) . ']');
+
+ return $this->def['access'][$branch];
+ }
+
+
+} \ No newline at end of file