Professor Lucien van der Walt

 

 window.location.href = "'.$uri.'";'; exit; } } //====================================================================================================================== # CONSTANTS $dir = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH); define('SITE_ROOT', $_SERVER['HTTP_HOST'].'/terminalfour/sample-site/'); define('IS_LOGIN_PAGE',($dir == '/app.ru.ac.za/login/' || $dir == '/app.ru.ac.za/login/index.php')); define('IS_NOACCESS_PAGE',($dir == '/app.ru.ac.za/noaccess/' || $dir == '/app.ru.ac.za/noaccess/index.php')); #------------------------------------------------------------------ # clears the session and redirects to the root if there's a ?logout in the URL #------------------------------------------------------------------ function tryLogout(){ if(isset($_SESSION["userID"]) && isset($_REQUEST['logout'])){ session_unset(); header("Location: http://" . SITE_ROOT); exit; } } #------------------------------------------------------------------ # redirect to the login page if not logged in #------------------------------------------------------------------ function redirectNonLogged(){ if (!IS_LOGIN_PAGE && !isset($_SESSION['userID'])){ if(!IS_NOACCESS_PAGE){ $_SESSION['requestedURI'] = $_SERVER["REQUEST_URI"]; } header("Location: http://" . SITE_ROOT . "app.ru.ac.za/login/"); } } #------------------------------------------------------------------ # check to see if the user has rights to see the page #------------------------------------------------------------------ function userHasAccess(){ $hasAccess = false; if(defined('T4_ACCESS_GROUPS')){ if($arrGroups = preg_split('/\,/', T4_ACCESS_GROUPS, -1, PREG_SPLIT_NO_EMPTY)){ if(!is_array($arrGroups)){ $arrGroups = array($arrGroups); } $hasAccess = (is_array($_SESSION['user_groups']) && array_intersect($_SESSION['user_groups'], $arrGroups)); }else{ $hasAccess = true; // no required groups, allow } }else{ $hasAccess = true; // no required groups, allow } return $hasAccess; } //=================================================================================================================== ############################################## CLASSES ############################################################ //======================================== ZEND JSON ============================================ //------------------------------------------------------------------------------------------- //require_once 'Zend/Json/Expr.php' //------------------------------------------------------------------------------------------- class Zend_Json_Expr { /** * Storage for javascript expression. * * @var string */ protected $_expression; /** * Constructor * * @param string $expression the expression to hold. * @return void */ public function __construct($expression) { $this->_expression = (string) $expression; } /** * Cast to string * * @return string holded javascript expression. */ public function __toString() { return $this->_expression; } } //------------------------------------------------------------------------------------------- //require_once 'Zend/Json/Exception.php' //------------------------------------------------------------------------------------------- class Zend_Exception extends Exception { /** * @var null|Exception */ private $_previous = null; /** * Construct the exception * * @param string $msg * @param int $code * @param Exception $previous * @return void */ public function __construct($msg = '', $code = 0, Exception $previous = null) { if (version_compare(PHP_VERSION, '5.3.0', '<')) { parent::__construct($msg, (int) $code); $this->_previous = $previous; } else { parent::__construct($msg, (int) $code, $previous); } } /** * Overloading * * For PHP < 5.3.0, provides access to the getPrevious() method. * * @param string $method * @param array $args * @return mixed */ public function __call($method, array $args) { if ('getprevious' == strtolower($method)) { return $this->_getPrevious(); } return null; } /** * String representation of the exception * * @return string */ public function __toString() { if (version_compare(PHP_VERSION, '5.3.0', '<')) { if (null !== ($e = $this->getPrevious())) { return $e->__toString() . "\n\nNext " . parent::__toString(); } } return parent::__toString(); } /** * Returns previous Exception * * @return Exception|null */ protected function _getPrevious() { return $this->_previous; } } //------------------------------------------------------------------------------------------- //require_once 'Json/Decoder.php' //------------------------------------------------------------------------------------------- /** * Decode JSON encoded string to PHP variable constructs * * @category Zend * @package Zend_Json * @copyright Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class Zend_Json_Decoder { /** * Parse tokens used to decode the JSON object. These are not * for public consumption, they are just used internally to the * class. */ const EOF = 0; const DATUM = 1; const LBRACE = 2; const LBRACKET = 3; const RBRACE = 4; const RBRACKET = 5; const COMMA = 6; const COLON = 7; /** * Use to maintain a "pointer" to the source being decoded * * @var string */ protected $_source; /** * Caches the source length * * @var int */ protected $_sourceLength; /** * The offset within the souce being decoded * * @var int * */ protected $_offset; /** * The current token being considered in the parser cycle * * @var int */ protected $_token; /** * Flag indicating how objects should be decoded * * @var int * @access protected */ protected $_decodeType; /** * Constructor * * @param string $source String source to decode * @param int $decodeType How objects should be decoded -- see * {@link Zend_Json::TYPE_ARRAY} and {@link Zend_Json::TYPE_OBJECT} for * valid values * @return void */ protected function __construct($source, $decodeType) { // Set defaults $this->_source = self::decodeUnicodeString($source); $this->_sourceLength = strlen($this->_source); $this->_token = self::EOF; $this->_offset = 0; // Normalize and set $decodeType if (!in_array($decodeType, array(Zend_Json::TYPE_ARRAY, Zend_Json::TYPE_OBJECT))) { $decodeType = Zend_Json::TYPE_ARRAY; } $this->_decodeType = $decodeType; // Set pointer at first token $this->_getNextToken(); } public static function decode($source = null, $objectDecodeType = Zend_Json::TYPE_ARRAY) { if (null === $source) { throw new Zend_Json_Exception('Must specify JSON encoded source for decoding'); } elseif (!is_string($source)) { throw new Zend_Json_Exception('Can only decode JSON encoded strings'); } $decoder = new self($source, $objectDecodeType); return $decoder->_decodeValue(); } /** * Recursive driving rountine for supported toplevel tops * * @return mixed */ protected function _decodeValue() { switch ($this->_token) { case self::DATUM: $result = $this->_tokenValue; $this->_getNextToken(); return($result); break; case self::LBRACE: return($this->_decodeObject()); break; case self::LBRACKET: return($this->_decodeArray()); break; default: return null; break; } } protected function _decodeObject() { $members = array(); $tok = $this->_getNextToken(); while ($tok && $tok != self::RBRACE) { if ($tok != self::DATUM || ! is_string($this->_tokenValue)) { throw new Zend_Json_Exception('Missing key in object encoding: ' . $this->_source); } $key = $this->_tokenValue; $tok = $this->_getNextToken(); if ($tok != self::COLON) { throw new Zend_Json_Exception('Missing ":" in object encoding: ' . $this->_source); } $tok = $this->_getNextToken(); $members[$key] = $this->_decodeValue(); $tok = $this->_token; if ($tok == self::RBRACE) { break; } if ($tok != self::COMMA) { throw new Zend_Json_Exception('Missing "," in object encoding: ' . $this->_source); } $tok = $this->_getNextToken(); } switch ($this->_decodeType) { case Zend_Json::TYPE_OBJECT: // Create new StdClass and populate with $members $result = new StdClass(); foreach ($members as $key => $value) { $result->$key = $value; } break; case Zend_Json::TYPE_ARRAY: default: $result = $members; break; } $this->_getNextToken(); return $result; } /** * Decodes a JSON array format: * [element, element2,...,elementN] * * @return array */ protected function _decodeArray() { $result = array(); $starttok = $tok = $this->_getNextToken(); // Move past the '[' $index = 0; while ($tok && $tok != self::RBRACKET) { $result[$index++] = $this->_decodeValue(); $tok = $this->_token; if ($tok == self::RBRACKET || !$tok) { break; } if ($tok != self::COMMA) { throw new Zend_Json_Exception('Missing "," in array encoding: ' . $this->_source); } $tok = $this->_getNextToken(); } $this->_getNextToken(); return($result); } /** * Removes whitepsace characters from the source input */ protected function _eatWhitespace() { if (preg_match( '/([\t\b\f\n\r ])*/s', $this->_source, $matches, PREG_OFFSET_CAPTURE, $this->_offset) && $matches[0][1] == $this->_offset) { $this->_offset += strlen($matches[0][0]); } } /** * Retrieves the next token from the source stream * * @return int Token constant value specified in class definition */ protected function _getNextToken() { $this->_token = self::EOF; $this->_tokenValue = null; $this->_eatWhitespace(); if ($this->_offset >= $this->_sourceLength) { return(self::EOF); } $str = $this->_source; $str_length = $this->_sourceLength; $i = $this->_offset; $start = $i; switch ($str{$i}) { case '{': $this->_token = self::LBRACE; break; case '}': $this->_token = self::RBRACE; break; case '[': $this->_token = self::LBRACKET; break; case ']': $this->_token = self::RBRACKET; break; case ',': $this->_token = self::COMMA; break; case ':': $this->_token = self::COLON; break; case '"': $result = ''; do { $i++; if ($i >= $str_length) { break; } $chr = $str{$i}; if ($chr == '\\') { $i++; if ($i >= $str_length) { break; } $chr = $str{$i}; switch ($chr) { case '"' : $result .= '"'; break; case '\\': $result .= '\\'; break; case '/' : $result .= '/'; break; case 'b' : $result .= "\x08"; break; case 'f' : $result .= "\x0c"; break; case 'n' : $result .= "\x0a"; break; case 'r' : $result .= "\x0d"; break; case 't' : $result .= "\x09"; break; case '\'' : $result .= '\''; break; default: throw new Zend_Json_Exception("Illegal escape " . "sequence '" . $chr . "'"); } } elseif($chr == '"') { break; } else { $result .= $chr; } } while ($i < $str_length); $this->_token = self::DATUM; //$this->_tokenValue = substr($str, $start + 1, $i - $start - 1); $this->_tokenValue = $result; break; case 't': if (($i+ 3) < $str_length && substr($str, $start, 4) == "true") { $this->_token = self::DATUM; } $this->_tokenValue = true; $i += 3; break; case 'f': if (($i+ 4) < $str_length && substr($str, $start, 5) == "false") { $this->_token = self::DATUM; } $this->_tokenValue = false; $i += 4; break; case 'n': if (($i+ 3) < $str_length && substr($str, $start, 4) == "null") { $this->_token = self::DATUM; } $this->_tokenValue = NULL; $i += 3; break; } if ($this->_token != self::EOF) { $this->_offset = $i + 1; // Consume the last token character return($this->_token); } $chr = $str{$i}; if ($chr == '-' || $chr == '.' || ($chr >= '0' && $chr <= '9')) { if (preg_match('/-?([0-9])*(\.[0-9]*)?((e|E)((-|\+)?)[0-9]+)?/s', $str, $matches, PREG_OFFSET_CAPTURE, $start) && $matches[0][1] == $start) { $datum = $matches[0][0]; if (is_numeric($datum)) { if (preg_match('/^0\d+$/', $datum)) { throw new Zend_Json_Exception("Octal notation not supported by JSON (value: $datum)"); } else { $val = intval($datum); $fVal = floatval($datum); $this->_tokenValue = ($val == $fVal ? $val : $fVal); } } else { throw new Zend_Json_Exception("Illegal number format: $datum"); } $this->_token = self::DATUM; $this->_offset = $start + strlen($datum); } } else { throw new Zend_Json_Exception('Illegal Token'); } return($this->_token); } /** * Decode Unicode Characters from \u0000 ASCII syntax. * * This algorithm was originally developed for the * Solar Framework by Paul M. Jones * * @link http://solarphp.com/ * @link http://svn.solarphp.com/core/trunk/Solar/Json.php * @param string $value * @return string */ public static function decodeUnicodeString($chrs) { $delim = substr($chrs, 0, 1); $utf8 = ''; $strlen_chrs = strlen($chrs); for($i = 0; $i < $strlen_chrs; $i++) { $substr_chrs_c_2 = substr($chrs, $i, 2); $ord_chrs_c = ord($chrs[$i]); switch (true) { case preg_match('/\\\u[0-9A-F]{4}/i', substr($chrs, $i, 6)): // single, escaped unicode character $utf16 = chr(hexdec(substr($chrs, ($i + 2), 2))) . chr(hexdec(substr($chrs, ($i + 4), 2))); $utf8 .= self::_utf162utf8($utf16); $i += 5; break; case ($ord_chrs_c >= 0x20) && ($ord_chrs_c <= 0x7F): $utf8 .= $chrs{$i}; break; case ($ord_chrs_c & 0xE0) == 0xC0: // characters U-00000080 - U-000007FF, mask 110XXXXX //see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= substr($chrs, $i, 2); ++$i; break; case ($ord_chrs_c & 0xF0) == 0xE0: // characters U-00000800 - U-0000FFFF, mask 1110XXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= substr($chrs, $i, 3); $i += 2; break; case ($ord_chrs_c & 0xF8) == 0xF0: // characters U-00010000 - U-001FFFFF, mask 11110XXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= substr($chrs, $i, 4); $i += 3; break; case ($ord_chrs_c & 0xFC) == 0xF8: // characters U-00200000 - U-03FFFFFF, mask 111110XX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= substr($chrs, $i, 5); $i += 4; break; case ($ord_chrs_c & 0xFE) == 0xFC: // characters U-04000000 - U-7FFFFFFF, mask 1111110X // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $utf8 .= substr($chrs, $i, 6); $i += 5; break; } } return $utf8; } protected static function _utf162utf8($utf16) { // Check for mb extension otherwise do by hand. if( function_exists('mb_convert_encoding') ) { return mb_convert_encoding($utf16, 'UTF-8', 'UTF-16'); } $bytes = (ord($utf16{0}) << 8) | ord($utf16{1}); switch (true) { case ((0x7F & $bytes) == $bytes): // this case should never be reached, because we are in ASCII range // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0x7F & $bytes); case (0x07FF & $bytes) == $bytes: // return a 2-byte UTF-8 character // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0xC0 | (($bytes >> 6) & 0x1F)) . chr(0x80 | ($bytes & 0x3F)); case (0xFFFF & $bytes) == $bytes: // return a 3-byte UTF-8 character // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0xE0 | (($bytes >> 12) & 0x0F)) . chr(0x80 | (($bytes >> 6) & 0x3F)) . chr(0x80 | ($bytes & 0x3F)); } // ignoring UTF-32 for now, sorry return ''; } } //------------------------------------------------------------------------------------------- //require_once "Zend/Json/Encoder.php" //------------------------------------------------------------------------------------------- class Zend_Json_Encoder { /** * Whether or not to check for possible cycling * * @var boolean */ protected $_cycleCheck; /** * Additional options used during encoding * * @var array */ protected $_options = array(); /** * Array of visited objects; used to prevent cycling. * * @var array */ protected $_visited = array(); /** * Constructor * * @param boolean $cycleCheck Whether or not to check for recursion when encoding * @param array $options Additional options used during encoding * @return void */ protected function __construct($cycleCheck = false, $options = array()) { $this->_cycleCheck = $cycleCheck; $this->_options = $options; } public static function encode($value, $cycleCheck = false, $options = array()) { $encoder = new self(($cycleCheck) ? true : false, $options); return $encoder->_encodeValue($value); } protected function _encodeValue(&$value) { if (is_object($value)) { return $this->_encodeObject($value); } else if (is_array($value)) { return $this->_encodeArray($value); } return $this->_encodeDatum($value); } protected function _encodeObject(&$value) { if ($this->_cycleCheck) { if ($this->_wasVisited($value)) { if (isset($this->_options['silenceCyclicalExceptions']) && $this->_options['silenceCyclicalExceptions']===true) { return '"* RECURSION (' . get_class($value) . ') *"'; } else { throw new Zend_Json_Exception( 'Cycles not supported in JSON encoding, cycle introduced by ' . 'class "' . get_class($value) . '"' ); } } $this->_visited[] = $value; } $props = ''; if ($value instanceof Iterator) { $propCollection = $value; } else { $propCollection = get_object_vars($value); } foreach ($propCollection as $name => $propValue) { if (isset($propValue)) { $props .= ',' . $this->_encodeString($name) . ':' . $this->_encodeValue($propValue); } } return '{"__className":"' . get_class($value) . '"' . $props . '}'; } /** * Determine if an object has been serialized already * * @param mixed $value * @return boolean */ protected function _wasVisited(&$value) { if (in_array($value, $this->_visited, true)) { return true; } return false; } protected function _encodeArray(&$array) { $tmpArray = array(); // Check for associative array if (!empty($array) && (array_keys($array) !== range(0, count($array) - 1))) { // Associative array $result = '{'; foreach ($array as $key => $value) { $key = (string) $key; $tmpArray[] = $this->_encodeString($key) . ':' . $this->_encodeValue($value); } $result .= implode(',', $tmpArray); $result .= '}'; } else { // Indexed array $result = '['; $length = count($array); for ($i = 0; $i < $length; $i++) { $tmpArray[] = $this->_encodeValue($array[$i]); } $result .= implode(',', $tmpArray); $result .= ']'; } return $result; } protected function _encodeDatum(&$value) { $result = 'null'; if (is_int($value) || is_float($value)) { $result = (string) $value; $result = str_replace(",", ".", $result); } elseif (is_string($value)) { $result = $this->_encodeString($value); } elseif (is_bool($value)) { $result = $value ? 'true' : 'false'; } return $result; } protected function _encodeString(&$string) { // Escape these characters with a backslash: // " \ / \n \r \t \b \f $search = array('\\', "\n", "\t", "\r", "\b", "\f", '"', '/'); $replace = array('\\\\', '\\n', '\\t', '\\r', '\\b', '\\f', '\"', '\\/'); $string = str_replace($search, $replace, $string); // Escape certain ASCII characters: // 0x08 => \b // 0x0c => \f $string = str_replace(array(chr(0x08), chr(0x0C)), array('\b', '\f'), $string); $string = self::encodeUnicodeString($string); return '"' . $string . '"'; } private static function _encodeConstants(ReflectionClass $cls) { $result = "constants : {"; $constants = $cls->getConstants(); $tmpArray = array(); if (!empty($constants)) { foreach ($constants as $key => $value) { $tmpArray[] = "$key: " . self::encode($value); } $result .= implode(', ', $tmpArray); } return $result . "}"; } private static function _encodeMethods(ReflectionClass $cls) { $methods = $cls->getMethods(); $result = 'methods:{'; $started = false; foreach ($methods as $method) { if (! $method->isPublic() || !$method->isUserDefined()) { continue; } if ($started) { $result .= ','; } $started = true; $result .= '' . $method->getName(). ':function('; if ('__construct' != $method->getName()) { $parameters = $method->getParameters(); $paramCount = count($parameters); $argsStarted = false; $argNames = "var argNames=["; foreach ($parameters as $param) { if ($argsStarted) { $result .= ','; } $result .= $param->getName(); if ($argsStarted) { $argNames .= ','; } $argNames .= '"' . $param->getName() . '"'; $argsStarted = true; } $argNames .= "];"; $result .= "){" . $argNames . 'var result = ZAjaxEngine.invokeRemoteMethod(' . "this, '" . $method->getName() . "',argNames,arguments);" . 'return(result);}'; } else { $result .= "){}"; } } return $result . "}"; } private static function _encodeVariables(ReflectionClass $cls) { $properties = $cls->getProperties(); $propValues = get_class_vars($cls->getName()); $result = "variables:{"; $cnt = 0; $tmpArray = array(); foreach ($properties as $prop) { if (! $prop->isPublic()) { continue; } $tmpArray[] = $prop->getName() . ':' . self::encode($propValues[$prop->getName()]); } $result .= implode(',', $tmpArray); return $result . "}"; } public static function encodeClass($className, $package = '') { $cls = new ReflectionClass($className); if (! $cls->isInstantiable()) { throw new Zend_Json_Exception("$className must be instantiable"); } return "Class.create('$package$className',{" . self::_encodeConstants($cls) ."," . self::_encodeMethods($cls) ."," . self::_encodeVariables($cls) .'});'; } public static function encodeClasses(array $classNames, $package = '') { $result = ''; foreach ($classNames as $className) { $result .= self::encodeClass($className, $package); } return $result; } public static function encodeUnicodeString($value) { $strlen_var = strlen($value); $ascii = ""; /** * Iterate over every character in the string, * escaping with a slash or encoding to UTF-8 where necessary */ for($i = 0; $i < $strlen_var; $i++) { $ord_var_c = ord($value[$i]); switch (true) { case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): // characters U-00000000 - U-0000007F (same as ASCII) $ascii .= $value[$i]; break; case (($ord_var_c & 0xE0) == 0xC0): // characters U-00000080 - U-000007FF, mask 110XXXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($value[$i + 1])); $i += 1; $utf16 = self::_utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xF0) == 0xE0): // characters U-00000800 - U-0000FFFF, mask 1110XXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($value[$i + 1]), ord($value[$i + 2])); $i += 2; $utf16 = self::_utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xF8) == 0xF0): // characters U-00010000 - U-001FFFFF, mask 11110XXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($value[$i + 1]), ord($value[$i + 2]), ord($value[$i + 3])); $i += 3; $utf16 = self::_utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xFC) == 0xF8): // characters U-00200000 - U-03FFFFFF, mask 111110XX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($value[$i + 1]), ord($value[$i + 2]), ord($value[$i + 3]), ord($value[$i + 4])); $i += 4; $utf16 = self::_utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; case (($ord_var_c & 0xFE) == 0xFC): // characters U-04000000 - U-7FFFFFFF, mask 1111110X // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $char = pack('C*', $ord_var_c, ord($value[$i + 1]), ord($value[$i + 2]), ord($value[$i + 3]), ord($value[$i + 4]), ord($value[$i + 5])); $i += 5; $utf16 = self::_utf82utf16($char); $ascii .= sprintf('\u%04s', bin2hex($utf16)); break; } } return $ascii; } protected static function _utf82utf16($utf8) { // Check for mb extension otherwise do by hand. if( function_exists('mb_convert_encoding') ) { return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); } switch (strlen($utf8)) { case 1: // this case should never be reached, because we are in ASCII range // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return $utf8; case 2: // return a UTF-16 character from a 2-byte UTF-8 char // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr(0x07 & (ord($utf8{0}) >> 2)) . chr((0xC0 & (ord($utf8{0}) << 6)) | (0x3F & ord($utf8{1}))); case 3: // return a UTF-16 character from a 3-byte UTF-8 char // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 return chr((0xF0 & (ord($utf8{0}) << 4)) | (0x0F & (ord($utf8{1}) >> 2))) . chr((0xC0 & (ord($utf8{1}) << 6)) | (0x7F & ord($utf8{2}))); } // ignoring UTF-32 for now, sorry return ''; } } //------------------------------------------------------------------------------------------- //include 'Zend/Json.php' class Zend_Json { const TYPE_ARRAY = 1; const TYPE_OBJECT = 0; public static $maxRecursionDepthAllowed=25; public static $useBuiltinEncoderDecoder = false; public static function decode($encodedValue, $objectDecodeType = Zend_Json::TYPE_ARRAY) { $encodedValue = (string) $encodedValue; if (function_exists('json_decode') && self::$useBuiltinEncoderDecoder !== true) { $decode = json_decode($encodedValue, $objectDecodeType); // php < 5.3 if (!function_exists('json_last_error')) { if ($decode === $encodedValue) { throw new Zend_Json_Exception('Decoding failed'); } // php >= 5.3 } elseif (($jsonLastErr = json_last_error()) != JSON_ERROR_NONE) { switch ($jsonLastErr) { case JSON_ERROR_DEPTH: throw new Zend_Json_Exception('Decoding failed: Maximum stack depth exceeded'); case JSON_ERROR_CTRL_CHAR: throw new Zend_Json_Exception('Decoding failed: Unexpected control character found'); case JSON_ERROR_SYNTAX: throw new Zend_Json_Exception('Decoding failed: Syntax error'); default: throw new Zend_Json_Exception('Decoding failed'); } } return $decode; } return Zend_Json_Decoder::decode($encodedValue, $objectDecodeType); } public static function encode($valueToEncode, $cycleCheck = false, $options = array()) { if (is_object($valueToEncode) && method_exists($valueToEncode, 'toJson')) { return $valueToEncode->toJson(); } // Pre-encoding look for Zend_Json_Expr objects and replacing by tmp ids $javascriptExpressions = array(); if(isset($options['enableJsonExprFinder']) && ($options['enableJsonExprFinder'] == true) ) { $valueToEncode = self::_recursiveJsonExprFinder($valueToEncode, $javascriptExpressions); } // Encoding if (function_exists('json_encode') && self::$useBuiltinEncoderDecoder !== true) { $encodedResult = json_encode($valueToEncode); } else { $encodedResult = Zend_Json_Encoder::encode($valueToEncode, $cycleCheck, $options); } //only do post-proccessing to revert back the Zend_Json_Expr if any. if (count($javascriptExpressions) > 0) { $count = count($javascriptExpressions); for($i = 0; $i < $count; $i++) { $magicKey = $javascriptExpressions[$i]['magicKey']; $value = $javascriptExpressions[$i]['value']; $encodedResult = str_replace( //instead of replacing "key:magicKey", we replace directly magicKey by value because "key" never changes. '"' . $magicKey . '"', $value, $encodedResult ); } } return $encodedResult; } protected static function _recursiveJsonExprFinder( &$value, array &$javascriptExpressions, $currentKey = null ) { if ($value instanceof Zend_Json_Expr) { // TODO: Optimize with ascii keys, if performance is bad $magicKey = "____" . $currentKey . "_" . (count($javascriptExpressions)); $javascriptExpressions[] = array( //if currentKey is integer, encodeUnicodeString call is not required. "magicKey" => (is_int($currentKey)) ? $magicKey : Zend_Json_Encoder::encodeUnicodeString($magicKey), "value" => $value->__toString(), ); $value = $magicKey; } elseif (is_array($value)) { foreach ($value as $k => $v) { $value[$k] = self::_recursiveJsonExprFinder($value[$k], $javascriptExpressions, $k); } } elseif (is_object($value)) { foreach ($value as $k => $v) { $value->$k = self::_recursiveJsonExprFinder($value->$k, $javascriptExpressions, $k); } } return $value; } public static function fromXml ($xmlStringContents, $ignoreXmlAttributes=true) { // Load the XML formatted string into a Simple XML Element object. $simpleXmlElementObject = simplexml_load_string($xmlStringContents); // If it is not a valid XML content, throw an exception. if ($simpleXmlElementObject == null) { throw new Zend_Json_Exception('Function fromXml was called with an invalid XML formatted string.'); } // End of if ($simpleXmlElementObject == null) $resultArray = null; // Call the recursive function to convert the XML into a PHP array. $resultArray = self::_processXml($simpleXmlElementObject, $ignoreXmlAttributes); // Convert the PHP array to JSON using Zend_Json encode method. // It is just that simple. $jsonStringOutput = self::encode($resultArray); return($jsonStringOutput); } // End of function fromXml. protected static function _processXml ($simpleXmlElementObject, $ignoreXmlAttributes, $recursionDepth=0) { // Keep an eye on how deeply we are involved in recursion. if ($recursionDepth > self::$maxRecursionDepthAllowed) { // XML tree is too deep. Exit now by throwing an exception. throw new Zend_Json_Exception( "Function _processXml exceeded the allowed recursion depth of " . self::$maxRecursionDepthAllowed); } // End of if ($recursionDepth > self::$maxRecursionDepthAllowed) if ($recursionDepth == 0) { // Store the original SimpleXmlElementObject sent by the caller. // We will need it at the very end when we return from here for good. $callerProvidedSimpleXmlElementObject = $simpleXmlElementObject; } // End of if ($recursionDepth == 0) if ($simpleXmlElementObject instanceof SimpleXMLElement) { // Get a copy of the simpleXmlElementObject $copyOfSimpleXmlElementObject = $simpleXmlElementObject; // Get the object variables in the SimpleXmlElement object for us to iterate. $simpleXmlElementObject = get_object_vars($simpleXmlElementObject); } // End of if (get_class($simpleXmlElementObject) == "SimpleXMLElement") // It needs to be an array of object variables. if (is_array($simpleXmlElementObject)) { // Initialize a result array. $resultArray = array(); // Is the input array size 0? Then, we reached the rare CDATA text if any. if (count($simpleXmlElementObject) <= 0) { // Let us return the lonely CDATA. It could even be // an empty element or just filled with whitespaces. return (trim(strval($copyOfSimpleXmlElementObject))); } // End of if (count($simpleXmlElementObject) <= 0) // Let us walk through the child elements now. foreach($simpleXmlElementObject as $key=>$value) { // Check if we need to ignore the XML attributes. // If yes, you can skip processing the XML attributes. // Otherwise, add the XML attributes to the result array. if(($ignoreXmlAttributes == true) && (is_string($key)) && ($key == "@attributes")) { continue; } // End of if(($ignoreXmlAttributes == true) && ($key == "@attributes")) // Let us recursively process the current XML element we just visited. // Increase the recursion depth by one. $recursionDepth++; $resultArray[$key] = self::_processXml ($value, $ignoreXmlAttributes, $recursionDepth); // Decrease the recursion depth by one. $recursionDepth--; } // End of foreach($simpleXmlElementObject as $key=>$value) { if ($recursionDepth == 0) { // That is it. We are heading to the exit now. // Set the XML root element name as the root [top-level] key of // the associative array that we are going to return to the original // caller of this recursive function. $tempArray = $resultArray; $resultArray = array(); $resultArray[$callerProvidedSimpleXmlElementObject->getName()] = $tempArray; } // End of if ($recursionDepth == 0) return($resultArray); } else { // We are now looking at either the XML attribute text or // the text between the XML tags. // In order to allow Zend_Json_Expr from xml, we check if the node // matchs the pattern that try to detect if it is a new Zend_Json_Expr // if it matches, we return a new Zend_Json_Expr instead of a text node $pattern = '/^[\s]*new Zend_Json_Expr[\s]*\([\s]*[\"\']{1}(.*)[\"\']{1}[\s]*\)[\s]*$/'; $matchings = array(); $match = preg_match ($pattern, $simpleXmlElementObject, $matchings); if ($match) { return new Zend_Json_Expr($matchings[1]); } else { return (trim(strval($simpleXmlElementObject))); } } // End of if (is_array($simpleXmlElementObject)) } // End of function _processXml. public static function prettyPrint($json, $options = array()) { $tokens = preg_split('|([\{\}\]\[,])|', $json, -1, PREG_SPLIT_DELIM_CAPTURE); $result = ""; $indent = 0; $ind = "\t"; if(isset($options['indent'])) { $ind = $options['indent']; } foreach($tokens as $token) { if($token == "") continue; $prefix = str_repeat($ind, $indent); if($token == "{" || $token == "[") { $indent++; if($result != "" && $result[strlen($result)-1] == "\n") { $result .= $prefix; } $result .= "$token\n"; } else if($token == "}" || $token == "]") { $indent--; $prefix = str_repeat($ind, $indent); $result .= "\n$prefix$token"; } else if($token == ",") { $result .= "$token\n"; } else { $result .= $prefix.$token; } } return $result; } } //############################################################################################### //==================================== END - ZEND JSON ========================================== //############################################################################################### class SampleLogin { /** * @var settings array */ protected $settings; protected $curl; protected $ZendJSON; protected $searchCurl; protected $failedWSCall = false; // set to true if web service call fails. Used in getLoginForm to determine the error message protected $hasAdminSession = false; //======================================================================================================================= // //======================================================================================================================= public function __construct(){ // settings $this->settings['ws_user'] = 't4wsuser'; $this->settings['ws_password'] = 'road13WaW!EviTe'; $this->settings['ws_path'] = '/terminalfour/services/'; $this->settings['ws_host'] = 'terminalfour.ru.ac.za:8080'; $this->curl = curl_init(); curl_setopt($this->curl, CURLOPT_HTTPHEADER, Array("Content-Type: application/json", 'Connection: Keep-Alive', 'Keep-Alive: 300')); curl_setopt($this->curl, CURLOPT_POST, true); curl_setopt($this->curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($this->curl, CURLOPT_COOKIEFILE, "cookies.txt"); curl_setopt($this->curl, CURLOPT_COOKIEJAR, "cookies.txt"); $this->ZendJSON = class_exists('Zend_Json'); } //======================================================================================================================= public function __destruct(){ if($this->curl) curl_close($this->curl); if($this->searchCurl) curl_close($this->searchCurl); } //======================================================================================================================= // @description helper // @return html-escaped string from the POST or '' //======================================================================================================================= public function getPost($key){ return isset($_POST[$key]) ? htmlentities($_POST[$key]) : ''; } //======================================================================================================================= // @description helper // @return html-escaped string from the REQUEST or '' //======================================================================================================================= public function getRequest($key){ return isset($_REQUEST[$key]) ? htmlentities($_REQUEST[$key]) : ''; } //====================================================================================================================== // login form //====================================================================================================================== public function getLoginForm($isInvalid = false){ $html = ''; if($isInvalid){ $_SESSION['failedLogin'] = isset($_SESSION['failedLogin']) ? ($_SESSION['failedLogin']+1) : 1; if($this->failedWSCall){ $html.='Connect is currently undergoing maintenance, please try again later
