Modale Fenster und Dialoge im CommunityServer

Monday, May 18, 2009 8:18:52 AM (Mitteleuropäische Sommerzeit, UTC+02:00)

Modales Dialoge sind eine sehr gute Möglichkeit um mit dem Benutzer zu interagieren ohne den aktuellen Kontext zu verlassen. Meiner Meinung nach, eignen sich im Webbereich am besten Lösungen die auf CSS und JavaScript basieren. Ein gutes Beispiel ist SimpleModal welches auf jQuery basiert. Im ASP.NET Ajax Control Toolkit gibt es das ModalPopup, mit dem sich ebenfalls modale Fenster oder Dialoge gestalten lassen.
Kürzlich stand ich vor der Aufgabe einen solchen modalen Dialog in den CommunityServer zu integrieren. Ich schaute mir verschiedene jQuery Lösungen an, um herauszufinden, welche am besten geeignet ist.
Schließlich entdeckte ich, das der CommunityServer eine eigene Lösung mitbringt die in einem Servercontrol gekapselt ist.
Der folgende Code stellt einen Button bereit, mit dem ein modales Fenster angezeigt werden kann, indem eine andere Webseite steckt:

<CS:ModalButton ID="ModalButton1" runat="server" Url="http://dotnet-snippets.de" Text="Modal Demo" Width="800" Height="600" />

ModalDemo

Diese Lösung ist nur dann geeignet, wenn nur etwas anzeigt werden soll. Möchte man den Dialog nutzen um Entscheidungen vom Benutzer abzufragen, oder um zum Beispiel einen Fileupload Dialog anzubieten, benötigt man ein wenig JavaScript um an den Rückgabewert heran zukommen. Der folgende Code öffnet ein modales Fenster, in dem eine normale aspx Seite steckt und übergibt die Parameter "id" und "startdate". Die Parameter 800 und 600 geben die Größe des Fensters in Pixel an. Es wird außerdem eine Callback Methode angegeben, die aufgerufen wird, wenn das Fenster geschlossen wird:

<script type="text/javascript">
function OpenWindow(id, startdate) {
Telligent_Modal.Open("DynamicContent.aspx?ID=" + id + "&startdate=" + startdate, 800, 600, onCloseFunction);
}
</script>

In der aspx Seite DynamicContent.aspx ist ein kleines JavaScript, das dafür verantwortlich ist den Rückgabewert zurückzugeben:

<script type="text/javascript">
function CloseWindow(returnValue) {
window.parent.Telligent_Modal.Close(returnValue);
}
</script>


Die Modalen Fenster im CommunityServer können über eine zentrale CSS Datei gestylt werden und haben so alle die gleiche Optik.

Kick it on dotnet-kicks.de

Einfacher Formularspamschutz mit JavaScript

Thursday, April 23, 2009 4:52:20 PM (Mitteleuropäische Sommerzeit, UTC+02:00)

Im dotnet-forum.de kommt es immer wieder vor, das sich Spammer registrieren. Diese Spammer registrieren sich unter zufällig erzeugten Namen und das war’s. Sie posten nichts und hinterlassen nicht einmal einen Link im Profil. Was die Spammer mit diesen Registrierungen erreichen wollen, ist mir ein Rätsel. Sicher ist nur, dass diese Anmeldungen manuell durchgeführt werden, das habe ich durch ein paar Experimente herausgefunden. Was die Spammer scheinbar noch nicht mitbekommen haben, ist, dass sie nach wenigen Minuten verbannt werden. Ein verbannter User kann sich nicht einmal anmelden. Das automatische Verbannen erreiche ich mit Hilfe eines Spamfilters, den ich für den CommunityServer entwickelt habe. Der Filter findet bekannte Spamadressen über einen externen Dienst und nutzt zusätzlich eine Blacklist, die ich selbst pflege. Somit arbeitet er sehr zuverlässig. Diesen Spamfilter habe hier schon einmal vorgestellt.

Im zweiten Schritt der Spambekämpfung habe ich etwas früher angesetzt, damit die Spammer sich erst gar nicht anmelden können. Ich habe nach einer Lösung gesucht, mit der ich Personen aussperren kann, die kein Deutsch können. Das hat nichts mit meiner politischen Einstellung zu tun, sondern damit, dass Spammer oft aus Ländern kommen, in denen die Arbeitskraft wenig kostet…

