Wysiwyg in Mantis einbinden

Download und unzip tinymce im Verzeichnis custom in der Mantisinstallation.

http://tinymce.moxiecode.com/index.php

Ändere die config.inc.php

$g_meta_include_file			= '%absolute_path%custom/meta_inc.php';

Füge zur custom/meta_inc.php folgende Zeilen hinzu (eventuell muss die Datei angelegt werden).

<script type="text/javascript" src="custom/tinymce/jscripts/tiny_mce/tiny_mce.js"></script>
<script type="text/javascript">
tinyMCE.init({
        // General options
        mode : "textareas",
        theme : "advanced",
        plugins : "spellchecker,searchreplace,print,contextmenu,paste,fullscreen,inlinepopups",

        // Theme options
        theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,bullist,numlist,|,cut,copy,paste,pastetext,pasteword,|,search,replace,|,code",
        theme_advanced_buttons2 : "",
        theme_advanced_buttons3 : "",
        theme_advanced_buttons4 : "",
		theme_advanced_toolbar_location : "top",
        theme_advanced_toolbar_align : "left",
        theme_advanced_statusbar_location : "bottom",
        theme_advanced_resizing : true,
		valid_elements : "a[href|target=_blank],b/strong,i/italic,u/underline,s/strikethrough,ul,ol,li,br",
		force_br_newlines : true,
        force_p_newlines : false,
		remove_linebreaks : true,
		apply_source_formatting:false,

        // Example content CSS (should be your site CSS)
        content_css : "css/default.css",

});
</script>

index_sso.php für SingleSignOn für Mediawiki 1.16.1

In den nächsten Tagen folgen noch die Adapter für tine20.org und Roundcube.
Code, damit das aktuelle Mediawiki mit dem SingleSignOn für TYPO3 funktioniert.

<?php
/*
* Signature-Based Single Sign-On Framework
* TPA Adapter for
* Mediawiki ( http://wikipedia.sourceforge.net )
*
*  Version            : 0.4
*  Last update        : 29.12.2009
*  License            : GPL
*
*  (c) Kay Strobach, Bannewitz, Germany
*  http://www.kay-strobach.de
*/

	//tell mediawiki, that it's startet properly
		define( 'MEDIAWIKI', true );
	//disable transactions -> there where problems with them ...
		define('DBO_TRX'   , false);
	//include libs
		$IP = dirname(__FILE__);
		include_once(dirname(__FILE__).'/includes/WebStart.php');
	//load db
		$wgDatabase = Database::newFromParams( $wgDBserver, $wgDBuser , $wgDBpassword, $wgDBname, 1 );

/**
 *  function which is called after including this file in the SSO-Agent.
 *
 *  @param
 *    User_Name    string    Username the Session will be created for
 *    remote_addr  string    Remoteaddress of the users system
 *    agent        string    Browser
 *    sso_url      string    Url where the user will be redirected after establishing a session for him
 *
 *  @return        string    return the session data
 *
 *  Leave stubs if you dont need all four params.
 */
	function sso($User_Name,$remote_addr,$agent,$sso_url,$sso_version="",$sso_action="",$sso_userdata="") {
		//do basic check
			if ($sso_version == "") return array("Error"=>"sso version out of date");
		//unpack userdata
			$sso_userdata   = process_userdata($sso_userdata);
		//init global vars
			global $wgDefaultUserOptionsEn;
			global $wgNamespacesToBeSearchedDefault;
			global $wgDeferredUpdateList;
			global $wgAuth;
			global $wgUser;
			global $wgLang;
			global $wgTitle;
			global $wgMemc;
			global $wgDBserver,$wgDBname,$wgDBuser,$wgDBpassword;
			global $wgCookieExpiration, $wgCookiePath, $wgCookieDomain;
			global $trans;
			global $wgInputEncoding;
			global $wgCapitalLinks;
			global $wgUseLatin1, $IP;
			global $wgDefaultUserOptions;
			global $wgLoadBalancer;
			global $wgContLang;
			global $wgVersion;
			global $wgRequest;
			global $wgDatabase;
			global $wgCommandLineMode;
			global $wgPostCommitUpdateList;

		// load configuration
			#include_once(dirname(__FILE__).'/index.php');
		// Memcached support; for the session setup, use the fake one
			//Language::loadLocalisation('en',true);
		//init auth plugin
			$wgAuth = new AuthPlugin();
		// Initialize MediaWiki base class
			$wgRequest = new WebRequest();
			$action = $wgRequest->getVal( 'action', 'view' );
			$title  = $wgRequest->getVal( 'title' );
		//react on action
			$User_Name = USER::getCanonicalName($User_Name,false);

			switch($sso_action){
				case 'create_modify':
					$wgUser = User::newFromName( $User_Name );
					if( is_null( $wgUser ) ) {
						return;
					}
					if($wgUser->idForName()==0) {
						$wgUser->addToDatabase();
					}
					//setup user credentials
					$wgUser->setName($User_Name);
					$wgUser->setEmail($sso_userdata['email']);
					$wgUser->setRealName($sso_userdata['name']);
					$wgUser->setPassword( md5(microtime(true)) );
					//trust the tpa email
					$wgUser->confirmEmail();
					//check wether user isAdmin -> if yes add to group admin

					//save user data
					$wgUser->saveSettings();
				break;
				// perform logon for given $User_Name
				case 'logon':
					//getUserId
						$wgUser = User::newFromName( $User_Name );
						if( is_null( $wgUser ) ) {
							return array("Error"=>"no account for this user - object not initiated");
						}
						$id = $wgUser->idForName();
					// check if user exists in db
						if ($id=="0") {
							// no user found, return error
							$error=array("Error" => "no account for this user - id==0");
							return $error;
						}
						else {
							$wgUser->setId( $id );
							$wgUser->loadFromDatabase();
							wfSetupSession();
							$wgUser->saveSettings();
							// valid username, start the session
							$wgUser->setOption( "rememberpassword", "0" );
							$wgUser->setCookies();

							// prepare sessiondata return-values
						    	// Sessiondata is stored in this Format :
						    	// Array(
						    	//	[redirecturl] => $redirecturl
						    	//	[0] => Array(
						    	//		"CookieName" => $cookiename
						    	//		"CookieValue" => $cookievalue
						    	//		"CookieExpires" => $expires
						    	//		)
						    	//	[1] => Array(
						    	//		"Cookiename" => $cookiename
						    	//		... and so on
						    	//		)
						    	// [1] if you need to pass more than one cookie
						    	//
								$return_val[0] = array();
						    	$return_val += array( "redirecturl" => $sso_url.'?'.session_name().'='.session_id());
						        #print_r($return_val);
								// pass session data to the SSO-Agent
						        #die('<a href="'.$return_val['redirecturl'].'">link</a>');
					        	return $return_val;
						}
				break;
			}
	}
