Moritz Bunkus [Fri, 17 Aug 2012 11:16:45 +0000 (13:16 +0200)]
Formularfelder und Session-Keys für Logins umbenannt
Ziel: Ermöglichen, dass Login & Passwort auch wieder per
Formularfelder mit jedem Request übertragen werden, aber nicht mehr so
offensichtlich im "Formularfeldernamensraum" rumgeistern -- sondern
leicht aussortierbar sind. Die Formularfelder, die mit "{AUTH}"
starten, werden vom Dispatcher nach erfolgter Loginüberprüfung
automatisch entfernt, bevor die Kontrolle an die Controller/Actions
übergeben wird (unabhängig vom Routingtyp).
Vorher waren Formularfelder sowie die Session-Keys für User-Logins
"login" und "password", für Admin-Login "rpw".
Jetzt:
- Formularfelder: für User-Logins "{AUTH}login" und "{AUTH}password",
für Admin-Login "{AUTH}admin_password".
- Session-Keys: jeweils ohne "{AUTH}", sprich für User-Logins
weiterhin "login" und "password", für Admin-Login neu
"admin_password".
Moritz Bunkus [Fri, 17 Aug 2012 10:24:58 +0000 (12:24 +0200)]
Dispatcher: Auch Controller ermöglichen, die Admin-Login benötigen
Default ist für Controller, dass all ihre Funktionen User-Logins
benötigen. Kann ein Controller ändern, indem er die Sub
"get_auth_level" überschreibt (siehe Doku in
SL::Contrller::Base). Dies schafft die Basis dafür, auch Admin-Dinge
in der neuen Controller-Architektur zu implementieren.
Für die Zukunft kann man leicht ein weiteres Level neben 'user' und
'admin' einbauen, z.B. 'none' für Actions, die definitiv kein Login
benötigen.
Funktionierendes Beispiel für einen solchen Controller (Aufruf dann
über URL ".../controller.pl?action=AdminTest/proof_of_concept"):
package SL::Controller::AdminTest;
use strict;
use parent qw(SL::Controller::Base);
use Rose::Object::MakeMethods::Generic
(
scalar => [ qw(business) ],
);
#
# actions
#
sub action_proof_of_concept {
my ($self) = @_;
$::form->header;
print $self->render(<<EOHTML, { inline => 1 });
<body>
<p>I've been called with an ADMIN login only!</p>
</body>
</html>
EOHTML
}
Wenn in der Artikelbeschreibung oder Warengruppe von Bestandteilen
des Erzeugnis Sonderzeichen verwendet werden, kam es bisher zu
Problemen, vor allem wenn man den Button "Aktualisieren" benutzt.
Dieser Fehler ist nun behoben, sowohl für die Artikelbeschreibung,
als auch für die Warengruppe, auch wenn Sonderzeichen in der
Warengruppe bisher kaum funktionieren.
Verkaufsbericht Einheiten und Preisfaktoren berücksichtigen
Im Verkaufsbericht werden jetzt auch Einheiten und Preisfaktoren
berücksichtigt. Vorher kam es zu Fehlern, wenn man Rechnungen
mit von den Basisangaben abweichenden Einheiten oder Preisfaktoren
erstellt hat. Weiterhin werden in dem Bericht nur noch absolute Mengen
in Verbindung mit der Basiseinheit angezeigt (nicht mehr die Einheit
aus dem Beleg; zur Berechnung von Durchschnitten).
Sven Schöling [Wed, 8 Aug 2012 14:48:47 +0000 (16:48 +0200)]
Parsing von multipart/formdata beschleuningt.
Die entsprechende Routine hatte einen bösen Fall von Shlemiel the Painter's
algorithm [1]. Dadurch wurden Fileuploads mit mehr als 20k Zeilen extrem
langsam. Binärdaten wie pdfs oder Bilder hat das nicht gestört, aber bei CSV
Imports hat eine 80k Zeilen Datei dann auch mal 2-5min gebraucht, nur um den
Request zu parsen.
Jetzt werden nur die Indizes geparst und hinterher direkt aus dem Request der
substr gezogen. Ausserdem endlich einen Testfall dafür eingebaut.
Nach dem erstellen einer Einkaufsrechnung wird der Einkaufspreis aktualisiert. Dabei entstand bisher ein Fehler, wenn man andere Einheiten als die Standardeinheit der Waren/Dienstleistungen benutzt. Das ist nun behoben.
Sven Schöling [Thu, 2 Aug 2012 14:34:42 +0000 (16:34 +0200)]
Preview Mode bei Imports
Bei großen Imports interessieren einen meist nur die Fehler, oder die ersten
paar zeilen um zu sehen ob der Import so gut aussieht. Diese Modi sind jetzt
verfügbar.
G. Richardson [Wed, 1 Aug 2012 09:59:28 +0000 (11:59 +0200)]
Bug 1960 - Datenverlust beim CSV-Warenimport bei Preisen
wenn sellprice, listprice oder lastcost in der Importdatei nicht
explizit mit eigener Spalte gesetzt wurden, wurden die ursprünglichen
Preise beim Preisupdate mit 0 überschrieben.
Sven Schöling [Tue, 31 Jul 2012 12:43:30 +0000 (14:43 +0200)]
Warenimport bei grossen Datenbanken.
Der Warenimport hat bisher alle Waren ausgelesen und dann im Hash umsortiert.
Bei einer Datenbank mit 84k Waren hat das 22s gedauert, und 700MB
Arbeitsspeicher gefressen, das ist nicht zumutbar. Nun wird jeder Wert einzeln
aus der Datenbank gesucht.
G. Richardson [Thu, 26 Jul 2012 18:27:18 +0000 (20:27 +0200)]
Erzeugnis: lastcost-Konflikt für makemodel und Komponenten
Sowohl die EK-Preise der Erzeugnis-Komponenten als auch die EK-Preise
der makemodel-Versionen werden in $form->{lastcost_$i} gespeichert und
überlagern sich damit.
Und da diese auch noch im Hintergrund unterschiedlich
formatiert/geparsed werden kam es bei den Erzeugnis-EK-Preisen nach dem
Erneuern zu Formatierungsfehlern.
Da Erzeugnisse aber produziert und nicht eingekauft werden ist hier auch
kein makemodel nötig, so daß es für Erzeugnisse entfernt wurde.
Sven Schöling [Tue, 10 Jul 2012 11:22:57 +0000 (13:22 +0200)]
SelfTests
Es gibt jetzt ein Grundgerüst um Selbsttests durchzuführen, und bei Problemen
einen Administrator per Mail zu benachrichtigen. Die Selbsttests werden Über
das SelfTest Modul für den Taskserver verwaltet, und in config/lx_office.conf
im Block [self_test] konfiguriert. Die Tests werden in TAP ausgeliefert und
können bei Bedarf weiter maschinell ausgewertet werden.
Weitere Tests können von SL::BackgroundJob::SelfTest::Base abgeleitet werden.
Zur Demonstration gibt es einen Selbsttest Transactions, der die Datenbank
auf Fehlbuchungen untersucht.
Sven Schöling [Mon, 2 Jul 2012 13:58:12 +0000 (15:58 +0200)]
Keine Passwörter mehr in Sessions speichern.
Der vorherige Mechanismus hat Passwörter in der Session hinterlegt, um bei
jedem Request überprüfen zu können, ob die Zugriffsrechte immernoch bestehen.
Gedacht war das vor allem für LDAP Authetifizierung, wo der Admin den Zugang
eines Benutzers speichern konnte und das System das sonst nicht mitbekommt.
Ein großes Problem was daraus entsteht ist, dass das Passwort auch akzeptiert
wird, wenn die gehashte Version übergeben wird, weil zur Überprüfungszeit nicht
mehr festgestellt werden kann, ob das gehashte Passwort aus der Session kommt
oder vom User.
Diese Änderung sorgt dafür, dass Passwörter weder im Klartext, noch crypted in
der Session gespeichert werden, sondern der Authetifizierungsstatus.
Eine Session bleibt jetzt eutentifiziert, auch wenn zwischendurch das Passwort
geändert wird. Lokal wird das später abgefangen werden, dass Sessions
invalidiert werden, wenn der Admin das Passwort ändert, im LDAP ist es garnicht
mehr der Fall. Auf der positiven Seite reduziert das den load auf dem LDAP
Server, weil nicht mehr für jeden Request ein Bind passieren muss.
Da die Passwörter nicht mehr verglichen werden müssen, werden gehashte
Passwörter jetzt nicht mehr akzeptiert. Jedes Passwort wird vor dem Vergleichen
unkonditional gehasht.
Die Backend Routinen erkennen jetzt wenn garkein Passwort übergeben wurde, und
triggern dafür den 5s Penalty nicht. Das macht das Aufrufen der Administration
das erste Mal wie erwartet schneller.
Moritz Bunkus [Fri, 22 Jun 2012 08:30:00 +0000 (10:30 +0200)]
Primärschlüsselspaltennamen aus Meta-Informationen holen
Benutzerdefinierte Variablen verweisen auf die Primärschlüsselspalte
ihrer Bezugstabelle. Dieser Spaltenname kann beim Helper mit der
Option 'id' überschrieben werden. Allerdings defaultete er vorher auf
'id', was für viele Tabellen stimmte, nicht aber z.B. für 'contacts',
wo es die Spalte 'cp_cv_id' ist.
Für 'contacts' passierte dann Folgendes, wenn man
'$contact->custom_variables' aufrief:
Die Funktion 'custom_variables' ist eine one-to-many-Relation, sie
erfordert also einen DB-Zugriff. Dafür wird die Spaltenbeziehung
'cvar.trans_id == contacts.primary_key_column_name' herangezogen. Der
'primary_key_column_name' ist nicht angegeben, Defaultwert ist
'id'. RDBO versucht also, die Spalte 'id' aus dem Objekt '$contact'
auszulesen, mappt dafür den Spaltennamen auf den Methodennamen dafür.
Dieses Mapping liefert den leeren String. Das überprüft RDBO in dem
Moment aber nicht, sondern ruft "$object->$method()" auf. Das wirft
eine Exception, RDBO fängt diese ab, überprüft dann, ob '$AUTOLOAD'
einen Paketnamen enthält. Und dann kommt diese wenig erhellende
Fehlermeldung heraus:
Can't locate object method "Contact::" via package "SL::DB" at /usr/share/perl5/Rose/DB/Object.pm line 1646
G. Richardson [Tue, 19 Jun 2012 16:50:02 +0000 (18:50 +0200)]
Bug 1926 - Zufälliger Dateiname für PDF Spooldateien
Beim Erstellen der Spooldatei beim Warteschlangendruck den Dateinamen per
File::Temp::tempfile erstellen. Die bisherige Kombination aus time und PID hat
PDF-Dateien überschrieben, wenn zwei Spooldateien in der gleichen Sekunde
erstellt wurden.
Beispiel alter Spoolname: 134012447722563.pdf
Beispiel neuer Spoolname: kivitendo-spoolJKuGZM.pdf
Jan Büren [Tue, 19 Jun 2012 13:57:39 +0000 (15:57 +0200)]
Buchungsjournal: Feld Referenz in Referenz / Rechnungsnummer umbenannt
Ferner noch drei Sachen übersetzt und entsprechend eine deutsche Übersetzung angelegt.
Hintergrund: Referenz ist irreführend, da bei Verkaufs- und Einkaufsbelegen dieses
Feld in der Maske nicht vorkommt, sondern in dem Fall die Rechnungsnummer gemeint ist.
Referenz kommt allerdings bei Dialogbuchungen genauso vor.