Archiv der Kategorie: Code snippets

AngularJS ng-pattern mit CamelCase Pattern als Beispiel


AngularJS bietet die unterschiedlichsten Direktiven zum Validieren von Eingabefeldern an und darunter befindet sich auch die Direktive “ng-pattern” mit der Eingabewerte über Reguläre Ausdrücke validiert werden können. Da ich mit Regulären Ausdrücken nicht so viel zu tun habe, habe ich mich bei der ersten Verwendung etwas schwer getan und leider gab es auch kein direktes Beispiel in der Dokumentation.

Ich habe mir einen Regulären Ausdruck erstellt der prüfen soll ob die Eingabe in “CamelCase” Schreibweise eingegeben wurde.

Regulärer Ausdruck:  /^((^[A-Z][a-z0-9]+)([A-Z][a-z0-9]+)*)$/

Wenn hier jemand eine effektiveren Ausdruck kennt dann freue ich mich sehr über einen passenden Kommentar.

In AngularJS kann der Reguläre Ausdruck direkt dem “ng-pattern” übergeben werden

<input type="text" 
             name="ccName" 
             data-ng-model="ViewModel.CamelCaseName" 
              data-ng-pattern="/^((^[A-Z][a-z0-9]+)([A-Z][a-z0-9]+)*)$/" 
              placeholder="Enter CamelCase String">

oder man speichert ihn im Controller in einer Variablen und übergibt diese dem “ng-pattern”. Achtung um das Regex Pattern keine Anführungszeichen setzen!

...
  $scope.ViewModel = {
        CamelCaseName: "TestCamleCase",
        CamelCasePattern: /^((^[A-Z][a-z0-9]+)([A-Z][a-z0-9]+)*)$/
    };
...

im “ng-pattern” die Variable setzen statt des Patterns.

<input type="text" 
             name="ccName" 
             data-ng-model="ViewModel.CamelCaseName" 
              data-ng-pattern="ViewModel.CamelCasePattern"
              placeholder="Enter CamelCase String">

Zum Erstellen und überprüfen von Regulären Ausdrücken verwende ich auch gern die folgende Webseite:

https://regex101.com/r/gM3qM0/1#javascript

Das ganze Codebeispiel findet man auch wieder in Codeplex.

Advertisements

System.Web.Helpers.Crypto – PasswortHash, Salt


Oft kommt man in die Verlegenheit Funktionen selbst zu schreiben, weil man nicht weiß das es hier z.B. bereits fertige Funktionen direkt vom .NET Framework gibt. Dazu gehört auch die Klasse Crypto. Diese Klasse stellt uns ein paar nette Funktionen zur Verfügung um einen Passwort Hash bzw. den Salt für Passwörter zu erstellen und ein Passwort auf seine Richtigkeit zu prüfen.

//Erstellen des Salts und des PW Hashes
string passwordSalt = Crypto.GenerateSalt();
string passwordHash = Crypto.HashPassword(string.Format("{0}{1}", "Das Password", passwordSalt));

//Logindaten Prüfen ob Hash mit PW übereinstimmt
if (Crypto.VerifyHashedPassword(passwordHash, string.Format("{0}{1}", "Das Password", passwordSalt)))
{
        //Login Success
}
 

So einfach kann es sein sich den Hash bzw. einen zufälligen Salt erstellen zu lassen.

Wer noch einmal nachlesen will/muss, warum man Passwörter nicht im Klartext ablegt, sondern als Hashwert speichert und man zusätzlich noch einen Salt verwendet, der kann hier das ganze noch einmal nachlesen.

C# Bitmaske mit Enum (Flags Attribute)


Bisher habe ich noch nie Gebrauch von einer Bitmaske gemacht, aber heute musste ich mich kurz mit der Thematik auseinandersetzten und wollte hier kurz zeigen was zu welchem Ergebnis führt, wenn man mit einer Bitmaske und einem Enum mit dem “Flags” Attribut arbeitet.

Als Beispiel habe ich mir ein Enum mit den Wochentagen Montag bis Sonntag erstellt, hier darf das Attribut “Flags” nicht vergessen werden, denn nur dann kann mit den Werten Bitweise gerechnet werden. (Was Bitweise genau bedeutet findet man im Netz genug Beispiele.)