/*
 * return the protocol version
 */
	function get_version(){
		return "2.0";
	}

/*
 * process the userdata string and return an associative array
 *
 * @param string $sso_userdata: the data from fe_users (pipe-separated)
 * @return array	$data: the userdata
 */
	function process_userdata($sso_userdata){
		$sso_userdata = split("\|",$sso_userdata);
		for ($i=0;$i<count($sso_userdata);$i++) {
			$sso_userdata[$i]=split("=",$sso_userdata[$i]);
			$data[$sso_userdata[$i][0]]=$sso_userdata[$i][1];
		}
		unset ($sso_userdata);
		return $data;
	}
?>

SingleSign on mit TYPO3

Wer schon mal mehrere Webapplikationen samt Nutzern verwalten musste kennt das leidige Thema, dass man ständig die Nutzer zwischen den Datenbanken synchronisieren muss.

Aus Sicht des Nutzers gibt es noch ein viel schlimmeres Problem. Der Nutzer muss sich mehrfach anmelden.

http://www.single-signon.com/ stellt eine einfache Lösung für TYPO3 zur Verfügung um SSO umzusetzen. Da die Dokumentation ziemlich gut ist, verzichte ich hier auf die Beschreibung der Installation des SSO Adapters für TYPO3 und konzentriere mich auf einige interessante Lösungen.

