MSP: HÜ-Mitglieder/Mail

Aus THM-Wiki
(Weitergeleitet von MSP - HÜ-Mitglieder/Mail)
Wechseln zu: Navigation, Suche


Dokumentation
Arbeitstitel MSP: HÜ-Mitglieder/Mail
Kurs Methoden des Software-Entwicklungsprozesses
Semester WS 09/10
Teilnehmer Patrick Schneider, Dennis Sack
Programmiersprache PHP

Allgemein

Diese Seite dient zur Dokumentation einer Hausübung für die Master-Veranstaltung "Methoden des Softwareentwicklungsprozesses (MSP)" im Wintersemester 2009/10.

Mitglieder der Gruppe sind:

  • Patrick Schneider
  • Dennis Sack

Ziel der Hausübung ist, das eStudy-Modul "Mitglieder-Mail" zu refaktorisieren, um digitale Signaturen zu erweitern und wieder einsatzfähig zu machen.

Relevante Links:

Verwendet wird das eStudy Image "estudy-dev-2.0.vdi" mit aktuellem Quellcode aus SVN Repository (https://svn.mni.fh-giessen.de/eStudy/branches/msp_09/)

Anforderungen

Anforderungen laut "Kunde"

  • Modul zum Versand vom E-Mails (nicht interne Nachrichten) an eStudy Mitglieder und externe refakturieren
  • Dabei Verschlüsselung für Mails mittels Zertifikaten anbieten (SMIME, mit Zertifikat von FH ITS)
  • SPAM über die Mail-Funktion verhindern
    • Userliste für Studenten/Schüler/Gäste deaktivieren
    • Kursliste beschränken auf die eigenen bei Dozenten
    • Admin darf weiterhin alle Benutzer erreichen
  • Benutzerauswahl mit PN-Gruppe abstimmen (Code-Duplikate verhindern)
    • Schnittstelle bieten zum EMail-Versand
    • Mails einzeln verschicken (sonst evtl. Probleme mit dem Mail-Server)

Zertifikate:

  • Privater Schlüssel MUSS mit separatem Passwort verschlüsselt in der DB liegen
  • Zertifikat kann unverschlüsselt gespeichert werden (öffentlicher Teil)
  • Zertifikatsverwaltung wird nicht von uns überarbeitet
  • Nur allgemeine "eStudy"-Signatur wird zunächst implementiert

Nicht funktionale Anforderungen

  • Internationalisierung
  • Benutzbarkeit
  • Performance
  • Fehlertoleranz
  • Verfügbarkeit
  • Sicherheit (BSI)
  • Datenschutz
  • Barrierefreiheit (WAI)
  • Benutzerdokumentation
    • WIKI

Vorgehen

  • Reverse Engineering (Bestandsaufnahme)
    • Verantwortliche Dateien identifizieren
    • Klassendiagramm erstellen
    • Use-Case-Diagramm erstellen
    • Datenbankschema erstellen (sofern nötig)
    • Quelltext-Dokumentation erstellen (lassen)
  • Software Metriken erstellen
    • Code-Coverage
    • Zyklomatische Komplexität
    • C.R.A.P.-Index
    • DB-Queries
  • ...

Zu Ändern (Vorschläge)

  • Code aufräumen
    • Konsistente Namen
    • Korrekte Sichtbarkeiten
    • PHP5 Style
    • PHP-Lücken entfernen
  • Mails an größere Gruppen nur für Admin freigeben
  • Empfängerliste auf 10 Empfänger oder einen Kurs beschränken
  • Berechtigungsprüfung in eigene Methode auslagern, beim Anzeigen und Ausführen prüfen.

Reverse Engineering

Verantwortliche Dateien

/communication/sendmail.php

  • Einstiegspunkt zum Versenden von E-Mails
  • Prüft Zugriffsberechtigungen und übergibt Kontrolle an Klasse SendMail
  • Smells:
    • Middle Man

/communication/classes/class.sendmail.inc.php

  • Codingstyle PHP 4
  • View und Controller (Formulare und Steuerung) für /common/classes/class.email.inc.php
  • kein "gettext()" verwendet -> keine Vorbereitung für Internationalisierung
  • Datenbankzugriff nur zur Auswahl der Empfänger (Kontextabhängige Anzeige)
  • requires
    • /common/classes/class.email.inc.php
    • /roleplay/classes/class.userrolemanagement.inc.php
  • Smells:
    • Long Method
    • Uncommunicative Name
    • (Temporary Field)

/common/classes/class.email.inc.php

  • Basisfunktionalität zum versenden von emails (intern sowie extern).
  • Codingstyle PHP 4
  • kein "gettext()" verwendet -> nicht benötigt, da keine Textausgabe
  • Datenbankzugriff für allgemeine Sendeberechtigung für emails (mailflag)
    • Datenbankzugriff zur Auswahl der email-Adresse eines Benutzers (mögliche Redundanz!)
  • Smells:
    • Uncommunicative Name

/roleplay/classes/class.userrolemanagement.inc.php

  • Codingstyle PHP 4
  • Benötigt für Berechtigungen
  • Benötigt um Nutzer nach Rollen zusammenzufassen (email an Benutzergruppen)
  • Ist nicht mehr Teil des Kernbereichs dieses Moduls
  • kein "gettext()" verwendet -> keine Vorbereitung für Internationalisierung

/user/certificates.php

  • Steuerdatei (Controller) zur Zertifikatsverwaltung
  • requires /common/classes/class.certificate.inc.php
  • kein "gettext()" verwendet -> keine Vorbereitung für Internationalisierung
  • Smells:
    • Uncommunicative Name
    • Dead Code
    • Conditional Complexity

/common/classes/class.certificate.inc.php

  • Ausführende Klasse zur Zertifikatsverwaltung
  • "Email-Zertifikate erstellen, downloaden, uploaden..."
  • Zum Teil schon Codingstyle von PHP 5
  • kein "gettext()" verwendet -> nicht zwingend benötigt, da effektiv keine Textausgabe
  • Smells:
    • Uncommunicative Name
    • Inconsistent Name
    • Large Class (Klasse sollte auschließlich Zertifikate behandeln. Mails mit Zertifikaten zu verschüsseln, ist nicht die Aufgabe des Zertifikats!)

Klassen-Diagramme

Die Klassen-Diagramme wurden mit Enterprise Architect erstellt.

Mailversand

Class Model.png

Zertifikatsverwaltung

Certificate.png

UseCase-Diagramme

Mailversand

Modul ist zur Zeit gesperrt!

Die Use-Case-Diagramme wurden mit Enterprise Architect erstellt.

Use Case Model 2.png

Einstiegspunkt ist das Skript /communication/sendmail.php, das Klasse SendMail aus class.sendmail.inc.php verwendet. Beispiel: https://estudy.fh-giessen-friedberg.de/communication/sendmail.php?toUser=****

public-Funktionen von Klasse SendMail:

  • SendMail(): Konstruktor
  • doit(): Controller. Versendet Mail wenn möglich. Ansonsten: Ausgabe Benutzeroberfläche


Interne Funktionen von Klasse SendMail (für UseCases nicht relevant):

  • echoUserList(): Gibt Benutzerliste als HTML-Tabelle aus
  • echoForm(): Benutzeroberfläche zum Versenden als HTML
  • echoMailForm(): email Eingabeformular als HTML


Mail versenden:

  • Benutzer auswählen (Kontextabhängig)
  • Mail schreiben
  • Mail versenden

Zertifikatsverwaltung

Modul ist zur Zeit gesperrt!

Zertifikatsverwaltung use case.png

Einstiegspunkt ist das Skript web/user/certificates.php, das Klasse Certificate aus common/classes/class.certificate.inc.php verwendet. Folgende Aktionen sind möglich:

  • Zertifikat erstellen
  • Zertifikat runterladen
  • Zertifikat hochladen
  • Root-Zertifikat hochladen (Admin)

Datenbankschema

Verwendete Tabellen:

  • user (Userdaten)
  • secureemail (Root-Zertifikat? Existiert im Development-Image nicht.)

Quelltext-Dokumentation

phpDoc Dokumentation

Dokumentation mit folgendem Aufruf erzeugen:
phpdoc -o HTML:frames:earthli -f web/communication/sendmail.php,web/communication/classes/class.sendmail.inc.php,web/common/classes/class.email.inc.php,web/roleplay/classes/class.userrolemanagement.inc.php,web/common/classes/class.certificate.inc.php,web/user/certificates.php -t doku/phpdoc/

Dokumentation zum ansehen
und zum runterladen: Datei:Phpdoc-eStudy-Mailsystem-2009-11-06.tar.bz2

Doxygen Dokumentation

Mit Doxygen 1.6.1 erstellte Dokumentation zum ansehen.

Software Metriken

Software-Metriken mit phpUnit

Es existieren zur Zeit noch keine phpUnit-Tests für die relevanten Klassen.

Das Antwortverhalten des Moduls ist auch nur begrenzt automatisch testbar, da der Versand von E-Mails immer stark von den jeweiligen Zielsystemen abhängt.

Im- und Export von Zertifikaten kann jedoch voll lokal getestet werden.

Bad Smells

(siehe "Verantwortliche Dateien")

DB-Queries

(siehe "Verantwortliche Dateien")

Zyklomatische Komplexität

(Erst möglich, wenn Vorgaben vollständig sind, Anpassungen erfolgt sind, Schnittstellen definiert wurden und dementsprechende Tests erzeugt wurden.)

C.R.A.P.-Index

(Erst möglich, wenn Vorgaben vollständig sind, Anpassungen erfolgt sind, Schnittstellen definiert wurden und dementsprechende Tests erzeugt wurden.)


Implementation

Die folgenden Dateien wurden verändert:

In /web/communication

In /web/messaging

Betreffend Mailversand in /web/common

Betreffend Zertifikate

Außerdem bugfix in /web/common/init.inc.php

Integration

Merge von /web/communication:

  • Keine Veränderunen im Trunk

Merge von /web/messaging

Merge von /web/common/

  • classes/class.email.inc wurde im Trunk nicht geändert -> aktuell.

CREATE-Statement für Tabelle "certificate"

CREATE TABLE IF NOT EXISTS `certificate` 
  (
  `id` int(11) NOT NULL auto_increment,
  `user_id` int(11) NOT NULL,
  `certificate` text NOT NULL,
  `privkey` text NOT NULL,
  `pubkey` text NOT NULL,
  `pass` varchar(32) NOT NULL COMMENT 'md5',
  `created_on` datetime default NULL,
  `invalidated_on` datetime default NULL,
  PRIMARY KEY  (`id`),
  KEY `user_id` (`user_id`)
  ) ENGINE=InnoDB ;

Erledigt

  • Zertifikatsverwaltung wurde aktualisiert und wird im Produktivsystem eingesetzt.
  • Alte Oberfläche zum Mailversand wurde durch einheitliche Oberfläche zum Versand von Mail/PN ersetzt (wird im Produktivsystem eingesetzt).
  • SPAM-Versand wurde eingeschränkt.
  • Code-Bereinigung wurde (weitgehend) durchgeführt.

Weitergehendes

TODO

  • Evtl. Admin-Oberfläche bereit stellen, um deaktivierte Zertifikate zu exportieren.
  • Private Key auch (symmetrisch) verschlüsselt speichern. Als Vorlage kann die Verschlüsselung in Klasse SecureLink dienen. Das Passwort zum entschlüsseln eines Zertifikats ist bereits sicher (wird nur als Hash-Wert gespeichert).

PEAR GPG

Eventuell auch mal dieses PEAR-Modul ansehen: https://pear.php.net/package/Crypt_GPG / http://www.infodrom.org/~joey/log/?201001231616