Kalender in ownCloud importieren

Wenn man ownCloud benutzt wird man feststellen das es in der Kalender App offensichtlich keine Option gibt um einen Kalender zu importieren. Allerdings ist dies durchaus möglich, die Möglichkeit ist bloß etwas versteckt.

Der Import der Kalenderdatei

Der Import der Kalenderdatei

Um eine Kalenderdatei (z.B. eine „feiertage.ics“) zu importieren, muss diese im ersten Schritt unter „Dateien“ hochgeladen werden. Wenn man nun auf diese Datei klickt, öffnet sich der entsprechende Importdialog in welchem man auch den entsprechenden Kalender auswählen kann. Nach der Bestätigung werden die Einträge importiert.

Hash von einem beliebigen .NET Objekt erzeugen

Unter .NET gibt es an jedem Objekt die Methode „GetHashCode“ welche einen HashCode zurückliefert. Das Problem an dieser Methode ist jedoch das sie vom Objekt selbst implementiert werden muss. Möchte man nun eine Methode mit der man jedes Objekt generisch hashen kann, so ist diese Funktion hilfreich:

public string GetSHA1HashFromObject(object obj)
{
	SHA1CryptoServiceProvider sha1Provider=new SHA1CryptoServiceProvider();
	DataContractSerializer serializer=new DataContractSerializer(obj.GetType());

	using(MemoryStream memoryStream=new MemoryStream())
	{
		serializer.WriteObject(memoryStream, obj);
		sha1Provider.ComputeHash(memoryStream.ToArray());
		return Convert.ToBase64String(sha1Provider.Hash);
	}
}

Die Funktion serialisiert dabei das Objekt und hasht anschließend das serialisierte Objekt. Damit ist es egal, welches Objekt in die Funktion gegeben wird.

Probleme beim Ändern des Passwortes unter ownCloud

Wer unter der aktuellen Version von ownCloud (5.0.7) versucht das Passwort des angemeldeten Nutzers zu ändern, kann durchaus mit der Meldung:

Class 'OCA\Encryption\Util' not found at /www/htdocs/owncloud/settings/ajax/changepassword.php#31

beglückt werden. Der Fehler tritt immer dann auf wenn die App „Encryption“ nicht aktiv ist und man das Passwort ändern möchte. Um den Fehler zu umgehen gibt es zwei Möglichkeiten. Die erste Möglichkeit ist die Aktivierung der entsprechenden App um anschließend das Passwort zu ändern. Die zweite Möglichkeit ist es den Patch welcher im Bugreport verlinkt ist, in die eigene ownCloud Version zu integrieren. Danach klappt es mit dem Passwortwechsel.

Mails von anderen Postfächern einsammeln

Seit einiger Zeit möchte ich gerne von Diensten wie Google Mail und Co. wegkommen. Dazu tragen mittlerweile auch die Enthüllungen aller PRISM und Tempora bei. Ein Feature welches sich bei Google Mail als sehr praktisch erwiesen hat, ist das Einsammeln von der Mails anderer Mailkonten. Nun ist es nicht so das es sich bei diesem Feature um Magie handelt, so das es Nahe lag das ganze in PHP nachzubauen:

<?php
  //Licensed under AGPL
  //by seeseekey

  //Configuration
  //Accounts to collect
  $collectAccounts[""]["server"]="{mail.example.org/novalidate-cert}INBOX";
  $collectAccounts[""]["username"]="user";
  $collectAccounts[""]["passwort"]="secret";

  $collectAccounts[""]["server"]="{mail.example.org/novalidate-cert}INBOX";
  $collectAccounts[""]["username"]="user";
  $collectAccounts[""]["passwort"]="secret";

  //Target server
  $targetServer = "{mail.example.org/ssl/novalidate-cert}";
  $targetUsername = "user";
  $targetPassword = "secret";

  //Operate
  $mboxTarget = imap_open($targetServer, $targetUsername, $targetPassword) or die ("Failed with error: " . imap_last_error());

  //Quellpostfächer öffnen
  while (list($key,$value) = each($collectAccounts))
  {
    $mboxSource = imap_open($value["server"], $value["username"], $value["passwort"]) or die ("Failed with error: ".imap_last_error());
    $mailboxInformation = imap_check($mboxSource);
    $overviewSourceMailBox = imap_fetch_overview($mboxSource, "1:{$mailboxInformation->Nmsgs}", 0);

    //Create folder
    imap_createmailbox($mboxTarget, imap_utf7_encode("$targetServer$key"));

    foreach ($overviewSourceMailBox as $overview)
    {
      $message = imap_fetchheader($mboxSource, $overview->msgno) . imap_body($mboxSource, $overview->msgno);

      if(!imap_append($mboxTarget, mb_convert_encoding("$targetServer$key" . "" . "", "UTF7-IMAP", "ISO-8859-1"), $message,""))
      {
        die ("Error: ". imap_last_error());
      }

      //Mark mail from source mailbox as deleted
      imap_delete($mboxSource, $overview->msgno);
      }

    //Delete all marked mails and close connection to source mailbox
    imap_expunge($mboxSource);
    imap_close($mboxSource);
  }

  imap_close($mboxTarget);
?>

In dem Skript gibt man dabei oben die Konten an von welchen eingesammelt werden soll. Daneben wird natürlich auch das Zielkonto definiert. Der erste Parameter von „$collectAccounts“ definiert dabei den Ordner in welchen die Mails im Zielkonto geschoben werden. Der Quellcode ist auf GitHub zu finden und steht unter der AGPL.