[Flags]
public enum WeekDays
{
    Mon = 1,
    Tue = 2,
    Wed = 4,
    Thu = 8,
    Fri = 16,
    Sat = 32,
    Sun = 64
}

Ich werde im Folgenden einfach ein paar Beispiele Zeigen wie man z.B. Wochentage zu einer Weekdays Variable hinzufügt, entfernt und überprüft ob ein einzelner Wochentag enthalten ist oder mehrere Wochentage.

//Tage zu unserer Variablen hinzufügen
WeekDays days = WeekDays.Mon;
days |= WeekDays.Tue;
days |= WeekDays.Fri;
//geht auch so:
//WeekDays days = WeekDays.Mon |  WeekDays.Tue | WeekDays.Fri;

//Prüfen ob der "Tue" in unseren Tagen enhalten ist.
if (days.HasFlag(WeekDays.Tue))
{
    //Unsere Tage als Int ablegen um z.B. in der Db zu speichern
    int daysAsInt = ((int)days);

    //Unseren Int wert wieder umwandeln in die Tage die wir ausgewählt hatten
    WeekDays daysFromInt = (WeekDays)daysAsInt;

    //Prüfen ob unser umgewandelter Intwert auch noch den Freitag enthält
    if (daysFromInt.HasFlag(WeekDays.Fri))
    {
        //Wird erreicht, da der Freitag noch enthalten ist.
        string found = "found";
    }

    //Prüfen ob der Donnerstag enthalten ist.
    if (daysFromInt.HasFlag(WeekDays.Thu))
    {
        //Wird nicht erreicht, da kein Donnerstag enthalten ist.
        string notFound = "notFound";
    }
}

//Prüfen ob genau diese drei Tage enhalten sind
if (days == (WeekDays.Mon | WeekDays.Tue | WeekDays.Fri))
{
    //Wird erreicht, da genau die drei Tage enthalten sind.
    string allRights = "alle Tage enthalten";
}

//Prüfen ob genau diese beiden Tage enthalten sind
if (days == (WeekDays.Mon | WeekDays.Tue))
{
    //Wird nicht erreicht, da der "Fri" Fehlt und die
    //Objekt damit nicht gleich sind
    string allRights = "nicht alle Tage enthalten";
}

//Prüfen ob alle Tage enthalten sind
if (days == (WeekDays.Mon | WeekDays.Tue | WeekDays.Fri | WeekDays.Sat))
{
    //Wird nicht erreicht da ein Tag zuviel gesucht wird "Sat"
    string allRights = "nicht ein Tag enthalten";
}

//Prüfen ob in unserer Tageliste einer der drei Tage enthalten ist,
//da "Mon" enthalten ist, wird daysCheck1 größer 0 sein
WeekDays daysCheck1 = (days & (WeekDays.Mon | WeekDays.Sun| WeekDays.Sat));
if (daysCheck1 != 0)
{
    //Wird erreicht, da mind. einer der Tage "Mon" enthalten ist.
    string allRights = "mind ein Tag enthalten";
}

//Prüfen ob in unserer Tagesliste einer der drei Tage enthalten ist,
//da keiner der Tage enthalten ist wird daysCheck2 gleich 0 sein.
WeekDays daysCheck2 = (days & (WeekDays.Wed | WeekDays.Sun | WeekDays.Sat));
if (daysCheck2 != 0)
{
    //Wird nicht erreicht, da keiner der Tage enthalten ist.
    string allRights = "kein Tag enthalten";
}

//Direktes Prüfen ob "Mon" und "Tue" in der Liste enthalten sind.
if ( (days & (WeekDays.Mon | WeekDays.Tue)) != 0)
{
    //Wird erreicht, da mind. einer der Tage enthalten ist.
    string allRights = "alle Tage enthalten";
}

//Entfernen eines Tages
days -= WeekDays.Tue;

//Prüfen ob der Tag noch enthalten ist.
if (days.HasFlag(WeekDays.Tue))
{
    //Wird nicht erreicht, da kein Dienstag mehr enthalten ist.
    string notFound = "notFound";
}

C# WebClient Klasse


Um einfache Webanfragen zu erstellen ist die WebClient Klasse von C# hervorragend geeignet. Denn mit Ihr kann man z.B. Problemlos Formulardaten absenden oder Webseiten herunterladen.