'; }else{ $html.='Invalid username and/or password.
'; } } $html.= '

Welcome to Connect, our global intranet.

Username
Password

Can\'t login? Contact support@gg.specsavers.com
Reset your password

'; return $html; } //===================================================================================================================== // show the login form when unsuccessful, redirect successfull // @param boolean $successful the result from the login attempt //===================================================================================================================== public function showNext($successful){ if(!$successful){ //echo $this->getLoginForm(true); $_SESSION['failedLogin']=1; return; } unset($_SESSION['failedLogin']); if(isset($_SESSION['requestedURI'])){ redirect($_SESSION['requestedURI']); }else{ redirect('http://'.SITE_ROOT.'departments/'); } } /**======================================================================================================================= * *=======================================================================================================================*/ public function log($msg, $file='ws_log.txt'){ // todo: fix logging. I probably shouldn't just have removed it } //======================================================================================================================= // web service master method //======================================================================================================================= protected function wsCall($data, $func){ curl_setopt($this->curl, CURLOPT_URL ,"http://".$this->settings['ws_host'].$this->settings["ws_path"].$func); curl_setopt($this->curl, CURLOPT_POSTFIELDS, $data); $output = curl_exec($this->curl); //$this->log("[".date('d.m.Y H:i:s')."] Service: ".$func."\n".$data."\n".$output."\n========================================================"); return $output; } //======================================================================================================================= // web service call: authentication/logout //======================================================================================================================= public function logoutAdmin(){ $data = '{"request":{}}'; $this->hasAdminSession = false; if(!$result = $this->wsCall($data, "authentication/logout")){ return false; // no response } return true; } //======================================================================================================================= // web service call: authentication/login //======================================================================================================================= function startAdminSession(){ if($this->hasAdminSession){ return true; } $data = '{"request":{"@username":"'.$this->settings['ws_user'].'","@password":"'.$this->settings['ws_password'].'"}}'; if(!$result = $this->wsCall($data, "authentication/login")){ $this->failedWSCall = true; return false; // no response } // check the result if(function_exists("json_decode")){ $result = json_decode($result, true); return $this->hasAdminSession = (is_array($result) && isset($result['response']['user']['@id'])); }elseif($this->ZendJSON){ $result = Zend_Json::decode($result); return $this->hasAdminSession = (is_array($result) && isset($result['response']['user']['@id'])); }else{ $re = '/"@id":"([0-9]+)"/'; $matches = array(); return $this->hasAdminSession = preg_match($re, $result, $matches); } } //====================================================================================================================== //======================================================================================================================= protected function validatePost(){ # 2-70 chars long if(strlen($_POST['uname']) < 2 || strlen($_POST['uname']) > 70){ return false; } # 6-30 chars long if(strlen($_POST['pwd']) < 6 || strlen($_POST['pwd']) > 30){ return false; } return true; } //======================================================================================================================= // web service call: user/getUserById //======================================================================================================================= protected function getUserById($userID){ $data = '{request:{"@id" : "'.$userID.'" , "@extensible" : "true" }}'; if(!$result = $this->wsCall($data, "user/getUserById")){ $this->failedWSCall = true; return false; // no responce } if(function_exists("json_decode")){ $result = json_decode($result, true); return is_array($result) && isset($result['response']['user']) ? $result['response']['user'] : false; }elseif($this->ZendJSON){ $result = Zend_Json::decode($result); return is_array($result) && isset($result['response']['user']) ? $result['response']['user'] : false; }else{ return false; // no JSON } } //======================================================================================================================= // web service call: user/getUserByUserName //======================================================================================================================= protected function getUserByUsername($username){ $data = '{request:{"@username" : "'.$username.'" , "@extensible" : "true" }}'; if(!$result = $this->wsCall($data, "user/getUserByUserName")){ $this->failedWSCall = true; return false; // no responce } if(function_exists("json_decode")){ $result = json_decode($result, true); return is_array($result) && isset($result['response']['user']['@id']) ? $result['response']['user'] : false; }elseif($this->ZendJSON){ $result = Zend_Json::decode($result); return is_array($result) && isset($result['response']['user']['@id']) ? $result['response']['user'] : false; }else{ return false; } } //======================================================================================================================= protected function isValidLogin($result){ if(function_exists("json_decode")){ $result = json_decode($result, true); $success = (is_array($result) && isset($result['response']['@valid'], $result['response']['@enabled']) && $result['response']['@valid'] == 'true' && $result['response']['@enabled'] == 'true'); }elseif($this->ZendJSON){ $result = Zend_Json::decode($result); $success = (is_array($result) && isset($result['response']['@valid'], $result['response']['@enabled']) && $result['response']['@valid'] == 'true' && $result['response']['@enabled'] == 'true'); }else{ $re = '/"@valid":"true","@enabled":"true"/'; $matches = array(); $success = preg_match($re, $result); } return $success; } //======================================================================================================================= // web service call: authentication/validateLogin //======================================================================================================================= public function checkCredentials(){ if(!$this->validatePost()){ // validation return false; //invalid post } $success = false; if(!$this->startAdminSession()){ return false; //can't start admin session } // try login $data = '{"request":{"@username":"'.$_POST['uname'].'","@password":"'.$_POST['pwd'].'"}}'; if(!$result = $this->wsCall($data, "authentication/validateLogin")){ return false; // no response } $success = $this->isValidLogin($result); if($success && $details = $this->getUserByUsername($_POST['uname'])){ $this->storeSessionDetails($details); } $this->logoutAdmin(); return $success; } //======================================================================================================================= protected function storeSessionDetails($details){ $_SESSION['userID'] = $details['@id']; // get user groups $groups = isset($details["groups"]["group"]) ? $details["groups"]["group"] : false; if(is_array($groups)){ if(isset($groups['@group_name'])){ // in case of a single group $_SESSION['user_groups'][] = $groups['@group_name']; }else{ foreach($groups as $group){ if(isset($group['@group_name'])){ $_SESSION['user_groups'][] = $group['@group_name']; } } } } $_SESSION['user_name'] = $_POST['uname']; $_SESSION['full_name'] = isset($details['@firstname'], $details['@lastname']) ? $details['@firstname'].' '.$details['@lastname'] : ''; } //======================================================================================================================= } // END SampleLogin //=================================================================================================================== ############################################## END CLASSES ######################################################### //=================================================================================================================== tryLogout(); // try login if(isset($_POST['uname'], $_POST['pwd'])){ $login = new SampleLogin(); $login->showNext($login->checkCredentials()); }else{ redirectNonLogged(); } if(!IS_LOGIN_PAGE && !IS_NOACCESS_PAGE && !userHasAccess()){ header("Location: http://" . SITE_ROOT . "departments/noaccess/?no_access=" . urlencode($_SERVER['REQUEST_URI'])); exit; } ?>

 

