Datei herunterladen über Schulkonsole

Hallo zusammen,

ich habe vor den Ferien auf linuxmuster 7.1 upgedatet und in der Schulkonsole „Meine Dateien“ entdeckt. Ist das neu oder hab ich das bisher nur nicht gesehen? Auf jeden Fall ein tolles Feature, nur leider meldet bei mir die Schulkonsole bei jedem Downloadversuch „Datei nicht gefunden, möglicherweise aufgrund von Sonderzeichen im Dateinamen.“ Im Dateinamen sind definitiv keine Sonderzeichen. Was mache ich falsch?

Der Dateiupload und das löschen von Dateien funktionieren problemlos.

Danke und Gruß
Veit

Hallo Veit,

Es ist sehr wahrscheinlich, dass es ein Problem mit dem Pfad gibt. Es ist gut zu wissen, dass Dateien listen, hochladen und löschen funktioniert.

Ich habe einen kurzen Testskript geschrieben, um sowas auszuprobieren (es wird einfach nur die Dateien in Homeverzeichnis listen ):

wget https://raw.githubusercontent.com/linuxmuster/linuxmuster-webui7/lmn71/tests/test-smbclient.py
python3  test-smbclient.py

Es wäre gut es mit dem Betroffen Konto zu testen, und zu schauen welcher Pfad gemeldet ist ( Zeile „Files located at …“ ).

Gruß

Arnaud

Hallo Arnaud,

der Download geht mit keinem Account. Das Skript hat folgendes zurück gegeben:

> Samba domain to try (like server.linuxmuster.lan): server.linuxmuster.lan
>  Samba domain used by the Webui --> server.linuxmuster.lan
>  Samba realm  used by the Webui --> linuxmuster.lan
>  Teacher login: botsch
>  Password:
>  Getting Kerberos ticket
>  Setting process uid=3000071 and gid=100 for Kerberos ticket
>  Files located at \\server.linuxmuster.lan\default-school\teachers\botsch:
> 
>  D --> Einstellungen
>  D --> Informatik
>  D --> Klausur 15.1.19
>  D --> Klausur 9.1.2019
>  D --> OpenVPN
>  D --> __austeilen
>  D --> __dachboden
>  D --> __einsammeln
>  D --> _auszuteilen
>  D --> _bereitstellen
>  D --> _eingesammelt
>  D --> inf klausur 8.1.2019
>  D --> public_html

Gruß
Veit

Hallo Veit,

Es liegt wahrscheinlich an dem : am Ende.
Ich muss es testen.

Gruß

Arnaud

Hallo,

Das war quatsch, ich habe da falsch gelesen.
Wenn ein Dokument erfolgreich hochgeladen ist, kann man es wieder herunterladen ?

Gruß

Arnaud

Hallo,

nein, das geht auch nicht, es kommt die gleiche Fehlermeldung.

Gruß
Veit

Hallo Veit,

Es gibt leider viele mögliche Erklärungen. Kannst du bitte erneut probieren und schauen, ob es in /var/log/ajenti/ajenti.log eine Fehlermeldung gibt ? ( glaube ich eher nicht ).

Ansonstens können wir es mit einem Testskript probieren, aber dafür bräuchte ich den Pfad von einem Testdatei bei dir, und damit kann ich schnell einen Testskript schreiben. Im vom dir bereitgestellte Listing oben sehe ich nur Ordner, was die Webui noch nicht zum Download anbieten kann.

Gruß

Arnaud

Hallo Arnaud,

hier ein etwas längerer Auszug aus dem Ajenti Logfile der sich ergibt wenn ich versuche eine Datei herunterzuladen:

> 2022-11-14 07:23:40,183 INFO    : Opening a session for user botsch
> 2022-11-14 07:23:40,183 INFO    : Opening a new worker gate for session 60, client 10.0.0.254
> 2022-11-14 07:23:40,188 INFO    : 10.0.0.254 - - [2022-11-14 07:23:40] "POST /api/core/auth HTTP/1.1" 200 1488 0.306607
> 2022-11-14 07:23:40,193 INFO    : New worker "session 60" PID 89376, EUID 0, EGID 0
> 2022-11-14 07:23:40,193 INFO    : Authenticating session as botsch
> 2022-11-14 07:23:40,303 WARNING : Changing kerberos ticket rights for botsch
> 2022-11-14 07:23:40,369 INFO    : Worker 89376 is demoting to UID 3000071 / GID 3000921...
> 2022-11-14 07:23:40,370 INFO    : ...done, new EUID 3000071 EGID 3000921
> 2022-11-14 07:23:40,445 INFO    : 10.0.0.254 - - [2022-11-14 07:23:40] "POST /socket.io/?EIO=4&transport=polling&t=OHqpijt&sid=HQ40qq13W8MFyZIqAAIj HTTP/1.1" $
> 2022-11-14 07:23:40,445 INFO    : 10.0.0.254 - - [2022-11-14 07:23:40] "GET /socket.io/?EIO=4&transport=polling&t=OHqphno&sid=HQ40qq13W8MFyZIqAAIj HTTP/1.1" 2$
> 2022-11-14 07:23:40,459 INFO    : 10.0.0.254 - - [2022-11-14 07:23:40] "GET / HTTP/1.1" 302 148 0.004022
> 2022-11-14 07:23:40,706 INFO    : 10.0.0.254 - - [2022-11-14 07:23:40] "GET /view/ HTTP/1.1" 200 11846 0.002067
> 2022-11-14 07:23:41,011 INFO    : 10.0.0.254 - - [2022-11-14 07:23:41] "GET /resources/all.vendor.css HTTP/1.1" 200 17199 0.004577
> 2022-11-14 07:23:41,021 INFO    : 10.0.0.254 - - [2022-11-14 07:23:41] "GET /resources/all.css HTTP/1.1" 200 29219 0.008682
> 2022-11-14 07:23:41,021 INFO    : 10.0.0.254 - - [2022-11-14 07:23:41] "GET /resources/all.init.js HTTP/1.1" 200 625 0.007062
> 2022-11-14 07:23:41,186 INFO    : 10.0.0.254 - - [2022-11-14 07:23:41] "GET /resources/all.js HTTP/1.1" 200 80450 0.160551
> 2022-11-14 07:23:41,206 INFO    : 10.0.0.254 - - [2022-11-14 07:23:41] "GET /resources/all.vendor.js HTTP/1.1" 200 655457 0.183264
> 2022-11-14 07:23:41,285 INFO    : 10.0.0.254 - - [2022-11-14 07:23:41] "GET /resources/all.partials.js HTTP/1.1" 200 71429 0.021878
> 2022-11-14 07:23:41,842 INFO    : 10.0.0.254 - - [2022-11-14 07:23:41] "GET /resources/all.locale.js?lang=de HTTP/1.1" 200 21250 0.009485
> 2022-11-14 07:23:41,844 INFO    : 10.0.0.254 - - [2022-11-14 07:23:41] "GET /socket.io/?EIO=4&transport=polling&t=OHqpj3k HTTP/1.1" 200 214 0.000354
> 2022-11-14 07:23:41,869 INFO    : 10.0.0.254 - - [2022-11-14 07:23:41] "GET /api/core/identity HTTP/1.1" 200 3222 0.035859
> 2022-11-14 07:23:41,873 INFO    : 10.0.0.254 - - [2022-11-14 07:23:41] "GET /api/core/sidebar HTTP/1.1" 200 1848 0.025685
> 2022-11-14 07:23:41,880 INFO    : 10.0.0.254 - - [2022-11-14 07:23:41] "GET /api/core/session-time HTTP/1.1" 200 161 0.046264
> 2022-11-14 07:23:42,105 INFO    : 10.0.0.254 - - [2022-11-14 07:23:42] "GET /resources/all.locale.js?lang=de HTTP/1.1" 200 21250 0.005408
> 2022-11-14 07:23:42,123 INFO    : 10.0.0.254 - - [2022-11-14 07:23:42] "GET /api/core/sidebar HTTP/1.1" 200 1848 0.003994
> 2022-11-14 07:23:42,123 INFO    : 10.0.0.254 - - [2022-11-14 07:23:42] "GET /api/core/web-manifest HTTP/1.1" 200 415 0.001647
> 2022-11-14 07:23:42,137 INFO    : 10.0.0.254 - - [2022-11-14 07:23:42] "GET /api/core/session-time HTTP/1.1" 200 161 0.011757
> 2022-11-14 07:23:42,392 INFO    : 10.0.0.254 - - [2022-11-14 07:23:42] "GET /api/core/session-time HTTP/1.1" 200 161 0.011980
> 2022-11-14 07:23:42,427 INFO    : 10.0.0.254 - - [2022-11-14 07:23:42] "POST /socket.io/?EIO=4&transport=polling&t=OHqpjCp&sid=4d-JC4Oy-8CyuUqHAAIl HTTP/1.1" $
> 2022-11-14 07:23:42,427 INFO    : 10.0.0.254 - - [2022-11-14 07:23:42] "GET /socket.io/?EIO=4&transport=polling&t=OHqpjCp.0&sid=4d-JC4Oy-8CyuUqHAAIl HTTP/1.1"$
> 2022-11-14 07:23:42,457 WARNING : Backward @url compatibility for handle_api_is_configured
> 2022-11-14 07:23:42,678 INFO    : 10.0.0.254 - - [2022-11-14 07:23:42] "GET /api/core/tasks/request-update HTTP/1.1" 200 161 0.002167
> 2022-11-14 07:23:42,678 INFO    : 10.0.0.254 - - [2022-11-14 07:23:42] "GET /socket.io/?EIO=4&transport=polling&t=OHqpjGk&sid=4d-JC4Oy-8CyuUqHAAIl HTTP/1.1" 2$
> 2022-11-14 07:23:43,485 INFO    : 10.0.0.254 - - [2022-11-14 07:23:43] "GET /api/lmn/quota/botsch HTTP/1.1" 200 5869 0.845856
> 2022-11-14 07:23:44,960 INFO    : 10.0.0.254 - - [2022-11-14 07:23:44] "GET /api/core/session-time HTTP/1.1" 200 161 0.011913
> 2022-11-14 07:23:44,964 WARNING : Backward @url compatibility for handle_api_smb_shares
> 2022-11-14 07:23:44,989 INFO    : 10.0.0.254 - - [2022-11-14 07:23:44] "GET /api/lmn/smbclient/shares/botsch HTTP/1.1" 200 680 0.026666
> 2022-11-14 07:23:45,223 INFO    : 10.0.0.254 - - [2022-11-14 07:23:45] "GET /api/core/session-time HTTP/1.1" 200 161 0.011879
> 2022-11-14 07:23:45,239 WARNING : Backward @url compatibility for handle_api_smb_list
> 2022-11-14 07:23:45,901 INFO    : 10.0.0.254 - - [2022-11-14 07:23:45] "POST /api/lmn/smbclient/list HTTP/1.1" 200 29840 0.663448
> 2022-11-14 07:24:03,655 WARNING : Backward @url compatibility for handle_smb_download
> 2022-11-14 07:24:03,746 INFO    : 10.0.0.254 - - [2022-11-14 07:24:03] "HEAD /api/lmn/smbclient/download?path=\\server.linuxmuster.lan\default-school\teachers$
> 2022-11-14 07:24:06,846 INFO    : 10.0.0.254 - - [2022-11-14 07:24:06] "GET /socket.io/?EIO=4&transport=polling&t=OHqpjKk&sid=4d-JC4Oy-8CyuUqHAAIl HTTP/1.1" 2$
> 2022-11-14 07:24:06,882 WARNING : Backward @url compatibility for handle_smb_download
> 2022-11-14 07:24:06,959 INFO    : 10.0.0.254 - - [2022-11-14 07:24:06] "HEAD /api/lmn/smbclient/download?path=\\server.linuxmuster.lan\default-school\teachers$
> 2022-11-14 07:24:07,100 INFO    : 10.0.0.254 - - [2022-11-14 07:24:07] "POST /socket.io/?EIO=4&transport=polling&t=OHqppEI&sid=4d-JC4Oy-8CyuUqHAAIl HTTP/1.1" $
> 2022-11-14 07:24:07,997 WARNING : Backward @url compatibility for handle_smb_download
> 2022-11-14 07:24:08,048 INFO    : 10.0.0.254 - - [2022-11-14 07:24:08] "HEAD /api/lmn/smbclient/download?path=\\server.linuxmuster.lan\default-school\teachers$
> 2022-11-14 07:24:08,606 WARNING : Backward @url compatibility for handle_smb_download
> 2022-11-14 07:24:08,686 INFO    : 10.0.0.254 - - [2022-11-14 07:24:08] "HEAD /api/lmn/smbclient/download?path=\\server.linuxmuster.lan\default-school\teachers$
> 2022-11-14 07:24:10,367 INFO    : 10.0.0.254 - - [2022-11-14 07:24:10] "GET /socket.io/?EIO=4&transport=polling&t=OHqpf2H&sid=Nuy0I8RkSLlBO-ivAAIh HTTP/1.1" 4$
> 2022-11-14 07:24:21,866 INFO    : 10.0.0.254 - - [2022-11-14 07:24:21] "GET /socket.io/?EIO=4&transport=websocket&sid=HQ40qq13W8MFyZIqAAIj HTTP/1.1" 400 124 4$