Zur Lösung des Problems gab mir Thomas einen entscheidenden Tipp. Er hat eine serverseitige Lösung mit dem Namen The Riddle entwickelt. Der User, der das Formular absenden möchte, muss zwei Zahlen addieren und das Ergebnis ausgeschrieben in eine TextBox eintragen. Damit setzt man voraus, dass der User etwas deutsch kann und ggf. auch mit Umlauten umgehen kann. Zuerst wollte ich die Lösung von Thomas übernehmen, habe mich aber später dafür entschieden, eine clientseitige Variante davon zu entwickeln. Das hat den Vorteil, dass Assemblys des zugrunde liegenden Systems (im meinem Fall CommunityServer) nicht angefasst werden müssen. Es wäre auch auf nicht-.NET Systeme leicht übertragbar.

Spamschutz

Bei meiner Lösung ist der Absende-Button deaktiviert wenn das Formular geladen wird, hat man das Ergebnis richtig ausgeschrieben, wird der Button aktiviert und das Registrierungsformular kann abgesendet werden.

Es folgt das kurze JavaScript:

var numbers = new Array("null", "eins", "zwei", "drei", "vier", "f&uuml;nf", "sechs", "sieben", "acht", "neun", "zehn", "elf", "zw&ouml;lf", "dreizehn", "vierzehn", "f&uuml;nfzehn", "sechzehn");
var number1;
var number2;
var SendButtonID = ""; // ID des Absende - Buttons eintragen!

function InitializeRiddle() {
number1 = GetRandomNumber();
number2 = GetRandomNumber();
document.getElementById("task").innerHTML = "<b>Spamschutz: Addiere " + numbers[number1] + " und " + numbers[number2] + " !</b><br />Das Ergebnis muss <b>ausgeschrieben</b> werden.<br />Beispiel: sieben und sechs ergeben dreizehn!";
}

function CheckResult() {
var result = number1 + number2;
var resultToCheck = document.getElementById("result").value.toLowerCase();
resultToCheck = resultToCheck.replace(/ö/g, '&ouml;');
resultToCheck = resultToCheck.replace(/ü/g, '&uuml;');

if (numbers[result] == resultToCheck) {
document.getElementById(SendButtonID).disabled = false;
}
else {
document.getElementById(SendButtonID).disabled = true;
}
}

function GetRandomNumber() {
var randomNumber = Math.random();
randomNumber = 8 * randomNumber;
randomNumber = Math.round(randomNumber);
return randomNumber;
}

Den Spamschutz kann hier ausprobiert werden.

Fazit: So ein Schutz kann es den Spammern immer nur erschweren ihr Vorhaben umzusetzen und somit hab ich auch die Spammer nicht vollständig aussperren können. Es war allerdings ein deutlicher Rückgang an russischen und indischen Registrierungen spürbar. Außerdem schützt es das Forum vor Usern die nicht 6 und 7 addieren können ;-)

Kick it on dotnet-kicks.de

Geburtstags-Erweiterung für CommunityServer 2007

Friday, October 03, 2008 9:11:06 PM (Mitteleuropäische Sommerzeit, UTC+02:00)

Im CommunityServer hat jeder User die Möglichkeit, in seinem Profil sein Geburtsdatum einzugeben. Dieses Datum wird dann im Profil des Users angezeigt.
In vielen anderen Foren und Social Networking Sites, wie zum Beispiel Xing, werden die Geburtstagskinder auf der Startseite angezeigt. Diese Idee fand ich sinnvoll für das dotnet-forum.de. Da ich keine passende Erweiterung für den CommunityServer gefunden habe, habe ich dieses in Form eines Usercontrols entwickelt:

birthday


Wer das Control im CommunityServer einsetzen möchte, kann mich gern kontaktieren.

Kick it on dotnet-kicks.de

Stop Forum Spam Modul für CommunityServer 2007

Sunday, August 10, 2008 12:56:34 PM (Mitteleuropäische Sommerzeit, UTC+02:00)