E-mail address:l.vanderwalt@ru.ac.za
Office number: +27 (0)46 603 8172

  • BA, BA Hons(Wits)
  • PhD (Wits)

Academia.edu page with publications, CV, record of teaching:http://rhodes-za.academia.edu/LucienvanderWalt

Publications and related: lucienvanderwalt.com/

GENERAL PUBLISHING PROFILE:

Professor Lucien van der Walt is a prize-winning scholar, who has given or published over 460 talks or papers. He has published in a wide range of local and international journals, newspapers and bulletins, as well as in reference works, and serves on six editorial boards.

His works include numerous popular articles, including in AmandlaNdivhuwo, Pambazuka, the South African Labour Bulletin and the Sowetan, five books, four special journal issues, numerous chapters in peer-reviewed books, and scientific articles in journals like African Studies, Anarchist Studies, Anarchist Developments in Cultural Studies, Archiv fur die Geschichte des Widerstandes und der Arbeit, Canadian Journal of History / Annales canadiennes  d'histoire, Capital and Class, Comparative Studies of South Asia, Africa and the Middle East, Global Labour Journal, , Journal of Contemporary African Studies, Labor History, Labour Capital and Society, Mundos del Trabalho, Politikon, Refractions, Safundi: The Journal of South African and American Studies, and Society in Transition. He served as southern African editor for Blackwell's International Encyclopedia of Protest and Revolution: 1500 to the present (2009). His recent focus has been on South Africa, but he has also done research in Zambia and Zimbabwe. 

