Project @ iMath: Issueshttps://project.math.uzh.ch/https://project.math.uzh.ch/favicon.ico?16668783892018-12-20T16:45:56ZProject @ iMath
Redmine QFQ - Feature #7521 (New): TemplateGroup: fe.type=uploadhttps://project.math.uzh.ch/issues/75212018-12-20T16:45:56ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Aktuell werden in TemplateGroups keine File Upload Felder unterstuetzt.</p>
<p>Das sollte implementiert werden oder zumindest verhindert werden das man das im FormEditor konfiguieren kann.</p> QFQ - Feature #7520 (New): QR Code: ... AS _qr (... AS _link) https://project.math.uzh.ch/issues/75202018-12-20T16:40:21ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Als link() implementieren.</li>
<li>Diverse Typen: URL, Contact, Termin, WLAN ...</li>
<li>Optional: zum auf/zuklappen oder via mouse over?</li>
</ul> QFQ - Feature #7519 (New): Select: Multihttps://project.math.uzh.ch/issues/75192018-12-20T16:30:01ZCarsten Rosecarsten.rose@math.uzh.ch
<p>BBe benoetigt eine Select Liste mit 'Multi select' Moeglichkeit</p>
<p>Bsp: Aus einer Liste mit 30 Elementen sollen 5 ausgewaehlt werden.</p> QFQ - Bug #7513 (New): Radios not correct alignedhttps://project.math.uzh.ch/issues/75132018-12-19T14:09:25ZCarsten Rosecarsten.rose@math.uzh.ch
<p>a) untereinander: see Screenshot. Tritt angeblich erst auf wenn man mehrere Optionen hat.<br />b) hintereinander: kein Abstand zwischen den Optionen</p>
<p>Min. bei b) ist die BS Klasse 'radio-inline' schuld - diese muss bei Plain gar nicht gesetzt werden.</p> QFQ - Bug #7512 (New): FE: inputType=number >> 'pattern' is not respectedhttps://project.math.uzh.ch/issues/75122018-12-19T14:07:02ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Bei einem Input Feld (column.typ=int) wird scheinbar kein Pattern ausgeliefert. Zumindest beschwert sich der Browser nicht bei Falscheingabe.</p>
<p>Wird im FE gesetzt 'inputType=text', klappt es.</p>
<p>Auch fuer 'numerische' eingaben kann ein Pattern sinnvoll sein. Z.B. bei Jahreszahlen die genau 4 Stellen haben sollen: [\d]{4}</p> QFQ - Feature #7342 (New): add content = hide_thishttps://project.math.uzh.ch/issues/73422018-11-23T10:19:19ZNicola Chiapolini
<p>When using a super-/subquery combination as an if-then construct, I want to hide the content of the super-query but show the result of sub-queries. At the moment this is not possible with the <code>content</code>-keyword. It would be nice to have the option to not hide the subqueries.</p>
<p>Personlly I would think it most logical to make this the default for <code>hide</code> and use e.g. <code>hide_all</code> to include subqueries. For backwards compatibility however, the new behaviour should probably get the new keyword. I suggest something like <code>hide_this</code></p> QFQ - Feature #7336 (New): PDF Upload: disallow PDFs with specific Meta informationhttps://project.math.uzh.ch/issues/73362018-11-22T15:49:01ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Es waere gut wenn man den Upload von PDF's ablehnen koennte, konfigurierbar pro Problemfall.</li>
<li>Beispiel: das folgende PDF ist im A0 Format und Creator ist 'Drawboard PDF'<br /><pre>
Title: New Document
Author: Claudio Broger
Creator: Drawboard PDF
Producer: Drawboard PDF
CreationDate: Sun Nov 18 10:38:02 2018
ModDate: Tue Nov 20 17:49:23 2018
Tagged: no
UserProperties: no
Suspects: no
Form: none
JavaScript: no
Pages: 6
Encrypted: no
Page size: 2384 x 3370 pts (A0)
Page rot: 0
File size: 4162449 bytes
Optimized: yes
PDF version: 1.7
</pre></li>
</ul>
Vorschlag:<br /><pre>
# Beispiel, Es kann nur einmal pdfInfoDeny anagegeben werden
pdfInfoDeny=Creator:Drawboard PDF
pdfInfoDeny=Page size:(A0)
pdfInfoDeny=Creator:Drawboard PDF,Page size:(A0)
pdfInfoDeny=Creator:Drawboard PDF,Page size:(A0)|Creator:Microsoft Office 365|...
pdfInfoMessage=Note zu Bedingung 1|Note zu Bedingung 2| ...
</pre>
<ul>
<li>Die mit '|' getrennten Strings werden einzeln getestet (||). Damit koennen mehrere Bedingungen angegeben werden.</li>
<li>Die mit ',' aufgefuehreten Elemente muessen alle erfuellt sein, damit 'Deny' erkannt wird (&&).</li>
<li>Soltle pdfInfoMessage nicht genuegend Elemente enthalten wird das erste Element genommen.</li>
</ul> QFQ - Feature #7280 (New): recently used tablehttps://project.math.uzh.ch/issues/72802018-11-18T08:55:10ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Neue Tabelle 'RecentlyUsed'</li>
<li>Wird bei formLoad (!) automatisch gefuellt.</li>
<li>Columns
<ul>
<li>feUser, (cookie falls kein feUser eingeloggt)</li>
<li>form</li>
<li>table</li>
<li>recordId</li>
<li>misc (z.B. 'switchUser')</li>
</ul></li>
</ul> QFQ - Bug #7261 (New): Report pathFilename for user without path, only the filenamehttps://project.math.uzh.ch/issues/72612018-11-15T12:03:52ZCarsten Rosecarsten.rose@math.uzh.ch
<pre>
UniqId:: 5bed603a97486
------------------------------------------------
toUser:: Error reading file: fileadmin/shorttimedata/18m/studentupload/hs18/MAT182/18705293/Worksheet_7/79270.60DA022B_013D_4876_80B0_C78B18454230.jpeg
Timestamp:: 2018.11.15 13:02:02 +0100
Code:: 1300
Message:: Error reading file: fileadmin/shorttimedata/18m/studentupload/hs18/MAT182/18705293/Worksheet_7/79270.60DA022B_013D_4876_80B0_C78B18454230.jpeg
Report level key:: 5.10
Type:: User Form Exception
Form:: my_annotate
Form Element:: 7374 / fabricString / Fabric
current sip:: array (
'__dbIndexData' => '1',
'eSheet' => '78310',
'esId' => '97921',
'form' => 'my_annotate',
'grId' => '183542',
'idExercise' => '184',
'nId' => '79270',
'pIdStudent' => '17519',
'r' => '0',
'splitId' => '0',
's' => '5bed2d4e491fc',
'urlparam' => '__dbIndexData=1&eSheet=78310&esId=97921&form=my_annotate&grId=183542&idExercise=184&nId=79270&pIdStudent=17519&r=0&splitId=0',
)
Page Id:: 11
Content Id:: 9
FE User:: crose
FE User STORE_USER:: stwilli
File:: /var/www/html/my/typo3conf/ext/qfq/qfq/qfq/AbstractBuildForm.php
Line:: 3069
IP Address:: 130.60.188.212
HTTP User Agent:: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 OPR/56.0.3051.99
QFQ Cookie:: ntllhhm24crodudbb1cfgcukj0
Stacktrace::
#0 /var/www/html/my/typo3conf/ext/qfq/qfq/qfq/AbstractBuildForm.php(712): qfq\AbstractBuildForm->buildAnnotate(Array, 'fabricString-0', '', Array, 'form_load')
#1 /var/www/html/my/typo3conf/ext/qfq/qfq/qfq/AbstractBuildForm.php(269): qfq\AbstractBuildForm->elements('0', 'native_subrecor...', 0, Array, 'flagDynamicUpda...', false, 'FSRVD', 'form_load')
#2 /var/www/html/my/typo3conf/ext/qfq/qfq/qfq/BuildFormBootstrap.php(884): qfq\AbstractBuildForm->process('form_load', false, Array)
#3 /var/www/html/my/typo3conf/ext/qfq/qfq/qfq/QuickFormQuery.php(454): qfq\BuildFormBootstrap->process('form_load')
#4 /var/www/html/my/typo3conf/ext/qfq/qfq/qfq/QuickFormQuery.php(248): qfq\QuickFormQuery->doForm('form_load')
#5 /var/www/html/my/typo3conf/ext/qfq/Classes/Controller/QfqController.php(41): qfq\QuickFormQuery->process()
</pre> QFQ - Bug #7219 (New): typeSheadSql / typeAheadSqlPrefetch: change to curly braceshttps://project.math.uzh.ch/issues/72192018-11-09T07:10:27ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Scheinbar werden 'typeSheadSql' / 'typeAheadSqlPrefetch' ohne Curly Braces definiert. Das ist inkonsequent.</p>
<ul>
<li>Anpassen das alt und neu funktioniert</li>
<li>Doku</li>
</ul> QFQ - Feature #7175 (New): Upload: md5 hash as filenamehttps://project.math.uzh.ch/issues/71752018-11-05T16:59:00ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Fuer w3/my wird eine Funktion benoetigt, das ein Student nicht ausversehen zweimal die gleiche Datei hochlaedt.</li>
<li>Theoretisch koennte es auch moeglich, das Dateien mit unterschiedlichem Dateinamen identisch sind.</li>
<li>Eine Loesung waere ueber den Dateiinhalt einen MD5 Hash zu erzeugen und die Datei dann mit dem hash als Namen zu speichern (fileReplace=no).</li>
<li>Vorschlag:
<ul>
<li>Neue Option im Upload FE: `fileNameMD5= filename+TimeStamp | content`</li>
</ul></li>
</ul>
<ul>
<li>Netter Nebeneffekt: aus dem Dateinamen kann nicht erkannt werden worum es im Inhalt geht.</li>
<li>Es muesste eine neue STORE_VARS variable definiert werden: 'md5'</li>
<li>In fe.paramter.fileDestination = fileadmin/uploads/{{md5:V}}</li>
</ul> QFQ - Feature #7119 (New): Upload: scaleDownWidth, scaleDownHeighthttps://project.math.uzh.ch/issues/71192018-10-28T09:51:51ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Bei Pixel Bildern die hochgeladen werden, waere es gut wenn man eine maximale Breite/Hoehe angeben kann.</p> QFQ - Feature #7109 (New): Dynamic Updates: row/element hidehttps://project.math.uzh.ch/issues/71092018-10-27T10:04:10ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Erkennung ob ein oder mehrere Elemente per ROW anhand og im FE 'row' und '/row' aktiv sind.</li>
<li>FE.parameter 'modeHide' kontrolliert ob nur das element ausgeblendet werden soll, oder die ganze row.
<ul>
<li>modeHide=row|element
<ul>
<li>default bei row mit einem element: row</li>
<li>default bei row mit mehreren elemente: element</li>
</ul></li>
</ul></li>
</ul>
<ul>
<li>row, ein element
<ul>
<li>ganze zeile kann ein/ausgeblendet werden.</li>
</ul></li>
</ul>
<ul>
<li>row, mehrere elemente
<ul>
<li>einzelne elemente koennen ein/ausgblendet werden (by default bleibt die ganze row sichtbar)</li>
<li>das erste element der row bestimmt die htmlId der ganzen row</li>
<li>falls beim ersten element ein flag gesetzt ist: bestimmt dieses element ob die ganze row ein/ausgeblendet werden soll.</li>
</ul></li>
</ul>
<ul>
<li>Es ist wichtig, das elemente, die ein und ausgeblendet werden sollen, durch QFQ in col-md gewrapped werden. Das impliziert das nicht mehrere FE einer col-md gruppe ein/ausgeblendet werden koennen.</li>
</ul> QFQ - Feature #7102 (New): Comment sign in report: '#' and '--'https://project.math.uzh.ch/issues/71022018-10-27T08:55:24ZCarsten Rosecarsten.rose@math.uzh.ch
<p><a class="external" href="https://www.w3schools.com/Sql/sql_comments.asp">https://www.w3schools.com/Sql/sql_comments.asp</a></p>
<ul>
<li>Laut SQL Spec kann '--' am Zeilenanfang, aber auch mitten in der Zeile stehen.</li>
<li>Wenn es im SQL Statement steht, wird SQL das haendeln und alles richtig machen</li>
<li>Steht es am Zeilenanfang, sollte QFQ den Rest gar nicht parsen.</li>
<li>Atom unterstuetzt mit Ctl-/ das auskommentieren via '--' am Zeilenanfang</li>
<li>'/*' ist fuer den QFQ Parser schwer umzusetzen - es SQL daher ueberlassen. In QFQ Doku darauf eingehen.</li>
</ul> QFQ - Feature #7099 (New): FormEditor > subrecord FE: list FE according their nesting in containerhttps://project.math.uzh.ch/issues/70992018-10-27T08:42:10ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>In der Liste der FormElemente sollen die FE Records vom Typ 'Container' ('pill/fieldset/template-group') automatisch direkt ueber den nativen FEs angezeigt werden.</li>
<li>Beim Speichern eines FE's wird der ORD Wert automatisch korrekt gesetzt.</li>
<li>Es ist nicht noetig in der ORD Spalte die ParentChild Bedingung abzubilden, wenn sichergestellt ist das die 'ord' immer gemaess der aktuellen Hierarchie gesetzt wird. Dazu gehoert das ein manuell gesetzte ORD Wert angepasst wird.</li>
<li>FYI: Vermutlich werden wir nie eine Verschachtelungstiefe > 5 erreichen: Form>Pill>Fieldset>TemplateGroup>FE</li>
<li>Wird ein Sub Element per Drag'n'Drop nach ausserhalb des aktuellen Containers verschoben, sollte das FE die containerId des FE bekommen auf dem es gedroppt wurde.</li>
<li>Wird ein Container verschoben, werden alle Childs ebenfalls angepasst - innerhalb des Containers bleibt die Reihenfolge bestehen.</li>
<li>Die hierachiesche Logik koennte vermutlich erkannt/respektiert werden in dem ein neues Keyword definiert wird: <code>FE.parameter.ordColumnHierarchy=feIdContainer</code>. Sobald dieser Parameter gesetzt ist, wird auf die Hierachie Ruecksicht genommen und das Renumbering via PHP entsprechend durchgefuehrt.</li>
<li>Wird manuell eine 'ord' gesetzt, kann dadurch der aktuelle Container nicht verlassen werden.
<ul>
<li>Das Feld "ord" bekommt dynamisch berechnete min/max Werte: min=outercontainer.ord, max=nextoutercontainer.ord-1. Diese Funktion ist optional. Auch wenn min/max nicht gesetzt werden sollte das setzen von 'ORD' nur in den erlaubten Grenzen moeglich sein. Dazu muss dem Detail Form vermutlich mitgeteilt werden (Aufruf erfolgte via einem Subrecord aus dem 'Form'-Form) das die Begrenzung auf dem aktuellen Container beizubehalten ist.</li>
<li>Damit koennen nur ord Werte gesetzt werden, die die bestehende Container Reihenfolge beruecksichtigen.</li>
</ul></li>
</ul> QFQ - Bug #7014 (New): Sending invalid emails succeeds when debug.redirectAllMailTo is sethttps://project.math.uzh.ch/issues/70142018-10-16T14:34:13ZNicola Chiapolini
<p>When <code>debug.redirectAllMailTo</code> is set, mails work without error even if they are sent to invalid mail addresses. <br />This makes spotting problems in development harder. It's probably hard to avoid this, but it might be useful to highlight this downside in the documentation.</p>
<p>(<a class="issue tracker-1 status-5 priority-2 priority-default closed" title="Bug: Messed up query numbering (Closed)" href="https://project.math.uzh.ch/issues/7013">#7013</a> prevented the sending of emails in our latest feature in production. Since the feature sends several identical emails we never noticed the mails with invalid to adresses in development - and it took a while to realize the bug really was present there as well.)</p> QFQ - Bug #7002 (New): Dynamic Update: row does not disappear / appearhttps://project.math.uzh.ch/issues/70022018-10-14T18:03:58ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Via dynamicUpdate scheint das aus/einblenden von Rows in Formularen nicht mehr zu funktionieren, wenn die Startbedingung 'hidden' ist.</p>
<p>Mit Startbedingung 'show' wird zwar das Input Element aus/eingeblendet, aber das Label bleibt stehen.</p>
<p>Beobachtet im IK-Tool bei der Zuweisung von Rollen zu einer Person.</p> QFQ - Bug #6912 (New): error Message Var 'deadline' already set in SIP - in Form with FE.value={...https://project.math.uzh.ch/issues/69122018-10-06T08:30:43ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>IK Tool, Form 'application'</li>
<li>FE.name=deadline, column=value: {{deadline:R:::{{deadlinePeriod:Y}}}}</li>
<li>Es sollte die deadline gesetzt werden, abhaengig davon ob der Record schon existiert oder nicht.</li>
<li>Es kam eine Meldung: SIP Value 'deadline' already set - keine Erklaerung wie das sein kann.</li>
</ul> QFQ - Feature #6855 (New): With {{feUser:U}}!={{feUser:T}}: Save / Delete: only possible with {{...https://project.math.uzh.ch/issues/68552018-09-27T20:55:38ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Sollte {{feUser:U}}!='' UND {{feUser:U}}!={{feUser:T}} sein:</p>
<p>- Dann darf speichern nur moeglich sein wenn {{feUserSave:U}}='yes' gesetzt ist.<br />- Dann darf loeschen nur moeglich sein wenn {{feUserDelete:U}}='yes' gesetzt ist.</p>
<p>Hintergrund: damit kann einfach sichergestellt werden das man Dozenten, die die Identiaet eines Users uebernehmen, keine Daten veraendern koennen.</p>
<p>Das Form sollte dann einen disabled 'save', 'delete' Button haben, mit einem Hinweis warum das nicht geht.</p> QFQ - Feature #6765 (New): Moeglichkeit via QFQ eigene Logs zu schreibenhttps://project.math.uzh.ch/issues/67652018-09-19T20:08:48ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Es waere gut fuer das IK Tool ein zentrales Logfile zu haben wer wann was angestossen hat.</li>
<li>Das Logfile sollte via Browser einsehbar sein.</li>
<li>Evtl. ist es auch eine LOG Tabelle. ggfs. Wird die MailLog & JSON FormSubmit Log Tabelle aufgeloest.</li>
</ul> QFQ - Feature #6723 (New): Report QFQ Installation and Versionhttps://project.math.uzh.ch/issues/67232018-09-16T09:25:53ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Es waere gut wenn man eine Uebersicht haette wo welche Installation mit welche QFQ version laufen.</p>
<p>In der Configuration eintragen:</p>
<pre>
serviceReportQfqVersion = https://qfq.io/index.php?id=service&version={{qfqVersion:Y}}[,<next reporting URL>]
</pre>
<ul>
<li>Die Variable {{qfqVersion}} gibt es vermutlich noch nicht.</li>
<li>Der Aufruf erfolgt via wget (nicht via file_get_content, da dort allow_url_fopen benoetigt wird)
<ul>
<li>bei der Erstinstallation </li>
<li>bei jedem QFQ Update</li>
</ul></li>
</ul>
<ul>
<li>Das sollte einfach zu implementieren sein: QFQ checkt die Versionsnummer bei jedem Start, dort koennte der Hook eingbaut werden.</li>
<li>Es koennen mit Komma getrennt mehrere Service URLs angegeben werden - so koennte MNF z.B. ein eigenes Reporting haben und I-MATH bekommt auch was davon mit.</li>
</ul> QFQ - Bug #6677 (New): Error message FE Action Element: no/wrong FE reference who cause the problem.https://project.math.uzh.ch/issues/66772018-09-12T21:15:27ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Falls in einem FE Action Element 'beforeSave' (vermutlich alle Action Elemente) ein Fehler in einer SQL Query auftritt, wird kein oder ein falsches FE Element als Verursacher angegeben.</p> QFQ - Feature #6609 (New): Formlet: JSON API erweiternhttps://project.math.uzh.ch/issues/66092018-09-04T08:28:51ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Im QFQ 'PROTOCOL.md' ist ein Standard QFQ API mit einigen wenigen Feldern definiert.</p>
<p>Gut waere wenn die folgenden supported waeren:</p>
<p>"status": "success"|"error",<br />"message": "<message>" <br />"redirect": "no" | "url" | "url-skip-history" | "auto" | "close" <br />"redirect-url": "<url>"</p>
<p>Die waeren dann also auf der gleichen (obersten) Ebene wie 'elements'.</p> QFQ - Feature #6602 (New): Inline-Edit (Formlet): in Report auf Mausklick ein mini-form oeffnenhttps://project.math.uzh.ch/issues/66022018-09-02T21:57:01ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Anforderung: im Report soll der User an einer beliebigen Stelle ein Miniform oeffnen koennen (AJAX), ohne das er die Seite verlaesst. </li>
<li>Beispiel:
<ul>
<li>PhpMyadmin</li>
<li>Tabelle in <a class="external" href="https://editor.datatables.net/examples/inline-editing/simple">https://editor.datatables.net/examples/inline-editing/simple</a></li>
</ul></li>
</ul> QFQ - Feature #6594 (New): Excel: on download, check if there is a valid siphttps://project.math.uzh.ch/issues/65942018-08-31T21:55:24ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Um sich vor unerlaubten Zugriff zu schuetzen, kann bei 'XLS?' output getestet werden (qfq content record, special column name), ob der Aufruf via einer SIP erfolgt ist (downloads sind immer via sip encrypted):</p>
<ul>
<li>Sollte die SIP nicht existieren, bricht QFQ ab.</li>
<li>Zum debuggen wird eine Excel export Seite auch direkt aufgerufen. In dem Fall ist womoeglich keine SIP in der URL. Aber dann gibt es einen BE User > die BE existenz autorisiert den Aufruf.</li>
<li>Optional: Die Erlaubnis zum Zugriff sollte nur fuer die erste _XLS? Spalte getestet werden.</li>
</ul>
<ul>
<li>Option: es gibt es ein Flag auf dem QFQ, der den Check ausschaltet: downloadCheckSipExist=0</li>
</ul> QFQ - Bug #6462 (New): File Upload: Nutzlose Fehlermeldung wenn Datei zu grosshttps://project.math.uzh.ch/issues/64622018-07-27T14:55:58ZNicola Chiapolini
<p>Ich habe eben <a class="issue tracker-1 status-5 priority-2 priority-default closed" title="Bug: File Upload: keine Fehlermeldung wenn Datei zu gross (Closed)" href="https://project.math.uzh.ch/issues/6139">#6139</a> mit 18.6.1 getestet. Ich bekomme nun zwar eine Fehlermeldung, die ist aber nicht sehr informativ:</p>
<pre>
2018.07.27 16:53:23 +0200, Reference: 5b5b31e3f0447
SIP invalid:
</pre> QFQ - Feature #6437 (New): Neuer Mode Button bei FormElementenhttps://project.math.uzh.ch/issues/64372018-07-17T13:47:38ZStefan Willi
<p>Es ist verwirrend, wenn man einer der 4 Mode (show, required, readonly, hidden) anwählt und trotzdem bei 'Mode sql' etwas eingibt, dass die Funktionalität der Buttons nicht mehr wirkt.</p>
<p>Kann man nicht ein 5. Button ('custom' oder sowas in der Art) erstellen und das Mode sql Feld als dynamic update nur dann anzeigen, falls man bei 'Mode' custom anwählt?</p> QFQ - Feature #6292 (New): Download: File speichern mit Hash aber original Filename in der Datenb...https://project.math.uzh.ch/issues/62922018-06-22T11:01:47ZBenjamin Baerbenjamin.baer@math.uzh.ch
<p>Die Idee:</p>
<ul>
<li>Datei wird hochgeladen</li>
<li>QFQ speichert die Datei unter md5 hash in einem Ordner (auch ohne Datei Endungen)</li>
<li>QFQ schreibt im Datensatz der auf das file verlinkt auch den original Filenamen rein</li>
<li>Bei korrektem Download ueber die Download API wird der richtige filename aus der Datenbank zurueck geliefert</li>
</ul>
<p>Probleme mit den leserlichen Filenamen ist das diese meist Informationen ueber den Inhalt liefern (bsp: Arztzeugnis_Max_Muster.pdf).</p>
<p>Dies ist natuerlich nur sinnvoll fuer Dateien die sicher gespeichert werden muessen, nicht zB. den Flyer oder ein Bild das direkt auf die Homepage kommt.</p> QFQ - Feature #6289 (New): Form: Loghttps://project.math.uzh.ch/issues/62892018-06-20T21:54:37ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Ziel: der Developer bekommt ein detailliertes Log angezeigt, mit den Deatils was in einem Form alles passiert.</li>
<li>Das Log wird in eine Datei geschrieben.</li>
<li>Ist eine Person im BE eingeloggt, erscheint auf dem Form ein neuer Button, um das Log zu anzuzeigen. </li>
<li>Die Anzeige aktiviert das Log.</li>
<li>Ein Log bleibt max. 30 Minuten aktiv, danach muss es erneut gestartet werden.</li>
<li>Bei jedem Neustart eines Logs, wird das alte Log ueberschrieben.</li>
<li>Ein Form befindet sich im Debug mode, wenn eine Logdatei existiert und juenger als 30 mins ist.</li>
<li>Pro Form gibt es ein:
<ul>
<li>Log all user: <t3>/tmp/form.<formname>.log</li>
<li>Log current user: <t3>/tmp/form.<formname>.<beuser>.log</li>
<li>mit dem 'all user'-Log kann ein Developer einen non-Developer debuggen.</li>
</ul></li>
</ul>
<ul>
<li>Das Log wird via 'monitor' angezeigt.</li>
<li>Evtl. via dem Record, der auch den FormEditor anzeigt. Page 'form'</li>
<li>Aufruf:
<ul>
<li>form=formname&_formLog=logSession</li>
<li>form=formname&_formLog=logAll</li>
</ul></li>
</ul> QFQ - Feature #6261 (New): Persistent SIPhttps://project.math.uzh.ch/issues/62612018-06-18T13:08:14ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Mitunter (z.B. auf Seiten die ohne Login sind) waere es gut wenn 'persistente' SIP's (=SIPP) genutzt werden koennten fuer z.B. Downloads.</p>
<p>Solche SIPPs verfallen nicht (oder zu einem vorgegebenen Zeitpunkt).</p>
<ul>
<li>Variablennamen fuer SIPP: 'S' (grosses S anstelle von kleinem).</li>
<li>Optional kann eine Verfallzeit spezifiziert werden: 'S:<timestamp>'. No limit: 'S' oder 'S:0'</li>
<li>Wird per Report ein Downloadlink fuer so eine Datei gerendert, via " '..|S|..' as _link", wird das in eine 'SipPersistent' Tabelle geschrieben.</li>
<li>Der Parameter 'S' triggert, das der regulaere SIP Store aus der Persistent Table gefuellt wird. Gibt es zusaetzlich ein kleines 's' werden die Stores gemerged. SIP hat Vorrang vor SIPP.</li>
<li>download.php und qfq.php koennen so implizit neu mit den SIPP umgehen.</li>
<li>Option: es kann eine (oder mehrere) FE Group angegeben werden. Die SIPP ist nur dann gueltig wenn die FE Group matcht. Bsp: 'none', 'any','group1', 'group1,group2,...'. Die Gruppe wird via '_feGroup=...' in den URL Parametern uebergeben. Beim fuellen von STORE_SIP kann QFQ die feGroup abfragen und den STORE_SIP ggfs. nicht fuellen.</li>
<li>Ist z.B. ein Download (notiz record) einmal mit so einer SIPP erzeugt worden, bleibt dieser Record via download.php erreichbar.</li>
<li>Es waere gut wenn eine SIPP (z.B. fuer einen Downloadlink), nachdem er verfallen ist und anschliessend neu generiert wird, den <strong>GLEICHEN</strong> Hash erhaelt. Damit koennen Links dann verfallen und regeneriert werden.</li>
<li>Caching create SIPP - wird nicht implementiert, solange es keine Performance Impacts gibt.</li>
<li>Das kopieren einer SIPP von einer QFQ Installation zu einer anderen bringt keinen Erfolg: die SIPP muss in der lokalen SIPP Tabelle existieren.</li>
</ul>
SIPP per User
<ul>
<li>SIPP koennten auch einem User zugeordnet werden. </li>
<li>Die SIPP ist nur gueltig fuer den angegeben User ({{fe_user:UT}}=SipPersistent.feUser)</li>
<li>Anwendung: Links auf dem Dashboard die zu einem spezifischen Antrag gehen (Antrage mit 'heart' zusagen bookmarken).</li>
</ul>
<p>Anwendung:</p>
<ul>
<li>Fuer gewisse Bewerbungen koennen so Links gebaut werden, die man per Mail versenden kann.</li>
<li>Beim Download der Uebungszettel (oeffentlicher Bereich) fuehrt ein Verfall der Session nicht dazu, das die Seite neu geladen werden muss um neue gueltige SIPs zu bekommen.</li>
</ul> QFQ - Feature #5805 (New): TypeAHead SQL value instead of key storedhttps://project.math.uzh.ch/issues/58052018-04-10T13:16:59ZNicola Chiapolini
<p>Ich habe ein Textfeld mit folgenden Parametern:</p>
<p><code><br />typeAheadSql = SELECT shortname AS 'id', CONCAT(firstname, ' ', lastname, ', ', shortname) AS 'value' FROM _right_to_confer_phd WHERE lastname LIKE ? OR firstname LIKE ? or shortname LIKE ? ORDER BY lastname<br />typeAheadSqlPrefetch = SELECT CONCAT(firstname, ' ', lastname, ', ', shortname) AS value FROM _right_to_confer_phd WHERE shortname=?<br />typeAheadMinLength = 1<br />typeAheadLimit = 20<br />typeAheadPedantic = 0<br /></code></p>
<p>Die Suche funktioniert, aber beim Speichern wird der Value (firstname lastname, shortname) statt der id (shortname) gespeichert.<br />Problem scheint, dass JS im hidden Feld den Value statt der id einfügt...</p> QFQ - Feature #5782 (New): NextCloud APIhttps://project.math.uzh.ch/issues/57822018-04-05T14:31:41ZCarsten Rosecarsten.rose@math.uzh.ch
Via QFQ koennen
<ul>
<li>Verzeichnisse und Dateien erzeugt werden, in einem Order der via Nextcloud / Owncloud synchronisiert wird.</li>
<li>Koennen Shares verwaltet werden.</li>
<li>Koennen Aenderungen an Files/Verzeichnissen erkannt werden und eine Reaktion in der Db ausloesen.</li>
</ul>
Beispiel:
<ul>
<li>Via QFQ wird ein neues Nextcloud Verzeichnis angelegt.</li>
<li>In QFQ sind Personen hinterlegt. Diese Personen bekommen eine Freigabe (API). Die Personen werden via API informiert.</li>
<li>Ein QFQ Upload Dialog speichert eine Datei direkt in einem Nextcloud Verzeichnis/Share - dadurch erhalten alle User des Shares direkt Zugriff auf die Datei.</li>
<li>Ein User speichert ein File in einem Share - QFQ erkennt die Aenderung und koennte z.B. einen Import starten.</li>
</ul> QFQ - Bug #5576 (New): Using MySQL 'DROP' requires privilege - wich is not really necessary.https://project.math.uzh.ch/issues/55762018-02-28T17:40:58ZNicola Chiapolini
<p>Auf unserer neuen Installation hat das Anlegen der System-Tabellen (wieder) nicht geklappt. Dieses Mal habe ich das Problem identifiziert.</p>
<p>Die Datei <code>qfq/sql/formEditor.sql</code> enthält ein nicht auskommentierten DROP-Befehl. Entweder muss der auskommentiert werden (patch im Anhang) oder dann muss in der Doku DROP als nötiges Recht für den QFQ-DB-User erwähnt werden.</p> QFQ - Bug #5559 (New): FE.type = Upload: 'accept' might contain variableshttps://project.math.uzh.ch/issues/55592018-02-27T09:37:28ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Der Parameter 'fe.parameter.accept = {{some_var:Y}}' wird nicht ersetzt. Es sollte moeglich sein einen beliebigen Store zu verwenden. Z.B. zentrale config.qfq.ini oder via STORE_VAR (fill_store_var) oder STORE_REOCRD (aktueller Record auf dem das Form arbeitet).</p>
<p>Vermutlich wird accept beim Load nicht evaluiert. Der Uplaod findet dann via API statt, die Variable ist dann im SIP store und wird in der API nicht erneut evalueiret (macht dort auch keinen Sinn,da sie sich nicht mehr aendern wird).</p>
<p>Query ist ok: `accept = {{SELECT ...}}`</p> QFQ - Bug #5459 (New): Multi DB: spread system tables between 'QFQ' and 'Data'-DBhttps://project.math.uzh.ch/issues/54592018-02-18T09:37:38ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Aktuell sind alle Systemtabellen immer in der QFQ DB - das ist schlecht fuer 'Dirty', 'MailLog', 'Period', 'Split' -
<ul>
<li>Diese werden nur automatisch in QFQ installiert. </li>
<li>'Split' wird aber in 'DATA' verwendet. Das knallt dann wenn die Tabelle dort nicht manuell installiert wird.</li>
<li>'Dirty' locked akutell nur in der eigenen T3 Instanz.</li>
</ul>
</li>
<li>'Dirty' und 'Maillog' sollten konfigurierbar sein, in welcher DB sie genutzt werden. In dieser DB sollten sie dann auch bei einem Update aktualisiert werden.</li>
<li>Pro Tabelle sollte dann die Versionsnummer abgelegt werden. Vermtulich macht es Sinn das in Zukunft immer fuer alle Tabelle zu machen.</li>
</ul>
<ul>
<li>F & FE optional aus eigener DB:
<ul>
<li>Funktioniert copy/paste (clipboard sollte in QFQ sein)</li>
<li>Funktioniert record locking (dirty sollte in DATA sein)</li>
<li>tables
<ul>
<li>Form QFQ</li>
<li>FormElement QFQ</li>
<li>Dirty Data</li>
<li>Period Data</li>
<li>MailLog Data</li>
<li>Clipboard QFQ</li>
<li>Cron QFQ</li>
</ul></li>
</ul></li>
</ul> QFQ - Bug #5305 (New): Upload FormElement: nicht disabled by readonly Formhttps://project.math.uzh.ch/issues/53052018-01-27T12:39:23ZElias Villiger
Das Problem:
<ul>
<li>By Dynamic Update sollte der Button enabled/disabled werden koennen.</li>
<li>D.h. der Server muss immer das eine SIP mitliefern, kann ja sein das der Button spaeter aktiv wird.</li>
<li>Auch bei 'disabled' button (visuell korrekt als disabled dargstellt) wird ein Klick ausgefuehrt und der Dateiauswahldialog oeffnet sich und der ganze Prozess (Auswahl, Upload, Delete) funktioniert.</li>
</ul> QFQ - Bug #5221 (New): Download Dialog: Bleibt stehen in FF wenn Datei automatisch gespeichert wird.https://project.math.uzh.ch/issues/52212018-01-10T12:45:32ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Oeffnet sich in FF erst der Dialog zum Speichern/ Auswahl der Applikation - verschwindet der Dialog wie gewollt.</p>
<p>Gemeldet von DM im HIFO Tool mit QFQ 0.25.8, FF 57.0.4 (Linux).</p> QFQ - Feature #5131 (New): Activate Spin Gear ('wait/busy' indicator) via LINK attributehttps://project.math.uzh.ch/issues/51312017-12-16T20:41:30ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Pages die z.B. Mails mit Attachments versenden benoetigen teilweise etliche Sekunden.</p>
<p>Es waere gut wenn man in der Zeit das 'spinning gear' wie beim 'download' Link anzeigen koennte.</p> QFQ - Feature #4869 (New): Dynamic Update (show, hide, readonly?, required?) for Template Group E...https://project.math.uzh.ch/issues/48692017-11-04T10:36:18ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Requested in <a class="issue tracker-1 status-5 priority-3 priority-high3 closed behind-schedule" title="Bug: Dynamic updates Pill - show/hide (Closed)" href="https://project.math.uzh.ch/issues/4865">#4865</a></li>
<li>Die Umsetzung sollte nicht so schwierig sein um eine komplette TG-Group aus/einzublenden.</li>
<li>Ob 'readonly' und 'required' Sinn machen ist nicht klar.</li>
<li>Dynamic Update innerhalb einer TG pro FE ist vermutlich schwierig - wird aber benoetigt (siehe unten)</li>
</ul> QFQ - Bug #4756 (New): Form dirty even nothing changeshttps://project.math.uzh.ch/issues/47562017-10-13T15:09:33ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Bei GRC und anderen Seiten, faellt auf das ein Form als 'dirty' markiert wird (beim verlassen des Forms ohne zu speichern wird nachgefragt ob man speichern moechte) obwohl nichts veraendert wurde. 'Einfache' Formulare sind ok.</li>
</ul>
<p>Evtl. hat es etwas mit Typeahead zu tun.</p>
<ul>
<li>Das gleiche passiert beim IK Tool 'Applciation' wenn man es im 'Read Only' Mode aufruft (im Archiv).</li>
</ul> QFQ - Feature #4365 (New): Multi Language: new way of config https://project.math.uzh.ch/issues/43652017-09-04T12:40:57ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Vorschlag von Benj</p>
<p>a) config.qfq.ini: mehrere Elemente in einer Zeile ablegen (dann ist es nicht noetig LANGUAGA_A, B...) zu schreiben:</p>
<p>FORM_LANGUAGE = {languages : { id: 1, name:english }, { id: 2, name:spain } }</p>
<p>b) Im Form und FormElement Editor:</p>
<ul>
<li>Nur noch eine Spalte 'languageParameter'.</li>
<li>Pro Eintrag die Spalte mit angeben, durch Punkt getrennt. Bsp:</li>
</ul>
<p>english.label = Firstname<br />spain.label = ....</p>
<ul>
<li>Gibt es nur eine zusaetzliche Sprache, ist es ok den Qualifier 'english.' wegzulassen.</li>
</ul> QFQ - Feature #4250 (New): AutoCron in QFQ via PHPhttps://project.math.uzh.ch/issues/42502017-08-17T20:23:25ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Die AutoCron Features in PHP implementieren, ohne das eine T3 Seite benoetigt wird.</p>
Verbesserungen:
<ul>
<li>Massiv einfacheres Setup.</li>
<li>Evtl. koennte das PHP Skript durch Typo3 Cron aufgerufen werden - dann entfaellt sogar System Console Eintrag.</li>
<li>Aus dem PHP Skript koennen auch Mails versendet werden (kein dediziertes Skript noetig) - damit koennen einfach grId und xId gesetzt werden.</li>
<li>DB Credentials sind in PHP bekannt (zentrale Konfiguration).</li>
</ul>
Neu:
<ul>
<li>AutoCron Formular wird by default mit ausgeliefert.</li>
<li>In T3 Doku ist ein Beispiel QFQ Report fuer CrontEdit aufgefuehrt.</li>
<li>Es gibt Cron.grIdTyp, die im Beispiel aber nicht benutzt wird um Croneintraege zu klassifizieren.</li>
</ul> QFQ - Feature #4082 (New): Dynamic Update: modeSql - useful defaulthttps://project.math.uzh.ch/issues/40822017-07-08T09:40:12ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>Liefert die 'modeSql' keinen Record (z.B. bei r=0) wird das FE immer angezeigt. Gut waere wenn in so einem Fall des statische Setting (show, hidden ,... ) verwendet wird.
<ul>
<li>Verhalten im Manual beschreiben.</li>
</ul>
</li>
<li>Status Quo: FE mit 'hidden' werden nicht im Client gerendert - die koennen anschliessend nicht eingeschaltet werden. Loesungsvorschlag: falls ein modeSql angegeben, das Element trotzdem rendern.</li>
</ul> QFQ - Feature #4050 (New): sql.log: 1) FormElement ID which causes a specific action , 2) Result ...https://project.math.uzh.ch/issues/40502017-07-05T06:36:04ZCarsten Rosecarsten.rose@math.uzh.chQFQ - Feature #4023 (New): prepared statements - FE action: salveId, sqlInsert, sqlUpdate, sqlDel...https://project.math.uzh.ch/issues/40232017-07-02T14:01:33ZCarsten Rosecarsten.rose@math.uzh.ch
<p>For every sql query, add a new element 'Arg'. Eg.:</p>
<pre>
slaveId = {{SELECT id FROM Person WHERE id=?}}
slaveIdArg = {{id}}
sqlInsert = {{INSERT INTO Person (name, firstName) VALUES (?,?)}}
sqlInsertArg = {{name:F:allbut}}, {{firstName:F:allbut}}
</pre>
* The ...Arg definition should not be fired directly. Instead search for all (non wrapped) ',' , split, replace every by it's onw, build array with the values, fire the prepared statement. QFQ - Feature #3727 (New): Security: Session Hijacking erschwerenhttps://project.math.uzh.ch/issues/37272017-05-14T13:43:45ZCarsten Rosecarsten.rose@math.uzh.ch
<ol>
<li>Problem 1: durch '[FE][lockIP] = 0' wird der Schutz gegen Session Hijacking fuer FE-User verringert.</li>
<li>Problem 2: in QFQ ist kein 'Session Hijacking' based on changed IP detection implementiert.</li>
</ol>
Beides koennte leicht implementiert werden:
<ul>
<li>Zu 1)
<ul>
<li>Entweder eine Extension schreiben die gewisse IPs immer zulaesst (z.B. die lokalen IPs) - es gab entsrpechende Extensions.</li>
<li>Oder in QFQ diesen Check implementieren (z.B. in dem sich QFQ beendet, sollte der aktuelle FE User einer FE Gruppe angehoeren)</li>
</ul></li>
</ul>
<ul>
<li>Zu 2) implementieren. Am besten aehnlich konfiguriert wird '[FE][lockIP]'</li>
</ul> QFQ - Bug #3547 (New): FE of type 'note' causes writing of empty fields.https://project.math.uzh.ch/issues/35472017-04-10T22:14:04ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Beim save eines Records werden alle FormElemente vom Typ "note" auf leer gesetzt. Das hiess in dem Fall, dass der Name, Geschlecht, Titel der Personen gelöscht wurden, sobald versucht wurde, die Form zu speichern.</p> QFQ - Feature #3504 (New): Logging: welche Action FEs werden wann wie ausgefuehrthttps://project.math.uzh.ch/issues/35042017-04-04T08:36:30ZCarsten Rosecarsten.rose@math.uzh.ch
<p>Es waere gut wenn es Logfile geben wuerde in dem notiert wird welche Action FE ausgefuehrt wird und wie. Aktuell gibt es das Problem das wenn bei templatgroups die maxlength nicht gesetzt ist, die Elemente zwar korrekt angezeigt werden, beim speichern aber kein postprocessing erfolgt. das ist fuer einen entwickler, der keine debugging moeglichkeit hat, kaum nachzuvollziehen.</p>
Idee:
<ul>
<li>Ein Form kann in einen Debug Log Modus versetzt werden, in dem auf dem Form der neue 'debug' button geklickt wird. Nur BE User sehen diesen Button.</li>
<li>Dies oeffnet die Seite 'debug' mit einer 'monitor' Spalte, um das Logfile konstant anzuzeigen.</li>
<li>Alle Requests in der aktuellen Session auf diesem From werden gelogged.</li>
<li>In der php session wird vermerkt, das fuer dieses Form das Logging aktiviert ist.</li>
<li>Wird ein Form ge'debug'ed, und existieren Files fuer diese Form, und sind die 'last modified' timestamps der Datei aelter als 4h, werden die alten Dateien geloescht.</li>
<li>Wird die PHP Session beendet, verfaellt das debug Flag.</li>
<li>Name der Logdatei: fileadmin/protected/log/<formname>+<uniq timestamp>.log. Der Name sollte damit ausreichend eindeutig sein, das sich mehrere user/debug session nicht in den Weg kommen.</li>
</ul> QFQ - Feature #3432 (New): subrecord: dynamicUpdatehttps://project.math.uzh.ch/issues/34322017-03-26T12:59:55ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li>subrecords reagieren zur Zeit gar nicht auf 'dynamicUpdates'</li>
<li>Als Update wird immer eine komplette HTML Tabelle kommen.</li>
<li>Neu sollte die Moeglichkeit bestehen, das Subrecords auch ohne primary record gerendert werden koennen.
<ul>
<li>Beispiel (QFQ / formWithFeType): Ein Formular mit einem TypeAheadSql auf FormElement.type um alle Formulare mit dem selektieren Type anzuzeigen (subrecord).</li>
</ul></li>
</ul> QFQ - Feature #880 (New): Security: PHP, SQL Injection, XSShttps://project.math.uzh.ch/issues/8802015-08-13T14:46:51ZCarsten Rosecarsten.rose@math.uzh.ch
<ul>
<li><a class="external" href="http://www.heise.de/security/artikel/XSS-Bremse-Content-Security-Policy-1888522.html">http://www.heise.de/security/artikel/XSS-Bremse-Content-Security-Policy-1888522.html</a></li>
<li><a class="external" href="http://www.heise.de/thema/XSS">http://www.heise.de/thema/XSS</a></li>
<li><a class="external" href="https://www.acunetix.com/websitesecurity/php-security-1/">https://www.acunetix.com/websitesecurity/php-security-1/</a></li>
<li><a class="external" href="https://docs.php.earth/security/intro/">https://docs.php.earth/security/intro/</a></li>
<li><a class="external" href="https://www.butterfly.com.au/blog/website-development/web-application-security-essentials-for-php-developers-the-art-of-not-getting-hacked">https://www.butterfly.com.au/blog/website-development/web-application-security-essentials-for-php-developers-the-art-of-not-getting-hacked</a></li>
<li><a class="external" href="https://www.cloudways.com/blog/php-security/">https://www.cloudways.com/blog/php-security/</a></li>
</ul>