1. Versenden von POST Daten

Die benötigten Formulardaten die man für den Post Prozess benötigt, kann man sehr einfach mit Firefox und Firebug auslesen unter dem Tab “Netzwerk”. Hier kann man für einen POST sehr einfach die benötigten Parameter auslesen.

image

Mit diesen Daten füllt man eine “NameValueCollection” und kann dann die Daten per POST absenden mit Hilfe der WebClient Klasse.

WebClient web = new WebClient();
//Wenn es sich z.B. um eine Seite mit WindowsAuthentifizierung handelt im lokalen Netzwerk,
//dann kann man hier die DefaultCredentials verwenden
//web.Credentials = CredentialCache.DefaultCredentials;

//Die POST Parameter erstellen die mit übergeben werden müssen, lassen sich z.B: sehr leicht per Firebug ermitteln
NameValueCollection param = new NameValueCollection();
param.Add(&quot;submit&quot;, &quot;Anmelden&quot;);
param.Add(&quot;send&quot;, &quot;send&quot;);
param.Add(&quot;sid&quot;, &quot;&quot;);
param.Add(&quot;l_username&quot;, &quot;yourUserName&quot;);
param.Add(&quot;l_password&quot;, &quot;YourPassword&quot;);

string url = &quot;http://www.mycsharp.de/wbb2/login.php&quot;;
byte[] responsebytes = web.UploadValues(url, &quot;POST&quot;, param);
//Der ResponseStream enthält die Webseite die nach dem Login aufgerufen bzw. angezeigt wird.
string responsebody = System.Text.Encoding.Default.GetString(responsebytes);
Console.Write(responsebody);

2. Herunterladen von Bildern

Genauso einfach wie man Formulardaten absenden kann ist es die Bilder einer Webseite herunterzuladen. Hier muss als erstes die Webseite als HTML Gerüst heruntergeladen werden und mit Hilfe der Codeplex Bibliothek Html Agility Pack kann die HTML Seite ganz einfach mit Hilfe von XPath Ausdrücken geparst werden. Mit dem passenden XPath Ausdruck suchen wir uns einfach alle “img” Elemente der Webseite heraus und laden diese herunter und speichern diese lokal ab.

//z.b. Alle Bilder von einem Meiner Blogeinträge herunterladen
string url = &quot;https://squadwuschel.wordpress.com/2012/08/09/ef5-model-first-datenbank-updates-vs-2012/&quot;;
WebClient downloadHtml = new WebClient();
//Erst das HTML Gerüst der Webseite herunterladen und in einen String Umwandeln
byte[] htmlpage = downloadHtml.DownloadData(url);
string content = System.Text.Encoding.Default.GetString(htmlpage);

//Das HTML Agilit Pack verwenden um den HTML Code zu parsen
//http://htmlagilitypack.codeplex.com/
HtmlDocument document = new HtmlDocument();
document.LoadHtml(content);