His work has been translated into Czech, German, Greek, Italian, Portuguese, Slovenian, Spanish, Turkish, isiXhosa and isiZulu. 

PRIZES AND AWARDS:

Professor Lucien van der Walt is an National Research Foundation-rated scholar, has won a number of grants and scholarships, and was winner of both the international prize for the best Ph.D. dissertation from Labor History, the pre-eminent journal for historical scholarship in its field in the world, as well as the CODESRIA (Council for the Development of Social Science Research in Africa) prize for best African PhD thesis.

PROFESSIONAL AND RESEARCH GROUP AFFILIATIONS:

Professor Lucien van der Walt is a member of the History Workshop (University of the Witwatersrand), the Neil Aggett Labour Studies Unit (NALSU, Rhodes University), the Global Labour University, and a former staff associate of the Society, Work and Development Institute (SWOP, University of the Witwatersrand).

EDITORIAL BOARDS:

He serves on the following editorial boards: Historia, The Journal of Labor and Society, and Revista Estudos Libertários journals; the Rowman and Littlefield series on Radical Subjects in International Politics: Action and Activism, the Editora Prismas series on Coleção Estudos do Anarquismo, and the Continuum/ Manchester University Press series on Contemporary Anarchist Studies; and acts as a reviewer for the Global Labour Column. He is also a member of the South African Sociological Association (SASA), and of the International Sociological Association (ISA, RC 44 Labour Movements network).

REFEREEING:

He has acted as a referee for the numerous journals, including African Identities, Africa Insight, African Studies, Anarchist Studies, Capital and Class, Development Southern Africa, Global Labour Journal, Historia, Histoire sociale / Social History, Interface: A Journal For and About Social Movements, International Journal of African Historical Studies, International Review of Social History, Journal of Contemporary African Studies, Labor History, Labour History Review, Politikon: The South African Journal of Political Studies, Postcolonial Studies, Scientia Militaria, Social Dynamics, South African Historical Journal, South African Review of Sociology, Third World Quarterly, Town and Regional Planning, and WorkingUSA: The Journal of Labor and Society. I have reviewed manuscripts and proposals for AK Press, UCT Press/ Juta, Continuum/ Bloomsbury, Manchester University Press, Pluto Press, Routledge and Wits University Press.

ROLE IN THE WORKING CLASS MOVEMENT:

Professor Lucien van der Walt has been involved in the working class movements for over two decades, including serving on the executive of the Workers' Library and Museum, as a media officer for the early Anti-Privatisation Forum, as a rank-and-file activist in the National Education, Health and Allied Workers Union (NEHAWU), and as a union educator through the Global Labour University (GLU) at both Wits and at Kassel, the DITSELA Workers Education Unit, the Wits/ National Union of Metalworkers of South Africa (NUMSA) programme, the Vuysile Mini Winter Schools and the Unemployed People's Movement Political Schools. He is coordinator of the Eastern Cape short course programme for metalworkers' unions, "Policy Theory and Research for Labour Movements," a partnership between the Department of Sociology & Industrial Sociology, and the Neil Aggett Labour Studies Unit (NALSU).

EVALUATIONS OF TEACHING:

Nominated for the University of the Witwatersrand ('Wits') Vice Chancellor Award, Lucien van der Walt's supervision and teaching has consistently been ranked in the top 10% at Wits. Since Lucien relocated to Rhodes University in 2013, his teaching evaluations have hit the same levels.

TEACHING AREAS INCLUDE:

- Labour and left history, movements, politics and theory;
- Political economy and economic sociology, with a focus on neo-liberal restructuring and development policy, and alternatives;
- The sociology of work and industry.

SUPERVISION AREAS (POSTGRADUATE) INCLUDE:

- Neo-liberal restructuring, including state-owned corporations and economic & social policy;
- Trade unions and working class movements: history, politics, struggles, strategies;
- Labour history, including global labour history;
- Development strategies;
- Anarchist & syndicalist, Marxist and left history and theory, including race and the national question.

 NOTE: Examples of theses supervised can be found at the end of this page.

 RESEARCH INTERESTS INCLUDE:

- Labour history, with particular reference to anarchism and syndicalism in the colonial and post-colonial world, and questions of transnationality;
- The sociology of contemporary labour movements, with particular reference to trade unionism and labour struggles in southern Africa;
- Political economy, with particular reference to the neo-liberal restructuring of the state sector.

SELECT PUBLICATIONS AND PRESENTATIONS:

Keynotes and public lectures:

  • Lucien van der Walt, 2018, "What are we Fighting For? Possibilities for Decent Work, Unions and Rights in Africa,” keynote, for Conference on Trade Union Transformation in Sub-Saharan Africa, Ledger Plaza Bahari Beach Hotel, Kunduchi, Dar es Salaam, Tanzania, Friedrich Ebert Stiftung (FES), 29 October-2 November 2018
  • Lucien van der Walt, 2014, "Varieties of Anarchism: Anarchist Projects and the Struggles that Define Them," International Dissidence research group / Cluster of Excellence: Normative Orders, Johann Wolfgang Goethe-Universität Frankfurt am Main, Frankfurt, Germany, public lecture, 7 August 2014.
  • Lucien van der Walt, 2013, “Makhan Singh's (1914–1973) Legacy for Kenyan and African Trade Unions: Learning from the IWW, the Ghadar Party, and the East African Trade Union Congress,” First Makhan Singh Memorial Lecture, Nairobi, 5 December 2013.
  • Lucien van der Walt, 2011, "The Global History of Labour Radicalisms: The Importance of Anarchism and Revolutionary Syndicalism," keynote for "Labour Beyond State, Nation, Race: Global Labour History as a New Paradigm,” University of Kassel, Germany, 26 November 2011.

 Books, scholarly articles, chapters, special issues, editorships (last five years): 

  • Lucien van der Walt, Gilton Klerck and Kirk Helliker (accepted), "State Capitalism in Sub-Saharan Africa: Colonial Rule, Capitalist Development and Class Formation," in Alvaro Cuervo-Cazurra, Anna Grossman, Illya Okhamatovskiy, Pei Sun, Geoffrey Wood and Mike Wright (eds.), The Oxford Handbook of State Capitalism, Oxford University Press.
  • COLLECTION: John Reynolds and Lucien van der Walt (eds.), 2019, Strategy: Debating Politics Within and At a Distance from the State, Neil Aggett Labour Studies Unit (NALSU), Rhodes University, Makhanda, South Africa. Complete book here.
  • Leroy Maisiri, Philip Nyalungu and Lucien van der Walt (2020), "Anarchist/ Syndicalist and Independent Marxist Intersections in Post-apartheid Struggles, South Africa: The WSF/ ZACF current in Gauteng, 1990s-2010s, Globalizations, zations, volume 17, number 5, pp. 797-819. Part of a special issue on “Pluriversality, Convergence, and Hybridity in the Global Left,” edited by Alex Prichard and Owen Worth. 50 free eprints here.
  • Lucien van der Walt and Mandy Moussouris (2020), "Anarcho-syndicalism and Union Education in South Africa: A Critical Evaluation of the Congress of South African Trade Unions (COSATU) Tradition," in Linda Cooper and Sheri Hamilton (eds.), Renewing Workers' Education: Towards a Radical, Alternative Vision, HSRC Press: Cape Town, pp. 199-214.
  • Lucien van der Walt, 2019, "Aspects de l'Histoire de l'Anarchisme et du Syndicalisme Révolutionnaire en Afrique du Sud, des Années 1880 aux Années 1920," Actuel Marx, 2019/2 (no 66), pp. 44-63.
  • Lucien van der Walt, 2019, Beyond Decent Work: Fighting for Unions and Equality in Africa, Friedrich-Ebert-Stiftung, Berlin, 25 pp, available here.
  • Lucien van der Walt, 2019, "Syndicalism," in Carl Levy and Mathew Adams (eds.), The Palgrave Handbook of Anarchism, Palgrave Macmillan, London, New York, pp. 249-263.
  • Lucien van der Walt, 2018, “Préface,” to Guillaume Rey, Afriques Anarchistes: Introduction à l’Histoire des Anarchismes Africains, Paris, L’Harmattan, pp. 9-26.
  • BOOK: Kirk Helliker and Lucien van der Walt (eds.), (2018), Politics at a Distance from the State: Radical and African Perspectives, Routledge, London and New York, pp. 111-163.
  • Kirk Helliker and Lucien van der Walt, 2018, “Politics at a Distance from the State: Radical, South African and Zimbabwean Praxis Today,” in ibid., pp. 4-23.
    Lucien van der Walt, 2018, “Back to the Future: Revival, Relevance and Route of an Anarchist/Syndicalist Approach to 21st Century Left, Labour and National Liberation Movements,” in ibid., pp. 40-59.
  • Lucien van der Walt 2018, "From Below: An Overview of South African Politics at a Distance from the State, 1917-2015, with Dossier of Texts," in in ibid., pp. 111-163.
  • Lucien van der Walt, 2017, "Anarchism and Marxism," in N. Jun (ed.), The Brill Companion to Anarchism and Philosophy, Brill Academic Publishers, Leiden, pp. 505-558.
  • Lucien van der Walt, 2017, "'All Workers regardless of Craft, Race or Colour': The First Wave of IWW Activity and Influence in South Africa”, in Peter Cole, David Struthers and Kenyon Zimmer (eds.), Wobblies of the World: A Global History of the IWW, Pluto Press, London/ University of Chicago Press, Chicago, pp. 271-287.
  • Sian Byrne, Nicole Ulrich and Lucien van der Walt, 2017, "Red, Black and Gold: FOSATU, South African 'Workerism,' 'Syndicalism,' and the Nation," in Edward Webster and Karin Pampillas (eds.), 2017, The Unresolved National Question in South Africa: Left Thinking Under Apartheid, Johannesburg, Wits University Press, pp 254-273.
  • Lucien van der Walt, 2016, “Fora das Sombras: A case de massas, a composição de classe e a influência popular do anarquismo e do sindicalismo,” in Andrey Cordeiro Ferreira (ed.), Pensamento e Práticas Insurgentes: Anarquismo e Autonomias nos Levantes e Resistências do Capitalismo no Século XXI, Alternativa Editora, Niterói, pp. 120-158.
    Lucien van der Walt, 2016, “Revolução Mundial: Para um balanço dos impactos, da organização popular, das lutas e da teoria anarquista e sindicalista em todo o mundo,” in Andrey Cordeiro Ferreira (ed.), Pensamento e Práticas Insurgentes: Anarquismo e Autonomias nos Levantes e Resistências do Capitalismo no Século XXI, Alternativa Editora, Niterói, pp. 81-118.
  • Lucien van der Walt, 2016, "Back to the Future: Revival, Relevance and Route of an Anarchist/ Syndicalist Approach to 21st Century Left, Labour and National Liberation Movements," Journal of Contemporary African Studies, volume 34, number 3, pp. 348-367.
  • Kirk Helliker and Lucien van der Walt, 2016, "Politics at a Distance from the State: Radical Praxis Today," Journal of Contemporary African Studies, volume 34, number 3, pp. 312-331.
  • Philip Bonner, Jonathan Hyslop and Lucien van der Walt, 2016, "Rethinking Worlds of Labour: Southern African Labour History in International Context," in Andreas Eckert (ed.), Global Histories of Work, Berlin, De Gruyter, pp. 90-122.
  • Lucien van der Walt, 2016, "Alternatives from the Ground Up," WorkingUSA: The Journal of Labor and Society, volume 19, number 2, pp. 251-268.
  • Lucien van der Walt, 2016, "Global Anarchism and Syndicalism: Theory, History, Resistance," Anarchist Studies, volume 24, number 1, pp. 85-106
  • Lucien van der Walt and Sian Byrne, 2015, "Review Article: Worlds of Western Anarchism and Syndicalism: Class Struggle, Transnationalism, Violence and Anti-imperialism, 1870s-1940s," Canadian Journal of History / Annales canadiennes d'histoire, volume 50, number 1, pp. 98–123.
  • BOOKLucien van der Walt, 2014, Negro E Vermelho: Anarquismo, Sindicalismo Revolucionário e Pessoas de Cor na África Meridional nas Décadas de 1880 a 1920, Editora Faísca, São Paulo, 103pp. 
  • BOOKSteven J. Hirsch and Lucien van der Walt (eds.), (2010/ 2014), (foreword by Benedict Anderson), Anarchism and Syndicalism in the Colonial and Postcolonial World, 1870–1940: The Praxis of National Liberation, Internationalism, and Social Revolution, Brill Academic Publishers, Leiden, Studies in Global Social History, paperback edition, i–lxxvi, 510pp.
  • Steven J. Hirsch and Lucien van der Walt, 2014, “Preface to the Paperback Edition,” in Steven J. Hirsch and Lucien van der Walt (eds.), (foreword by Benedict Anderson), 2014, Anarchism and Syndicalism in the Colonial and Postcolonial World, 1870-1940: The Praxis of National Liberation, Internationalism, and Social Revolution, Brill Academic Publishers, Leiden, Studies in Global Social History, pp. lxxv-lxxviii.
  • Lucien van der Walt, 2014, "Reclaiming Syndicalism: From Spain to South Africa to Global Labour Today," Global Labour Journal, volume 5, number 2, pp. 239–252.
  • REVIEW: Lucien van der Walt, 2014, “Jared Davidson, Sewing Freedom: Philip Josephs, Transnationalism and Early New Zealand Anarchism, Oakland, CA: AK Press, 2014; 174pp,” Anarchist Studies, volume 22, number 2, pp. 120-121.
  • Lucien van der Walt, 2013, "Anarchism/ Syndicalism as a Vision, Strategy and Experience of Bottom-up Socialist Democracy: a reply to Daryl Glaser,” Politikon: South African Journal of Political Studies, volume 40, number 2, pp. 339–349.
  • Lucien van der Walt, 2013, "(Re)Constructing a Global Anarchist and Syndicalist Canon," Anarchist Developments in Cultural Studies, 2013: number 1 (5th in series), pp. 193–203. 
  • SPECIAL JOURNAL ISSUE:  Devan Pillay and Lucien van der Walt, 2012, “The Politics of Organized Labour in Asia, Africa and Latin America in the 21st Century,” special issue of Labour, Capital and Society, volume 44, number 2, with the Global Labour University.
  • Lucien van der Walt, 2012, "Thibedi, T.W. (1888–1960),” in Henry Louis Gates and Emmanuel Akyeampong (eds.), Dictionary of African Biography, Oxford University Press pp. 13–14.
  • Devan Pillay and Lucien van der Walt, 2012, "Introduction: Assessing the Politics of Organized Labour in Asia, Africa and Latin America at the Start of the 21st Century,” Labour, Capital and Society/ Travail, capital et société, volume 44, number 2, pp. 3–25.
  • Devan Pillay and Lucien van der Walt, 2012, “Introduction: Assessing the Politics of Organized Labour in Asia, Africa and Latin America at the Start of the 21st Century,” Labour, Capital and Society/ Travail, capital et société, volume 44, number 2, pp. 3-25.
  • REVIEW: Lucien van der Walt, 2012, “David Berry and Constance Bantman, eds., New Perspectives on narchism, Labour and Syndicalism: The individual, the national and the transnational ,” Anarchist Studies, volume 20, number 1, pp. 123-126.