Seit einigen Wochen gab es im dotnet-forum.de tägliche mehrere Anmeldungen mit merkwürdigen Benutzernamen. Die Emailadressen dieser User endeten mit .ru oder .in.
Rainer hatte mich auf die  Internet Spam Datenbank Stop Forum Spam aufmerksam gemacht, in der solche Spam User gesammelt werden. Darauf hin habe ich mir diese Webseite einmal genauer angesehen. Mir war aufgefallen, dass es dort eine einfache API gab, mit der die Emailadressen kontrolliert werden können. Für einige PHP Foren gab es schon passende Erweiterungen um Spam User zu identifizieren. Thomas Freudenberg und ich, haben kurzerhand eine Erweiterung für den CommunityServer 2007 geschrieben, welche im Abstand von 15 Minuten alle neuangemeldeten User mit Hilfe dieser API kontrolliert.
Wurde ein User als Span User identifiziert, wird er verbannt. Das bedeutet, der User existiert weiterhin im Forum, jedoch kann er sich nicht mehr anmelden und somit keinen Schaden anrichten.
Im Event log des Forums kann man gut beobachten, wann sich der User registriert hat und wann er verbannt wurde:

StopForumSpamEventLog

Wer das Modul im CommunityServer nutzen möchte, kann es sich kostenlos herunterladen. Die Installation ist sehr einfach. Es müssen nur 2 config Dateien editiert und eine DLL kopiert werden. Eine Installationsanleitung ist im Download enthalten.

Download Stop Forum Spam Modul für CommunityServer 2007

Kick it on dotnet-kicks.de

dotnet-forum.de mit eigener Knowledge Base

Monday, June 09, 2008 8:04:00 AM (Mitteleuropäische Sommerzeit, UTC+02:00)

Im dotnet-forum.de gibt es ab sofort eine eigene  Knowledge Base. Die Knowledge Base ist eine strukturierte Sammlung von Fachartikeln aus den Bereichen .NET-Entwicklung, IT-Professional und Testberichten von Büchern und Entwicklersoftware.

Die Knowledge Base bietet gegenüber dem Forum einige Vorteile:

1. Artikel können mit dem Windows Live Writer veröffentlicht werden
2. Artikel können kommentiert werden, diese Kommentare können vom Autor moderiert werden
3. Artikel können von den Lesern bewertet werden
4. Die Kategorien der Knowledge Base können jederzeit flexibel angepasst werden
5. Es gibt RSS Feeds für jeden Autor und für jede Kategorie

Die Knowledge Base würde von Alex Bierhaus und Jan-Cornelius Molnar vom VB-Magazin.de entwickelt und uns freundlicherweise zu Verfügung gestellt. Jan und Alex haben bei der Entwicklung großen Wert darauf gelegt, die die neuen Sprachfeatures von VB 9.0 wie zum Beispiel Linq einzusetzen um so eine performante und skalierbare Anwendung zu schaffen die sich gut in den CommunityServer integrieren lässt.

Vielen Dank an Alex und Jan!

Zu erreichen ist die Knowledge Base unter diesem Link: http://dotnet-forum.de/KnowledgeBase/

Kick it on dotnet-kicks.de

CommunityServer: A non zero-length string is required.

Tuesday, May 13, 2008 9:32:01 PM (Mitteleuropäische Sommerzeit, UTC+02:00)

Heute wollte ich den RSS Reader vom CommunityServer ausprobieren, leider bekam ich nur die übliche CommunityServer Fehlermeldung:  „Oops something went wrong!“.
Um die Ursache des Problems zu herauszubekommen, hab ich zuerst das Debugging in der Web.config aktiviert:

serverfehler

Der Fehler ist in der RSS.NET Dll aufgetreten, die vom CommunityServer verwendet wird. Genauer gesagt, im Konstruktor der Klasse RssChannel:

public RssChannel(string title, string description, Uri link)
{
    :
    if (description.Length == 0)
    {
        throw new ArgumentException("A non zero-length string is required.", description);
    }
    :
} 

Mit Lutz Röders Reflector habe ich in der CommunityServer.Reader.dll den passenden Aufruf gefunden:

RssChannel channel = new RssChannel(current.SiteSettings.SiteName + ", Folder: " + str, current.SiteSettings.SiteDescription, new Uri(current.CurrentUri.ToString().Replace("rss.ashx", "default.aspx")));

Es wurde in meinem Fall ein Leerstring an die RSS.NET DLL übergeben, weil ich in den Systemeinstellungen des CommunityServers keine Seitenbeschreibung eingegeben habe.

Abhilfe schafft also momentan nur das Eingeben einer Seitenbeschreibung.
Ich habe den Fehler an Telligent weitergegeben. Ich bin gespannt, ob der Fehler noch behoben wird, da seit kurzem die Version 2008 verfügbar ist.

Kick it on dotnet-kicks.de