summaryrefslogtreecommitdiffstats
path: root/modules/core/lib/ModuleDefinition.php
blob: 9499ed408f2a59cb2e20fe51605d2dac1eb1f1c5 (plain)
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
<?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];
	}
	
	
}