Academic conferences and seminars (last five years):

  • Lucien van der Walt, Noor Nieftagodien: Round Table Discussion and Launch for Teresa Barnes, 2019, Uprooting University Apartheid in South Africa: From Liberalism to Decolonization, at "Trails, Traditions, Trajectories: Rethinking Perspectives on Southern African Histories," 27th Biennial Conference: Southern African Historical Society, Rhodes Unversity, Makhanda, South Africa, 24-26 June.
  • Lucien van der Walt, 2019, "The Industrial and Commercial Workers Union in South West Africa: Syndicalism, Garveyism and Resistance in South African-ruled Namibia, 1920-1925," paper presented at "Trails, Traditions, Trajectories: Rethinking Perspectives on Southern African Histories," 27th Biennial Conference: Southern African Historical Society, Rhodes University, Makhanda, South Africa, 24-26 June.
  • Lucien van der Walt, 2019, "What are we Fighting For? Possibilities for Decent Work, Unions and Rights in Africa," Labour Studies Seminar Series, Rhodes University, Grahamstown/ Makhanda, 27 March.
  • nternational conference presentation: Lucien van der Walt, 2018, “Rebuilding Links between Trade Unions and Co-operatives for Counter-Power,” Conference on Trade Union Transformation in Sub-Saharan Africa, Ledger Plaza Bahari Beach Hotel, Kunduchi Kunduchi, Dar es Salaam, Tanzania, Friedrich Ebert Stiftung (FES), 29 October-2 November 2018. 
  • Lucien van der Walt, 2018, “Fragmented Labour Movement, Fragmented Labour Studies: New Directions for Research and Theory,” paper presented at “Taking Democracy Seriously: Reflecting on Trade Unions in the Last 20 Years and the Future of the Labour Movement in South Africa,” conference, University of the Witwatersrand, 6-7 September.
  • Lucien van der Walt, 2017, "1917-2017: The Russian Revolution and its Relevance Today," Labour Studies Seminar Series, Rhodes University, Grahamstown, 17 October.
  • Lucien van der Walt, 2017, “Internal Democracy, Participative Unionism and Union Renewal: Perspectives from Anarcho-Syndicalism,” at “Challenges for Trade Unions in Sub-Saharan Africa: The Members are the Union, Aren’t They?” conference for unionists, Friedrich-Ebert-Stiftung-Trade Union Competence Centre Sub-Saharan Africa, University of the Witwatersrand, 23-25 October.
  • Byrne, Nicole Ulrich and Lucien van der Walt, 2017, "Red, Black and Gold: FOSATU, South African 'Workerism,' 'Syndicalism' and the Nation," 2017 South African Historical Society biennial conference, University of the Witwatersrand, Johannesburg, 21-23 June.  
  • Lucien van der Walt, 2017, "The Industrial and Commercial Workers Union in South West Africa: Syndicalism, Garveyism and Resistance in South African-ruled Namibia, 1920-1925," 2017 South African Historical Society biennial conference, University of the Witwatersrand, Johannesburg, 21-23 June. (Earlier versions: Lucien van der Walt, 2016, "The Industrial and Commercial Workers Union in South West Africa: Syndicalism, Garveyism and Resistance in South African-ruled Namibia, 1920-1925," South African South African Sociological Association Congress, Rhodes University, Grahamstown, 26-29 June).
  • Lucien van der Walt, 2016, "Rethinking the Limits and Possibilities of Trade Unions: A Dialogue between Syndicalism, Labour Studies and Contemporary Union Renewal," "The Just Transition and the Role of Labour: Our Ecological, Social and Economic Future - 11th Global Labour University Conference," National Institute for the Social Sciences and Humanities (NIHSS), Johannesburg, 28-30 September.
  • Lucien van der Walt, 2016, "The Industrial and Commercial Workers Union in South West Africa: Syndicalism, Garveyism and Resistance in South African-ruled Namibia, 1920-1925," European Social Science History Conference, Valencia, Spain, 30 March - 2 April.
  •  Lucien van der Walt, 2015, “Trade Union and Worker Ideologies, Historic and Global: Anarchism, Syndicalism and Labour,” joint GLU (Global Labour University) (GLU)/ ENGAGE (Empowerment & Capacity Building Network for Global Trade Unionists & Labour Activists) seminar, University of the Witwatersrand, 20 Novembe
  • Lucien van der Walt, 2015, “Classes, Commons, Collectivisation: Labour and the Left,” Class, Colonialism and the Commons: The Case of Southern Africa colloquium: Rhodes University, South Africa, 20–21 August.
  • Lucien van der Walt, 2015, “From the Periphery: Anarchism and Revolutionary Syndicalism in the Colonial and Post-Colonial World of the Twentieth Century," Anarchism: Insurgent Practices and Thought conference, Federal Rural University, Rio de Janeiro, Brazil, 30 June to 2 July.
  • Nicole Ulrich, Lucien van der Walt and Sian Byrne, 2015, "Red, Black and Gold : FOSATU, South African 'Workerism,' 'Syndicalism' and the Nation," Hidden Voices: The Unresolved National Question in Left Thinking workshop, COSATU House, Johannesburg, South Africa, 18–19 May.Lucien van der Walt, 2014, "The Relevance of Makhan Singh for Labour Today," "Paying Living Wages: A Reality or Mirage?" Colloquium, Kenyan Human Rights Commission (KRC) Consortium, Venue: Panafric Hotel, Nairobi, Kenya, 27-28 November.
  • Lucien van der Walt, 2014, "Fighting For, but Fighting for More, than a Living Wage," "Paying Living Wages: A Reality or Mirage?" colloquium, Kenyan Human Rights Commission (KRC) Consortium, Venue: Panafric Hotel, Nairobi, Kenya, 27-28 November.
  • Lucien van der Walt, 2014, "Anarchism, Syndicalism and Violent Anti-imperialism in the Colonial and Post-colonial World, 1870–1940," Panel on "Transnational Dimensions of Violent Dissidence," Fourth Global International Studies Conference, World International Studies Committee (WISC), Frankfurt, Germany, 6–9 August.
  • Nicole Ulrich and Lucien van der Walt, June 2014, "Workerism/Syndicalism and Nationalism," paper at "The Unresolved National Question in Left Thinking: Hidden voices, unpublished works 1950s to 1990," Chris Hani Institute, COSATU House, 10–11 June.
  • Lucien van der Walt, 2014, "'One Great Union of Skilled and Unskilled Workers, South of the Zambezi': Garveyism, Liberalism and Revolutionary Syndicalism in the Industrial and Commercial Workers Union of Africa, 1919–1949," European Social Science History Conference, Vienna, Austria, 23–26 April.
  • Lucien van der Walt, 2012, "Change the World by Making CounterPower: Anarchism/ Syndicalism, Class Struggle and the Question of Revolutionary Transitions," "Politics at a Distance from the State," Rhodes University, 29-30 September.
  • Lucien van der Walt, 2012, "Anarchism and Syndicalism in South Africa: The Complicated History, and Possible Promise, of a Rediscovered Radical Tradition," "SAHUDA Lineages of Freedom: Emancipatory Traditions colloquium," Rhodes University, 4 October.
  • Lucien van der Walt, 2012, "Adding Red to the Black Atlantic?  Black Revolutionary Syndicalists and the South Africa Native National Congress's Radicalisation, 1917-1920," Critical Studies Seminar Series, Rhodes University, 10 August.