//Mittels XPath Ausdruck alle Images auf der Seite heraussuchen
foreach (HtmlNode img in document.DocumentNode.SelectNodes(&quot;//img/@src&quot;))
{
    //Den Pfad für das Bild ermitteln.
    string path = img.Attributes[&quot;src&quot;].Value;
    Uri link = new Uri(path);
    try
    {
        //Direkter Download der Datei
        downloadHtml.DownloadFile(path, string.Format(&quot;c:\\Temp\\image-{0}.png&quot;, ++Counter));
    }
    catch (Exception exception)
    {
        Console.WriteLine(&quot;Das Bild mit der Adresse '{0}' konnte nicht heruntergeladen werden.&quot;, link);
    }
}


Console.WriteLine(&quot;Download Fertig&quot;);
Console.ReadLine();

3. Webseiten Status mit WebRequest prüfen

Prüfen ob eine Webseite erreichbar ist mit Hilfe von WebRequest und HttpWebResponse

//Prüfen ob mein Blog erreicht werden kann
string url = &quot;https://squadwuschel.wordpress.com/2012/08/09/ef5-model-first-datenbank-updates-vs-2012/&quot;;
try
{
    //Prüfen ob die Webseite erreicht werden kann.
    WebRequest request = WebRequest.Create(url);
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    if (response.StatusCode == HttpStatusCode.OK)
    {
        Console.WriteLine(&quot;STATUS - OK&quot;);
        return true;
    }
    else
    {
        Console.WriteLine(&quot;Aktueller Status '{0}'&quot;, response.StatusCode);
    }

}
catch (Exception exception)
{
    Console.Write(exception);
}

return false;

Codeplex:

Dann unter “Source Code” –> “Browse” –> “Testprojekte” –> “WebClientTest”, dabei handelt es sich um eine einfache Konsolenanwendung.

Windows Freigabe (Share) erstellen und Berechtigungen zuweisen


Diese Tage habe ich eine kurze Recherche durchgeführt, wie man unter .NET eine Freigabe mit bestimmten Berechtigungen erstellt und habe dann das folgende Beispiel erstellt. Ich habe das Beispiel nicht in einer Domain testen können, sondern nur mit einem lokalen Benutzerkonto.

1. Anlegen einer Windows Freigabe

//Anlegen einer Freigabe auf dem lokalen Rechner
//Als erstes ein Verzeichnis anlegen.
Directory.CreateDirectory(@"C:\TestingFolder");

ManagementClass management = new ManagementClass("Win32_Share");
ManagementBaseObject input = management.GetMethodParameters("Create");
ManagementBaseObject output;

//Die Einstellungen für die Freigabe vornehmen
input["Description"] = "My Shared Folder";
input["Name"] = "My Shared Folder";
input["Path"] = @"C:\TestingFolder";
input["Type"] = 0x0; 

//Weitere Freigabetypen
// DISK_DRIVE = 0x0
// PRINT_QUEUE = 0x1
// DEVICE = 0x2
// IPC = 0x3
// DISK_DRIVE_ADMIN = 0x80000000
// PRINT_QUEUE_ADMIN = 0x80000001
// DEVICE_ADMIN = 0x80000002
// IPC_ADMIN = 0x8000003

//Anlegen der Freigabe
output = management.InvokeMethod("Create", input, null);
if ((uint)(output.Properties["ReturnValue"].Value) != 0)
{
    throw new Exception("Unable To Share The Directory");
 }
 else  {
     Console.WriteLine("Directory Successfully Shared");
 }

2. Zuweisen von Freigabeberechtigungen zu unserer Freigabe

Achtung, beim Zuweisen der Freigabeberechtigungen, gehen alle “alten” Freigabeberechtigungen verloren.

//Berechtigungen für die eben angelegte Freigabe setzten
//Anlegen der Freigabe für einen domainaccount
//NTAccount account = new NTAccount("domainname", "username");
//Anlegen der Freigabe für einen lokalen account
NTAccount account = new NTAccount("squadwuschel");
SecurityIdentifier sid = (SecurityIdentifier)account.Translate(typeof(SecurityIdentifier));
byte[] sidArray = new byte[sid.BinaryLength];
sid.GetBinaryForm(sidArray, 0);

ManagementObject Trustee = new ManagementClass(new ManagementPath("Win32_Trustee"), null);
//Wenn das ganze für eine Domaine sein soll diese hier mit angeben
//Trustee["Domain"] = "domainname";
Trustee["Name"] = "squadwuschel";
Trustee["SID"] = sidArray;

ManagementObject AdminACE = new ManagementClass(new ManagementPath("Win32_Ace"), null);
AdminACE["AccessMask"] = 2032127;
AdminACE["AceFlags"] = 3;
AdminACE["AceType"] = 0;
AdminACE["Trustee"] = Trustee;

ManagementObject secDescriptor = new ManagementClass(new ManagementPath("Win32_SecurityDescriptor"), null);
secDescriptor["ControlFlags"] = 4; //SE_DACL_PRESENT
secDescriptor["DACL"] = new object[] { AdminACE };

//Den Pfad zum share angeben, den wir oben angelegt haben und den Namen des Shares angeben
ManagementObject share = new ManagementObject(@"\\squadwuschel-pc\root\cimv2:Win32_Share.Name='My Shared Folder'");
share.InvokeMethod("SetShareInfo", new object[] { Int32.MaxValue, "My Shared Folder", secDescriptor });

3. Quellen

http://howtoideas.net/how-to-create-a-shared-folder-using-c

http://blogs.msdn.com/b/helloworld/archive/2008/06/06/programmatically-configuring-permissions-on-a-share-in-c.aspx