MSP: HÜ-Mitglieder/Mail
Dokumentation | |
---|---|
Arbeitstitel | MSP: HÜ-Mitglieder/Mail |
Kurs | Methoden des Software-Entwicklungsprozesses |
Semester | WS 09/10 |
Teilnehmer | Patrick Schneider, Dennis Sack |
Programmiersprache | PHP |
Inhaltsverzeichnis
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:
- Veranstaltung MSP
- eCom zur HÜ
- Mitschrift im FS-Wiki / Mitschrift im eStudy-Forum
- MSP:HÜ_Nachrichten (HÜ mit verwandtem Thema)
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
Zertifikatsverwaltung
UseCase-Diagramme
Mailversand
Modul ist zur Zeit gesperrt!
Die Use-Case-Diagramme wurden mit Enterprise Architect erstellt.
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!
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
- https://trac.mni.fh-giessen.de/eStudy/browser/branches/msp_09/web/communication/sendmail.php?rev=3489 (redirect)
- https://trac.mni.fh-giessen.de/eStudy/browser/branches/msp_09/web/communication/sendmail.php?rev=3493 (typo)
- https://trac.mni.fh-giessen.de/eStudy/browser/branches/msp_09/web/communication/classes/class.sendmail.inc.php?rev=3494 (obsoleted)
- https://trac.mni.fh-giessen.de/eStudy/browser/branches/msp_09/web/communication?rev=3495 (obsoleted)
In /web/messaging
- https://trac.mni.fh-giessen.de/eStudy/browser/branches/msp_09/web/messaging/messaging_new.php?rev=3496 (usersearch)
- https://trac.mni.fh-giessen.de/eStudy/browser/branches/msp_09/web/messaging/classes/class.messaging.inc.php?rev=3500 (debugging defaults)
- https://trac.mni.fh-giessen.de/eStudy/browser/branches/msp_09/web/messaging/classes/class.messaging_new.inc.php?rev=3499 (debugging)
- https://trac.mni.fh-giessen.de/eStudy/browser/branches/msp_09/web/messaging/classes/class.messagesender.inc.php?rev=3497 (debugging)
- https://trac.mni.fh-giessen.de/eStudy/browser/branches/msp_09/web/messaging/classes/class.messaging_detail.inc.php?rev=3498 (debugging defaults)
Betreffend Mailversand in /web/common
- https://trac.mni.fh-giessen.de/eStudy/browser/branches/msp_09/web/common/classes/class.email.inc.php?rev=3492 (debugging, hints)
Betreffend Zertifikate
- https://trac.mni.fh-giessen.de/eStudy/browser/branches/msp_09/web/user/certificates.php?rev=3447 (php holes, coding style, pre-commit check)
- https://trac.mni.fh-giessen.de/eStudy/browser/branches/msp_09/web/user/certificates.php?rev=3488 (Merge with trunk)
- https://trac.mni.fh-giessen.de/eStudy/browser/branches/msp_09/web/common/classes/class.certificate.inc.php?rev=3487 (Merge with trunk)
- ...
Außerdem bugfix in /web/common/init.inc.php
Integration
Merge von /web/communication:
- Keine Veränderunen im Trunk
Merge von /web/messaging
- https://trac.mni.fh-giessen.de/eStudy/changeset/3013/trunk/web/messaging/classes/class.messaging.inc.php
- -> Datei im Trunk durch aktuelle Datei aus Branch ersetzen
- Keine relevanten Änderungen im Trunk, nur unvollständiger Versuch, den Pre-commit-check einzuhalten
- siehe dazu auch: https://trac.mni.fh-giessen.de/eStudy/changeset/3341/branches/msp_09/web/messaging/classes/class.messaging.inc.php
- Alle anderen Dateien wurden mit Trunk abgeglichen und aktualisiert.
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