Popular works (selected: last five years):

  • Lucien van der Walt, 2020, "Understanding South Africa’s Incomplete Liberation: An Anarchist/ Syndicalist Analysis," ASR/ Anarcho-Syndicalist Review, number 80, pp. 11-16, here.
  • Lucien van der Walt, 2019, "Should the Anti-Capitalists Vote?" International Labour Research and Information Group (ILRIG), 3 September, online here.
  • Lucien van der Walt, 2019, “Rebuilding Links between Unions and Co-operatives for Counter-Power,” Amandla, numbers 67/68, pp. 28-29. here.
  • Lucien van der Walt, 2019, "Anarchism's Relevance to Black and Working Class Strategy: Dispelling Ten Myths," ASR/ Anarcho-Syndicalist Review, number 76, pp. 30-34.
  • Lucien van der Walt, 2019, "Rebuilding the Workers' Movement for Counter-Power, Justice and Self-Management: A Contribution to the Debate," Amandla, number 63, pp. 24-25.
  • Lucien van der Walt, [2004] 2019, "On Bakunin: Introduction to the South African Edition (2004)," in Basic Bakunin, Zabalaza Books, Durban/ Johannesburg, second South African edition,  pp 3-6. here..
  • Lucien van der Walt, 2019, Breaking the Chains: A History of Anarchism, Zabalaza Books, Johannesburg, reprint of 1998 Workers Solidarity text, online here .
  • Lucien van der Walt, 2018/2019, "Renewing and Reforming Labor: The Case for Anarcho-Syndicalism," ASR/ Anarcho-syndicalist Review, number 75, pp. 10-15.
  • Lucien van der Walt, 2019, “Introduction to the 1994 South African Edition (revised),” Alfredo Bonanno, Anarchism and the National Liberation Struggle, Zabalaza Books, Johannesburg, third South African edition,  pp. 4-6. here.
  • Lucien van der Walt, 2019, “Introduction to the Second South African Edition (2003),”  Alfredo Bonanno, Anarchism and the National Liberation Struggle, Zabalaza Books, Johannesburg, third South African edition,  pp. 7-14. here, republishing from 2003, here.
  • Lucien van der Walt, 2018, "From Union Renewal to a Self-Managed Society: Towards an Anarcho-syndicalist Project," South African Labour Bulletin, volume 42, number 1, pp. 27-30. Republished in Pambazuka News, number 879, 21 May, online here.
  • Leroy Maisiri and Lucien van der Walt, 2018, "Alternatives to Capitalism Part 3: Resist-Occupy-Produce: Lessons from Factory Take-Overs and Worker Cooperatives in Argentina," Workers World News (ILRIG), number 110, August-September, pp. 8-9.
  • Muttaqa Yushau Abdulra'uf, Sian Byrne, Warren McGregor and Lucien van der Walt, 2017, "Beyond May Day Parades: Building a Counter-Movement in Malaysia and Worldwide," Anarkismo, 28 April, online here.  
    Sian Byrne, Paliani Chinguwo, Warren McGregor, and Lucien van der Walt, 30 April 2018,"Why May Day matters to Malawi: History with anarchist roots," As it Happens News (Malawi), online here. 
    Lucien van der Walt and Peter Cole, 2018, "The Other Revolutionaries: the IWW and the fight against racism in the USA, South Africa, India, and New Zealand," Review of African Political Economy (ROAPE) blog, 29 March, online at http://roape.net/2018/03/29/the-other-revolutionaries/
  • Peter Cole and Lucien van der Walt, 2017, "Wobblies: A New History of a Radical Union that Profoundly Impacted Southern African Politics," Africa Is A Country, here.
  • Lucien van der Walt, 2017, "Alan Robert Lipman, South Africa (1925-2013)," Southern African Anarchist & Syndicalist History Archive, 27 April, here. 
  • Lucien van der Walt, 2017, "Renewal and Crisis in South African Labour Today," Pambazuka News, 206-01-207, volume 436, number 1, online here.
  • Lucien van der Walt, with Sian Byrne and Nicole Ulrich, 2017, "South African 'Workerism' in the 1980s: Learning from FOSATU's Radical Unionism," ASR/ Anarcho-syndicalist Review, numbers 71/72, pp. 28-32.
  • Lucien van der Walt, 2016, "Why Workers' Education? Why Trade Unions and What's Next?," South African Labour Bulletin, volume 40, number 5, pp. 46-48.
  • Lucien van der Walt, 2016, "Imperial Wars and Their Losers: A Critique of 'Labor Aristocracy' Theories," ASR/ Anarcho-syndicalist Review, number 66, pp. 15-16.
  • Shawn Hattingh and Lucien van der Walt, 2015, “The Kurdish Question: Nationhood or Autonomy,” Ndivhuwo: Journal for Intellectual Engagement, number 3, 2015, pp. 70-72.
  • Lucien van der Walt, 2015, "How Imperialism and Postcolonial Elites have Plundered Africa,” Tokologo, numbers 5/6, pp. 17–19.
  • Lucien van der Walt, 2015, "Bill Andrews and South Africa’s Revolutionary Syndicalists,” Tokologo, numbers 5/6, p. 24.
  • Lucien van der Walt, 2015, "Beyond ‘White Monopoly Capital’: Who Owns South Africa?," South African Labour Bulletin, volume 39, number 3, pp. 39-42.
  • Lucien van der Walt, 2015, "From Living Wage to Working Class Counter-Power: Theory, Strategy and Struggle," Bargaining Indicators 2015: A Collective Bargaining Omnibus, volume 15, pp. 117–124.
  • Lucien van der Walt, 2015, "From Living Wage to Working Class Counter-power," South African Labour Bulletin, volume 39, number 2, pp 35-39.
  • Lucien van der Walt, 2015, "Self-Managed Class-Struggle Alternatives to Neo-liberalism, Nationalisation, Elections," Global Labour Column, number 213, October 2015.
  • Thabang Sefalafala and Lucien van der Walt, 2015, "Building a Mass Anarchist Movement: The Example of Spain's CNT," Zabalaza: A Journal of Southern African Revolutionary Anarchism, number 14, pp. 25–26.
  • Lucien van der Walt, 2015, "From Living Wage to Working Class Counter-power," South African Labour Bulletin, volume 39, number 2, pp 35–39.
  • Lucien van der Walt, Sian Byrne and Warren McGregor, 2015, "Troubled SA Must Take May Day Seriously," Mail and Guardian, 30 April .
  • Lucien van der Walt, 2015, "Speech: Working Class Struggle, Blazing a Path to Freedom," Zabalaza: A Journal of Southern African Revolutionary Anarchism, number 14.
  • Lucien van der Walt, 2014, "Politics at a Distance from the State: Speech to South African Movements," ASR/ Anarcho-syndicalist Review, number 62, pp. 21–23.
  • Lucien van der Walt, 2013, "Speech to Metalworkers: Anarcho-syndicalism for South African Unions Today?," ASR/ Anarcho-syndicalist Review, number 61, pp. 11–20.
  • Lucien van der Walt, 2014, "Bernard Sigamoney, Durban Indian Revolutionary Syndicalist," Tokologo, number 4, p.11.
  • Lucien van der Walt, 2 October 2014, "Repensando la Protección Social: Una crítica radical," in Economía para todos, Diagonal Periódico newspaper, online at https://www.diagonalperiodico.net/blogs/economia-para-todos/repensando-la-proteccion-social-critica-radical.html
  • Lucien van der Walt, 2014, "T.W. Thibedi and the Industrial Workers of Africa, April-July 1919," Tokologo, number 3, p. 10.
  • Muttaqa Yushau, Sian Byrne, Warren McGregor and Lucien van der Walt, 2013, "Towards a Viable Counter-Movement in Nigeria,” Daily Labour, volume 26, number 7, (Nigeria), 20 June , p. 10. (also see corrections note in Daily Labour, 15 July 2013 vol. 26 no. 8, p. 1).
  • Lucien van der Walt, Paliani Chinguwo, Sian Byrne and Warren McGregor, 3 May 2013, "Why May Day Matters to Botswana,” Mmegi, volume 30, number 65, (Botswana), pp. 8–9.
  • Lucien van der Walt, Paliani Chinguwo, Sian Byrne and Warren McGregor, 1 May 2013, "Why May Day Matters to Malawi ... History with Anarchist Roots,” The Nation, Labour Day Supplement, (Malawi), pp. 11–12.
  • Tina Sizovuka and Lucien van der Walt, 2013, "Get Rich or Lie Trying: Why ANC Millionaire Julius Malema Posed as a Radical, Why he Lost, and What This Tells Us about the Post-apartheid ANC,” Zabalaza: A Journal of Southern African Revolutionary Anarchism, number 13, pp. 28–35.
  • Lucien van der Walt, 2013, “Who Rules South Africa? An Anarchist/Syndicalist Analysis of the ANC,the Post-apartheid Elite Pact and the Political Implications,” Zabalaza: A Journal of Southern African Revolutionary Anarchism, no. 13, pp. 7–13.
  • Tina Sizovuka and Lucien van der Walt, 2013, "Alternative Needed to Nationalisation and Privatisation: State Industries like South Africa’s ESKOM show Working Class Deserves Better," Zabalaza: A Journal of Southern African Revolutionary Anarchism, number 13.
  • Lucien van der Walt, 2013, "Black Stars of Anarchism: T.W. Thibedi (1888-1960) - The Life of a South African Revolutionary Syndicalist," Zabalaza: A Journal of Southern African Revolutionary Anarchism, no. 13.
  • Shawn Hattingh and Lucien van der Walt, 2013, "Mandela, the ANC and the 1994 Breakthrough: Anarchist / syndicalist reflections," Anarkismo, 16 December, online here.
  • Lucien van der Walt and Ian Bekker, 2012, "Améliorer le Mouvement des Travailleurs: leçons de la grande grève de 2010 en Afrique du sud,” Terre et Liberté, number 2, (France), p. 5.
  • Lucien van der Walt, 2012, "Internationalismus und Antiimperialismus von unten: Anarchismus und Syndikalismus in der Kolonialen und Postkolonialen Welt,” Direkte Aktion, number 209, (Germany), p. 12.
  • Lucien van der Walt, 2012, "Anarchism's Historical Role: A Global View,” Freedom, February, (Britain), pp. 13–15.

Recent presentations: labour, civil society (selected only):

  • Lucien van der Walt, 2020, “Critically Assessing Social Programmes to Mitigate COVID-19: Long march to rebuilding bottom-up, working class-led change in South Africa,” #SAFTUWorkersConversations on “Coronavirus and the Working Class,” South African Federation of Trade Unions (SAFTU), online, 26 May. Video recording of the event here.
  • Lucien van der Walt, 2020, “Political Implications of the Successful UPM Case to Dissolve Makana Municipality,” Unemployed Peoples Movement (UPM), Rhodes University, Makhanda, 27 January.
  • Lucien van der Walt, 2019, “Understanding Authoritarian Populism and Building Inclusive, Bottom-Up Working Class Alternatives,” 17th Annual ILRIG Globalisation School on “The Rise of Right-Wing Politics and Authoritarian Rule: Deepening our Understanding and Broadening Inclusive Organisation and Struggle,” Cape Town, 9 October. VIDEO recording here.
  • Lucien van der Walt, 2019, "Modes of Politics at a Distance from the State," input at Vuyisile Mini Winter School 2019: Politics Within and at a Distance from the State, Rhodes University, Makhanda (Grahamstown), 9-12 July.
  • Lucien van der Walt, 2019, "Overview of Theories of the State," input at Vuyisile Mini Winter School 2019: Politics Within and at a Distance from the State, Rhodes University, Makhanda (Grahamstown), 9-12 July.
  • Lucien van der Walt, 2019, "The State, Accumulation and Class Formation after Apartheid," input at Vuyisile Mini Winter School 2019: Politics Within and at a Distance from the State, Rhodes University, Makhanda (Grahamstown), 9-12 July.
  • Lucien van der Walt, 2019, "Should the Anti-Capitalists Contest Elections?," International Labour Research and Information Group (ILRIG)/ Workers World Media Productions (WWMP) Public Forum & debate, Isivivana Centre, Khayelitsha, Cape Town, 25 April.
  • Ayanda Kota, Leroy Maisiri and Lucien van der Walt, 2018, design, facilitation and delivery of three-day workshop: "Autonomy, Land, Self-Management: Alternatives & the Russian and Spanish Revolutions," for Unemployed People's Movement (UPM), Stone Crescent, Grahamstown, 7-9 November.
  • Ayanda Kota, Leroy Maisiri and Lucien van der Walt, 2017, design, facilitation and delivery of three-day workshop: "Women, Workers, Land Reform: What Can we Learn from the Russian Revolution?," for Unemployed People's Movement (UPM), Stone Crescent, Grahamstown, 10-12 December.
  • Lucien van der Walt, 2017, "Soviets, Revolution and Workers' Democracy: Anarchist/ Syndicalist Perspectives," 1917 Russian Revolution Centenary Festival, Newtown, Johannesburg, 10-12 November.
  • Lucien van der Walt, 2017, "Internal Democracy, Participative Unionism and Union Renewal: Perspectives from Anarcho-Syndicalism," at "Challenges for Trade Unions in Sub-Saharan Africa: The Members are the Union, Aren't They?" conference for unionists, Friedrich-Ebert-Stiftung-Trade Union Competence Centre Sub-Saharan Africa, University of the Witwatersrand, 23-25 October.
  • Lucien van der Walt, 2017, "Learning from Radical 1980s Unionism: FOSATU's 'Workerism,' Its Power and Its Limits," input at "'People's Power,' 'Workers' Control' and Grassroots Politics in South Africa: Rethinking Practices of Self-Organisation and Anti-apartheid Resistance in the 1980s" workshop, International Labour Research and Information Group (ILRIG)/ Orange Farm Human Rights Advice Centre, Drieziet extension, Orange Farm township, 24 June. (Paper developed with Sian Byrne and Nicole Ulrich).
  • Lucien van der Walt, 2017, "The Political Economy of the Rhodes Industrial Action," seminar on "Students and the Strike," Asinimali, Rhodes University, 28 April.
  • Lucien van der Walt, 2016, "Racial Capitalism and Workers' Movements in South Africa," Global Labour University's Summer School, Bronkhorstspruit, 2 October.
  • Lucien van der Walt, 2016, "Building Workers Education Input," Vuyisile Mini Winter School 2015: Labour and Social Policy, Institute of Social and Economic Research (ISER) Neil Aggett Labour Studies Unit (NALSU), Rhodes University, 16 July.
  • Lucien van der Walt, 2015, "Revolution in Guinea-Bissau: Assessing Cabral and the PAIGC Experience", Tokologo seminar, University of the Witwatersrand, 21 November.
  • Lucien van der Walt, 2015, "Trade Union and Worker Ideologies, Historic and Global: Anarchism, Syndicalism and Labour," joint GLU (Global Labour University) (GLU)/ ENGAGE (Empowerment & Capacity Building Network for Global Trade Unionists & Labour Activists) seminar, University of the Witwatersrand, 20 November.
  • Lucien van der Walt and Nicole Ulrich, 2015, "A Historical Perspective on the South African Labour Movement and the National Question," Vuyisile Mini Winter School 2015: Labour and Social Policy, Institute of Social and Economic Research (ISER), Rhodes University, 18 July.
  • Lucien van der Walt, 2015, "Thomas Sankara and the Revolution of the Colonels", Tokologo seminar, University of the Witwatersrand, 16 May.
  • Lucien van der Walt, 2015, "Radical Analysis of the Post-Colonial African Context", Tokologo seminar, University of the Witwatersrand, 21 February.
  • Lucien van der Walt, 2014, "1976: Lessons and Limits", Tokologo seminar, University of the Witwatersrand, 21 June.
  • Lucien van der Walt, 2014, "From June 16 to Today: Youth and politics," seminar with Unemployed People's Movement (UPM), Rhodes University, 19 June. 
  • Popular talk: Lucien van der Walt, 2014, "Early years of anarchism, syndicalism and the national question in South Africa," Zabalaza seminar, University of the Witwatersrand, 29 January.
  • Lucien van der Walt, 2013, "The Political Possibilities of Trade Unions: Anarcho-syndicalist Perspectives," National Union of Metalworkers of South Africa (NUMSA) 1st Political School, panel, Kopanong Hotel and Conference Centre, Benoni, 13-18 September.
  • Lucien van der Walt, 2013, afternoon input at National Health, Education and Allied Workers Union (NEHAWU) branch executive training workshop, Rhodes University, Grahamstown, 31 August.
  • Lucien van der Walt, 2013, "Anarchist Revolution in the Ukraine 1918-1921 and the Colonial Question", Tokologo workshop, University of the Witwatersrand, 20 July.
  • Lucien van der Walt, 2013, "A Preliminary History of the Rebirth of South African Anarchism in the 1990s," Zabalaza seminar, University of the Witwatersrand, 3 May.
  • Lucien van der Walt, 2012, "Why Working Class Heritage Matters", address: "Heritage Day" event, Sakhalutu Cultural Group, Joza township, Grahamstown, 24 September.
  • Lucien van der Walt, 2012, "Basic Organising Skills", Inkululeko workshop, University of the Witwatersrand, 19 August 2012.
  • Lucien van der Walt, 2012, "Statist Currents in the Working Class Movement", Tokologo workshop, University of the Witwatersrand, 23 June.