Bauen wir uns erstmal eine Seitenstruktur für unser Intranet

  • TYPO3 Template
    • Anwendungen (Übersicht mit Links zu SSO Adaptern
      • Tine20 SSO Adapter (wird später vorgestellt)
      • TYPO3 Backend SSO Adapter
      • Mantis SSO Adapter
      • Mediawiki SSO Adapter
      • PHPList SSO Adapter (wird später vorgestellt)

Die SSO Adapter sind jeweils als Weiterleitung auf die entsprechende Anwendung konfiguriert.

Umleitung auf verlinkten Bugreport mit SSO Authentifizierung im Mantis

Vorbereitungen in der config_inc.php vom Mantis:

$g_meta_include_file = '%absolute_path%/custom/meta_inc.php';
$g_logout_redirect_page			= 'custom_logout.php'; // enthält redirect auf {sso server}

Fügt man den folgenden Code nun in die custom/meta_inc.php ein (<?php ?> nicht vergessen), so werden anonyme Nutzer automatisch auf den SSO Adapter weitergeleitet und am Mantis authentifiziert. Natürlich landen Sie danach wieder auf der Seite mit dem zugehörigen Bugreport.

	if ( !auth_is_user_authenticated() ) {
		if($_GET['return']) {
			setcookie('SSOredir',$_GET['return'],time()+60);
		}
		header('Location: http://{sso server url}/anwendungen/mantis/');
	} else {
		if($_COOKIE['SSOredir']) {
			header('Location: http://{mantis server url}/'.$_COOKIE['SSOredir']);
			setcookie('SSOredir','',time() - 3600);
		}
	}

Umleitung auf verlinkten Bugreport mit SSO Authentifizierung im Mediawiki

Auch bei Mediawiki läßt sich das obige Verhalten erreichen. dazu benötigen wir eine Mediawiki Extension diese wird in der Localsettings.php eingetragen

require_once($IP.'/extensions/RedirectToSSO/index.php');

In der Datei extensions/RedirectToSSO/index.php wird nun der Code zur Detection einer Anmeldung hinterlegt:

	$wgExtensionCredits['RedirectToSSO'][]= array(
		'name'         => 'Redirect SSO',
		'version'      => '1.0.0',
		'author'       => 'Kay Strobach',
		'url'          => 'http://www.kay-strobach.de/',
		'description'  => 'redirect to sso adapter.'
	);
	$wgHooks['UserLoadFromSession'][] = 'RedirectToSSO';
	$wgCacheVaryCookies[] = 'SSOredir';

	function RedirectToSSO($user, &$result ) {
		global $wgOut, $wgPageToRedirectAfterLogout;
		if($_SESSION['wsUserID']==0) {
			$_SESSION['SSOredir'] = $_SERVER['REQUEST_URI'];
        	$wgOut->redirect('http://{sso server url}/anwendungen/mediawiki/');
		} else {
			if($_SESSION['SSOredir']) {
				header('Location: http://{mediawiki server url}'.$_SESSION['SSOredir']);
				$_SESSION['SSOredir'] = '';
				#setcookie('SSOredir','',time() - 3600);
				die();
			}
		}
		return true;
	}

Dummerweise werden Nutzer nach dem Klicken auf Logout noch nicht wieder auf die Seite mit der Anwendungsübersicht weitergeleitet. Das Lässt sich in Mediawiki mit der Extension redirectAfterLogout erreichen.

$wgPageToRedirectAfterLogout = '{sso server url}/anwendungen/';
require_once($IP.'/extensions/redirectAfterLogout/redirectAfterLogout.php');

TYPO3 tt_news conditional [more] link

In a current project i was asked to modify the latest view of tt_news so that the more link is only displayed if needed (that means no bodytext, but can be other condition as well).
After a question on the english newsgroup i got a small hint:

http://typo3.org/documentation/document-library/extension-manuals/tt_news/3.0.1/view/1/4/#id2513502
Look for “Conditional more link”

plugin.tt_news.displayList.subheader_stdWrap {
    append = TEXT
    append.data = register:newsMoreLink
    append.wrap = <span>|</span>
    append.if.isTrue.field = bodytext
}

After some research i found out that it’s also possible to ensure that the tt_news title is not linked. Therefore I used a not documented register.

plugin.tt_news.displayLatest.subheader_stdWrap {
    append = TEXT
    append.data = register:newsMoreLink
    append.wrap = <span>&nbsp;|</span>
    append.if.isTrue.field = bodytext
    parseFunc < lib.parseFunc_RTE
    stripHtml = 0
    removeBadHTML = 1
}
plugin.tt_news.displayLatest.title_stdWrap {
    typolink.parameter.data = register:newsMoreLink_url
    typolink.parameter.if.isTrue.field = bodytext
}

It’s pretty cool to have a twitter like view if there is not so much information in a newsarticle. To see a live example take a look on http://dil.inf.tu-dresden.de

Webbased Softwareupdatemanagement

Hier folgt nun der aktuelle Stand zum Softwareupdatemanager:

  • Refactoring
  • Bessere Struktur
  • Events

Ideen für die nächste Version:

  • Refactoring Update

Download Url:

Hier folgt nun der aktuelle Stand zum Softwareupdatemanager:

  • Umstellung auf ExtJS Grids
  • Asynchrones Laden der Versionen
  • Reduktion der Ladezeiten
  • Direkter Zugriff auf Adminpanele, Releasenotes und mehr

Ideen für die nächste Version:

  • Upload wird mit Statusbalken aktualisiert (wird in der Session verwaltet, in dem am Anfang ein rekursiver Durchlauf durch das Uploadverzeichnis durchgeführt wird und dann alles hochgeladen wird.)
  • zip-Prüfung mit crc32 oder md5 (Problem, wird nicht von allen Projekten zur Verfügung gestellt)
  • Umleitung zum Installer oder Upgradeskript des Aktualisierten Programms

Anbei nun noch ein Screencast vom aktuellen Entwicklungsstand:

« Vorherige SeiteNächste Seite »