Die Datei die ich versucht habe runterzuladen liegt auf dem Server unter:

/srv/samba/schools/default-school/teachers/botsch/putty.exe

Kann es vielleicht auch an unserer Firewall liegen. Wir haben eine Sophos im Einsatz, muss ich da für den Samba Download noch bestimmte Ports freigeben? Außerdem heißt unsere Domäne intern linuxmuster.lan, von außen ist der Server unter server.hans-baldung-gymnasium.de zu erreichen. Macht das Schwierigkeiten?

Gruß
Veit

Hallo.
Ich bin nicht ganz sicher, ob eine Freigabe des WebUI nach außen empfohlen wird … vor längerer Zeit hießt es hier im Forum sinngemäß dazu, dass das WebUI dazu unter Umständen nicht „abgehärtet genug“ sei. Ob das immernoch so gilt, müssten allerdings ein Entwickler nochmal genauer erklären.
Viele Grüße,
Michael

Hi Michael,

ohne eine WAF und Updates würde ich das auch nicht grundsätzlich empfehlen. Das scheint hier aber der Fall, daher alles gut. Es wird immer mehr Notwendig sein, dass die WebUI aus dem Internet erreichbar ist. Daher liegt auch der Entwicklungsschwerpunkt mit darauf. Sicherheitsmaßnahmen drum herum sollten aber nicht vernachlässigt werden.