POST-GRADUATE THESES SUPERVISED (past and ongoing) 

  • Byrne, Sian, "'Building Tomorrow Today': A Re-examination of the Controversial 'Workerist' Tendency Associated with the Federation of South African Trade Unions (FOSATU) in South Africa 1979-1985" (MA, Industrial Sociology, Wits).
  • Byrne, Sian, "Self-management and New Prefigurative Politics in the Rebel Unions of South Africa and Poland: Recovering FOSATU “workerism” and Solidarnosc samorzad” (PhD, Industrial and Economic Sociology, Rhodes, co-supervised with R. Chwedoruk, ongoing).
  • Flatau, Scott, "Trade Union Perceptions of ESKOM in Light of Recent Crises: A Case Study of the National Union of Metal Workers South Africa (NUMSA) and the National Union of Mineworkers (NUM) (Honours research dissertation, Industrial and Economic Sociology, Rhodes).
  • Goqoza, Noluyolo, "Challenges of Post-Apartheid State Owned Company Pension Fund Reform: A Case Study of the Controversy around the Transnet-Transport Pension Fund" (MA, Industrial and Economic Sociology, Rhodes).
  • Gbahabo, Terfa Percy, "Desertification and Rural Livelihood: The Case of Gursulu Village, Yobe State, Nigeria" (MA, Development Studies, co-supervised with P. Germond).
  • Gongqa, Nombulelo, "South African Trade Union Responses to Xenophobia in the Workplaces: The National Union of Mineworkers (NUM) and National Union of Metalworkers of South Africa (NUMSA)" (MA, Industrial and Economic Sociology, Rhodes).
  • Heald-Oka, Arisa, "University Transformation from the Perspective of Organised Labour: Was 2017 Industrial Action at Rhodes University an Outcome of Neoliberalism?," (Honours research dissertation, Industrial and Economic Sociology, Rhodes).
  • Kabali-Kagwa, Faye, "Crossing Borders: An Exploration of Race, Class and South African Students' Perception of African Students at Rhodes University" (Honours research dissertation, Sociology, Rhodes).
  • Kautzky, Keegan, "An Examination of the Resources and Relationships Available to Impoverished Rural Households to Adapt and Cope in Response to HIV/Aids: A Survey of Villages in the Sekhukhuneland Region of South Africa's Limpopo Province" (MA, Development Studies, Wits, co-supervised with L. Gilbert).
  • Kepadisa, Moemedi, "The Impact of Post-1994 Trade and Industrial Policies on the Working Class: A Case Study of Iscor (now Arcelor Mittal-South Africa) from 1996 to 2012" (Master of Management: Public Policy, Wits).
  • Mahote, Tulisa, "Evaluating Support Service Co-operation in the Netcare Settlers Public Private Partnership (PPP), Grahamstown, South Africa" (MA, Social Sciences, Rhodes).
  • Maisiri, Leroy, "Coping Strategies in Conditions of Economic Meltdown: Textile Firms in Contemporary Bulawayo, Zimbabwe" (Honours research dissertation, Industrial and Economic Sociology, Rhodes).
    Maisiri, Leroy, "The New 'Workers Party' Debate on the South African Independent Left, 2012-2014" (MA, Industrial and Economic Sociology, Rhodes).
  • Maisiri, Leroy, "Recovering Alternative Emancipatory Trajectories in South Africa: The Independent Left and the 1980s ‘People's Power’ Movement" (PhD, Industrial and Economic Sociology, ongoing).
  • Makola, Luka, “The Rise and Decline of Co-operative Development within the South African Trade Union Movement: A Historical Evaluation of Union-led Worker Co-operatives from the Mid-1980s into the ‘Democratisation’ Era” (MA, Industrial and Economic Sociology, Rhodes, ongoing).
  • Makwetu, Ncebekazi, “The Pan Africanist Congress and Clarence Mlamli Makwetu’s Political Involvement, 1959-1997” (PhD, Industrial and Economic Sociology, Rhodes, co-supervised with N. Ulrich, ongoing).
  • Maselwa, Avuyile, "My Friend, the Stranger: Somali Spaza Shop Operators in the Villages around Cofimvaba, Eastern Cape, South Africa" (MA, Sociology, Rhodes).
  • Mathekga, Jerry Mmanoko, "Organising the Changing Municipal Workforce: A Case Study of the South African Municipal Workers' Union (SAMWU) in the Cape Town Metro, 2000-2015" (PhD, Industrial and Economic Sociology, Rhodes, co-supervised with N. Ulrich, ongoing).
  • McGregor, Warren, "The Class Compromised? SATAWU and Organised Labour's 'the Reconstruction of Spoornet' Initiative" (MA, Industrial Sociology, Wits).
  • Mortlock, Matthew, “Assessing the Impact of State Asset Restructuring in Post-Apartheid South Africa: Evaluating the Role of Telkom in Internet Infrastructure in South Africa since Privatisation” (MA, Industrial and Economic Sociology, Rhodes, ongoing).
  • Mosesi, Poloko, "The Impact of Micro-lending on Welfare-Dependent Black Women: A Case Study from the Free State, South Africa" (Honours research dissertation, Industrial and Economic Sociology, Rhodes).
  • Mosesi, Poloko, "'Smart economics,' 'women-centred development' and neo-liberal narratives: A case study of the ATHENA programme, Rand Merchant Bank" (MA, Industrial and Economic Sociology, Rhodes, co-supervised with D. Fryer).
  • Moussouris, Mandy, "Love, Liberty and Learning: The Problem with Skills in Revolution - An Anarchist Perspective on Trade Union Education in COSATU" (Honours research dissertation, Industrial Sociology, Wits).
  • Mulondo, Matodzi Michelle, "Understanding the Use of Fully Subsidised Houses as a Place of Business by the Urban Poor: Poverty Repackaged or Avenue to Escape Poverty? The Case of Lotus Gardens, Pretoria West, Gauteng" (MA, Development Studies, Wits).
  • Musi, Mojalefa, "Evaluating IMATU and SAMWU Policy Responses to Igoli 2002" (MA, Labour Policy and Globalisation, Wits).
  • Mussa, Khadija, "Views from the Inside: An Appraisal of the Effectiveness of International NGOs as Agents of Development through a Case Study of Concern Universal's Local Development Support Programme in Dedza District, Malawi" (MA, Social Science, Rhodes).
  • Mutyavaviri, Tariro, "Implications of Mining for Local Community Members in Marange, Zimbabwe" (Honours research dissertation, Industrial and Economic Sociology, Rhodes).
  • Nathan, Oliver, "What is the Relationship between State Sponsored Worker Co-operatives, Local Markets and the Ekurhuleni Metropolitan Municipality?" (MA, Industrial Sociology, Wits).
  • Ndemka, Sibulela "Experiences of Xenophobia in South Africa: A Case Study of the 2015 Attacks in Grahamstown" (Honours research dissertation, Industrial and Economic Sociology, Rhodes).
  • Ndlozi, Mbuyiseni, "Trade Unionism in South Africa: A Critical Assessment of Trade Union Strategy - The Case of the CWIU, 1987-1999" (MA, Industrial Sociology, Wits).
  • Ngoma, Amuzweni, "Exploring the Role of Charismatic Neo-Pentecostalism in the Social Life of the Black Middle Class in Contemporary South Africa" (PhD, Industrial and Economic Sociology, Rhodes, co-supervised with R. Southall, ongoing).
  • Nthinya, Neo, "The Role of the Independent Municipal and Allied Trade Union (IMATU) in the Merger of the City of Tshwane and the Metsweding Municipalities (2010-2011)" (MA, Labour and Development, Wits).
  • Sefalafala, Thabang, "Union Splits on the Mines: A Case Study of 'Legal Voice' at Driefontein East Gold Mine, Carletonville, Gauteng" (Honours research dissertation, Industrial Sociology, Wits).
  • Shangase, Mabutho, "Examining the Effectiveness of BEE Implementation: A Case Study of ESKOM Restructuring, 1995-2005" (MA, Development Studies, Wits).
  • Sibuyi, Nkosana, "The Effects of Competing Policy Imperatives in Post-Apartheid South Africa: An analysis of the effects of ESKOM restructuring on the South African Automotive Industry, 2005-2014" (PhD, Industrial and Economic Sociology, Rhodes, ongoing).
  • Theledi, Nkosinathi Louis, "Joe Slovo, 1926-1995: A Political Biography of a South African Marxist" (PhD, History, Rhodes, co-supervised withn N. Ulrich, ongoing).
  • Nadjeschda Wollnick, "COSATU's Economic and Social Policy Influences: Marxist or Keynesian?" (Honours research dissertation, Industrial and Economic Sociology, Rhodes).
  • Xaba, Brilliant, "An Investigation into the Effectiveness of the Child Support Grant (CSG) in Alleviating Poverty in Poor Grahamstown Communities 2013" (Honours research dissertation, Industrial and Economic Sociology, Rhodes).
  • Xaba, Brilliant, "The Developmental Impact of Non-contributory Social Grants in South Africa: A Study of Ezibeleni, Queenstown" (MA in Sociology, Rhodes).

 

 

Last Modified: Tue, 07 Jul 2020 13:55:25 SAST