00001 <?php
00002
00011 abstract class TSD extends SObject {
00015 const MODE_LIVE = 0;
00017 const MODE_DEV = 1;
00019 const MODE_DEV_ACTIVE = 2;
00021 const MODE_DEV_UNAPPROVED = 3;
00023 const MODE_NEW = 4;
00025 const MODE_CHANGED = 5;
00027 const MODE_DELETED = 6;
00029 const MODE_APPROVED = 7;
00031 const MODE_ALL = 8;
00037 const STATUS_NEW = 'NEW';
00039 const STATUS_CHANGED = 'CHANGED';
00041 const STATUS_DELETED = 'DELETED';
00043 const STATUS_APPROVED = 'APPROVED';
00049 const VERSION_DEV = 'DEV';
00051 const VERSION_LIVE = 'LIVE';
00052
00053
00054 private static $DBI = null;
00055 private static $LocalDBI = null;
00056 private static $CUR_USER = null;
00057
00065 public static function init() {
00066 $server = SConfig::getDefault('tsd.server');
00067 $user = SConfig::getDefault('tsd.user');
00068
00069 $dbhost = SConfig::getDefault("tsd.$server.dbhost");
00070 $dbname = SConfig::getDefault("tsd.$server.dbname");
00071 $dbuser = SConfig::getDefault("tsd.$server.$user.dbuser");
00072 $dbpass = SConfig::getDefault("tsd.$server.$user.dbpass");
00073
00074 self::$LocalDBI = new DBI($dbuser, $dbpass, $dbname, $dbhost);
00075 self::$DBI = SDR::getDBI();
00076 }
00077
00087 public static function checkInit() {
00088 if(self::$DBI == null) {
00089 self::init();
00090 }
00091
00092 return self::$DBI != null;
00093 }
00094
00102 public static function getDBI() {
00103 if(!self::checkInit())
00104 return null;
00105 else
00106 return self::$DBI;
00107 }
00108
00116 public static function getLocalDBI() {
00117 if(!self::checkInit())
00118 return null;
00119 else
00120 return self::$LocalDBI;
00121 }
00122
00136 public static function getAlignments($url, $mode = TSD::MODE_LIVE) {
00137 if(!ctype_digit((string) ltrim(rtrim($url)))) {
00138 $cserdId = SDRService::getCserdIdForUrl($url);
00139 if(!$cserdId)
00140 return null;
00141 }
00142 else
00143 $cserdId = $url;
00144
00145 $cserdId = (int)$cserdId;
00146
00147 $results = array('sections' => array(), 'objectives' => array(), 'words' => array());
00148
00149 $alignments = TSDText::getResourceAlignments($cserdId, $mode);
00150 if($alignments === null)
00151 return null;
00152 $results['sections'] = $alignments;
00153
00154 $alignments = TSDStandard::getResourceAlignments($cserdId, $mode);
00155 if($alignments === null)
00156 return null;
00157 $results['objectives'] = $alignments;
00158
00159 $alignments = TSDWord::getResourceAlignments($cserdId, $mode);
00160 if($alignments === null)
00161 return null;
00162 $results['words'] = $alignments;
00163
00164 return $results;
00165 }
00166
00175 private static function getCurrentUser() {
00176 if(self::$CUR_USER !== null)
00177 return self::$CUR_USER;
00178 if(!isset($GLOBALS['SWAT'])) {
00179 self::setStaticError('No SWAT object!');
00180 self::$CUR_USER = false;
00181 return false;
00182 }
00183 $guser = $GLOBALS['SWAT']->getGlobalUser();
00184 if(!$guser) {
00185 self::setStaticError('No global user!');
00186 self::$CUR_USER = false;
00187 return false;
00188 }
00189 $ldap = $guser->getAuthModule('ldap');
00190 if(!$ldap) {
00191 self::setStaticError('No LDAP authentication module!');
00192 self::$CUR_USER = false;
00193 return false;
00194 }
00195 self::$CUR_USER = $ldap->getUID();
00196 return self::$CUR_USER;
00197 }
00198
00210 public static function can($what, $uid = '') {
00211 $curUid = self::getCurrentUser();
00212 if($curUid === false)
00213 return null;
00214 if($uid == '' || !ctype_digit((string) $uid) || $uid <= 0)
00215 $uid = $curUid;
00216 if($what != 'edit' && $what != 'approve' && $what != 'align') {
00217 self::setStaticError('Invalid permission: ' . $what);
00218 return null;
00219 }
00220 $query = 'SELECT uid, p' . ucfirst($what) . ' FROM Permission WHERE uid = ' . $uid;
00221 $result = self::getLocalDBI()->query($query);
00222 if(count(self::getLocalDBI()->getError()) > 0) {
00223 self::setStaticError('Database error: ' . implode('; ', self::getLocalDBI()->getError()));
00224 return null;
00225 }
00226 if(count($result) == 0)
00227 return false;
00228 if($result[0]['p' . ucfirst($what)] == '1')
00229 return true;
00230 else
00231 return false;
00232 }
00233
00242 public static function setPermission($uid, $which, $how) {
00243 if(!self::can('approve')) {
00244 self::setStaticError('You do not have permission to set permissions');
00245 return false;
00246 }
00247 if($which != 'approve' && $which != 'edit' && $which != 'align') {
00248 self::setStaticError('Invalid permission: ' . $which);
00249 return false;
00250 }
00251
00252 self::getLocalDBI()->query('START TRANSACTION');
00253
00254 $query = 'INSERT INTO Permission SET uid = ' . $uid . ', p' . ucfirst($which) . ' = ' . ($how ? '1' : '0')
00255 . ' ON DUPLICATE KEY UPDATE p'. ucfirst($which) . ' = ' . ($how ? '1' : '0');
00256 self::getLocalDBI()->query($query);
00257 if(count(self::getLocalDBI()->getError()) > 0) {
00258 self::setStaticError('Database error: ' . implode('; ', self::getLocalDBI()->getError()));
00259 self::getLocalDBI()->clearErrors();
00260 self::getLocalDBI()->query('ROLLBACK');
00261 return false;
00262 }
00263
00264 if($which == 'edit') {
00265 SConfig::setDefault('snap2.user', 'admin');
00266 $dir = SnapDirectory::lookup(SConfig::getDefault('tsd.snapPath'));
00267 $perm = $dir->getPermission();
00268 $uinfo = Snap2::getLDAP()->getUserInfo($uid);
00269 if($how) {
00270 $perm->setUserAccess('CreateResource', SnapPermission::CAP_ALLOW, $uid);
00271 $perm->setUserAccess('CreateVersion', SnapPermission::CAP_ALLOW, $uid);
00272 $perm->setUserAccess('UpdateVersion', SnapPermission::CAP_ALLOW, $uid);
00273 $perm->setUserAccess('SubmitVersion', SnapPermission::CAP_ALLOW, $uid);
00274 $perm->setUserAccess('ApproveVersionDev', SnapPermission::CAP_ALLOW, $uid);
00275 }
00276 else
00277 $perm->revokeUser($uid);
00278 if(!$perm->commit()) {
00279 self::getLocalDBI()->query('ROLLBACK');
00280 return false;
00281 }
00282 }
00283
00284 $query = 'DELETE FROM Permission WHERE pEdit = 0 AND pAlign = 0 AND pApprove = 0';
00285 self::getLocalDBI()->query($query);
00286 if(count(self::getLocalDBI()->getError()) > 0) {
00287 self::setStaticError('Database error: ' . implode('; ', self::getLocalDBI()->getError()));
00288 self::getLocalDBI()->clearErrors();
00289 self::getLocalDBI()->query('ROLLBACK');
00290 return false;
00291 }
00292
00293 self::getLocalDBI()->query('COMMIT');
00294
00295 return true;
00296 }
00297
00306 public static function getParties() {
00307 $query = 'SELECT uid FROM Permission';
00308 $result = self::getLocalDBI()->query($query);
00309 if(count(self::getLocalDBI()->getError()) > 0) {
00310 self::setStaticError('Database error: ' . implode('; ', self::getLocalDBI()->getError()));
00311 return null;
00312 }
00313 $parties = array();
00314 foreach($result as $r)
00315 $parties[] = $r['uid'];
00316 return $parties;
00317 }
00318
00328 public static function stringToMode($modeString) {
00329 switch(strtolower($modeString)) {
00330 case 'live': return TSD::MODE_LIVE;
00331 case 'dev': return TSD::MODE_DEV;
00332 case 'devactive': return TSD::MODE_DEV_ACTIVE;
00333 case 'devunapproved': return TSD::MODE_DEV_UNAPPROVED;
00334 case 'new': return TSD::MODE_NEW;
00335 case 'changed': return TSD::MODE_CHANGED;
00336 case 'deleted': return TSD::MODE_DELETED;
00337 case 'approved': return TSD::MODE_APPROVED;
00338 case 'all': return TSD::MODE_ALL;
00339 }
00340 return TSD::MODE_LIVE;
00341 }
00342
00352 public static function log($description, $query) {
00353 $user = self::getCurrentUser();
00354 $description = mysql_escape_string($description);
00355 $query = mysql_escape_string($query);
00356 self::getDBI()->query("INSERT INTO TSDLog SET uid = '$user', description = '$description', query = '$query'");
00357 }
00358 }
00359
00360 ?>