Kurz um, wer weiß was er tut, kann das gerne machen. Das File-Plugin macht im Intranet auch wenig sinn.

LG, Maurice

Hallo Veit,

Danke für die Logs, die sind aber nicht komplett, da die interessante Zeile ( die mit HEAD ), gekürzt sind. Ich muss sehen, welche Antwort da rauskommt und hoffen, dass es hilft.
Die Info mit dem Firewall ist natürlich wichtig, aber ich glaube nicht, dass es daran liegt.

Um es teilweise zu debuggen, habe ich folgende Skript geschrieben :

import os
import sys
import pwd
import pexpect
import time
import smbclient

from smbprotocol.exceptions import SMBOSError
from getpass import getpass

def p(*args, end=""):
    print("\033[1m\033[38;5;214m", *args, "\033[39m\033[0m", end=end)

p("Teacher login: bosch")
teacher = 'bosch'

pw = getpass(prompt="\033[1m\033[38;5;214m Passwordi for bosch:\033[39m\033[0m", stream=None)

uid = pwd.getpwnam(teacher).pw_uid

p("Getting Kerberos ticket", end="\n")
child = pexpect.spawn('/usr/bin/kinit', ['-c', f'/tmp/krb5cc_{uid}', teacher])
child.expect('.*')
child.sendline(pw)

# Waiting until the ticket is written
time.sleep(2)

if not os.path.isfile(f'/tmp/krb5cc_{uid}'):
    p("No valid Kerberos ticket found !")
    sys.exit()

p(f"Setting process uid={uid} and gid=100 for Kerberos ticket", end="\n")
os.chown(f'/tmp/krb5cc_{uid}', uid, 100)
os.setgid(100)
os.setuid(uid)

try:
    path = '\\\\server.linuxmuster.lan\\default-school\\teachers\\bosch\\putty.exe'
    result = smbclient.path.isfile(path)
    if result:
        p(f"File {path} exists!")
    else:
        p(f"Could not reach the file {path}!")
except Exception as e:
    print(e)

Das kannst du als /tmp/test-smb.py auf dem Server speichern, und damit testen, ob der Zugriff klappt : python3 /tmp/test-smb.py.
Mal schauen, was daraus kommt :slight_smile:

Viele Grüße

Arnaud

Hallo Arnaud,

da scheint noch ein kleiner Fehler im Skript zu sein. Ich bekomme folgende Meldung:

 File "./test-smb.py", line 21
    def p(*args, end=""):
                   ^
SyntaxError: invalid syntax

In der Konsole im Browser bekomme ich in der Schulkonsole beim herunterladen einer Datei folgende Meldung:

HEAD https://server.hans-baldung-gymnasium.de/api/lmn/smbclient/download?path=\server.linuxmuster.lan\default-school\teachers\botsch/putty.exe net::ERR_EMPTY_RESPONSE

Hilft dir das weiter?

Gruß
Veit

Hallo Arnaud,

ich habe den Fehler gefunden. Kann ihn aber nicht prinzipiell lösen. Ich habe die all.js Datei in dem Plugin lmn_samba_shares geändert und habe mal folgende zwei Zeilen eingefügt:

    $http.head('/api/lmn/smbclient/download?path=\\\\server\\default-school\\teachers\\botsch\\putty.exe');
    $window.open('/api/lmn/smbclient/download?path=\\\\server\\default-school\\teachers\\botsch\\putty.exe');

Dann hat der download von dieser Datei funktioniert.

Aber wenn ich die Datei anklicke geht es nicht.

Gruß
Veit

Hab noch etwas rumprobiert und herausgefunden, dass die Zeile

$http.head(’/api/lmn/smbclient/download?path=\\server\default-school\teachers\botsch\putty.exe’);

nicht funktioniert. Ich hab das Skript

/usr/lib/linuxmuster-webui/plugins/lmn_samba_shares/resources/build/all.js

jetzt mal so umgeschrieben:

$scope.download = function (path) {
    $window.open('/api/lmn/smbclient/download?path=' + path);

    $http.head('/api/lmn/smbclient/download?path=' + path).then(function (resp) {
        $window.open('/api/lmn/smbclient/download?path=' + path);
    }, function (resp) {
        notify.error(gettext('File not found, may be due to special chars in the file name.'));
    });
};

dann funktioniert es und die Datei wird heruntergeladen.

Gruß
Veit

Hallo Veit,

Es gibt keinen Fehler. Der Skript sollte mit python3 ausgeführt sein und nicht mit python.

Das ist sehr gut zu wissen, dass der direkt Download funktioniert, aber leider wird es das Problem nur temporär lösen. Der HEAD Request ist da um zu überprüfen, dass die Ressource zugänglich ist, vor den Download zu starten ( genau um solche Probleme zu vermeiden ).

Was ich versuche zu verstehen ist, warum dieser HEAD Request nicht erfolgreich läuft, und dafür wären die betroffene vollständinge Zeile im Logs und das Ergebnis vom Testskript vielleicht hilfreich :slight_smile:

Viele Grüße

Arnaud

Hallo Arnaud,

wer lesen kann ist klar im Vorteil.

Mit python3 lief das natürlich und hier das Ergebnis:

Password for botsch:
Teacher login: botsch Getting Kerberos ticket
Setting process uid=3000071 and gid=100 for Kerberos ticket
File \server.linuxmuster.lan\default-school\teachers\botsch\putty.exe exists!

Hier die Zeile mit HEAD aus dem Ajenti-Log

2022-11-15 17:47:13,862 INFO : 10.0.0.254 - - [2022-11-15 17:47:13] „HEAD /api/lmn/smbclient/download?path=\server.linuxmuster.lan\default-school\teachers\botsch/hangman.html HTTP/1.1“ 200 652 0.013211

Hilft das?

Gruß
Veit

Hallo Arnaud,

ich habe mal statt $http.head ein $http.get in das Skript reingeschrieben und dann klappt das ganz gut. Auch wenn die Datei fehlt (ich hab sie einfach mal per FTP weggelöscht während die Schulkonsole offen war) kommt die entsprechende Fehlermeldung. Wäre das eine Lösung? Dann wird eben gleich die ganze Datei runtergeladen, das ist doch der einzige Unterschied zwischen head und get, oder?

Gruß
Veit

Hallo Veit,

Leider ist es einen Status Code 200. Das bedeutet, dass der Request erfolgreich angekommen ist. Daraus kann ich keine Info ziehen. Das einzige, was ich mich vorstellen kann, ist dass sophos die Antworte auf HEAD Request nicht an dem Client zurückgibt. Das wäre erstaunlich, aber das ist möglich. Ich muss es bei mir testen.

Method HEAD wird in diesem Fall nur schauen, ob die Anfrage möglich ist, und wenn ja, öffnet einen anderen Fenster zum Download. Das ist relativ sauber und ermöglicht Kompatibilität mit verschiedene Browsers. Method GET wird direkt den Download starten, selbst wenn die Datei nicht existiert. Aber auch in diesem Fall habe ich im Backend kleine Sicherungen geschrieben.

Ich teste mal mit meinem Sophos am Wochenende und melde mich. Leider habe ich wie alle hier im Forum aktuell wenig Zeit.

Viele Grüße

Arnaud

Hallo,

Ich habe bei mir mit einem Sophos getestet. Der Zugriff und der Download von außen klappt problemlos. Außer eine besondere Regel im FW oder ein DNS Problem habe ich keine Idee.
Vielleicht sollten wir es zusammen auf deinem Server anschauen.

Gruß

Arnaud

Hallo Arnaud,

ich habe jetzt ausprobiert ob der Download von intern mit http.head geht und das funktioniert (ich habe die Schulkonsole über die IP aufgerufen und nicht über die webserver Adresse). Also muss es ja an der Sophos liegen. Also habe ich ein paar Einstellungen in der Web Application Firewall verändert und nachdem ich das „Rewrite HTML“ rausgenommen habe hat es funktioniert. Wenn ich es richtig verstanden habe, ist das Rewrite HTML nur notwendig wenn auf dem webserver absolute Links mit der internen Webserveradresse verwendet werden. Das ist aber ja wohl nicht der Fall, zumindest läuft die Schulkonsole so wie sie soll.

Danke für deinen Einsatz. Ich finde diese Erweiterung der Schulkonsole sehr wertvoll. Das macht die Nextcloud ja beinahe überflüssig.

Danke und Gruß
Veit