ZipFile Modul: Umask beim entpacken wird ignoriert.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

Hi all,

ich bin heute über ein seltsames Problem gestoßen und ich denke es hat nicht wirklich was mit Python zu tun, sondern eher über das ZIP Format, speziell die ZipInfo.extra bits.

Also erst mal das Problem schildern:

In Python:

Code: Alles auswählen

import time
import zipfile

data = 'Hello World'
date_time = tuple(time.localtime(time.time()))
zinfo = zipfile.ZipInfo('README.TXT', date_time[:6])

zfile = zipfile.ZipFile('myarchive.zip', 'w', zipfile.ZIP_DEFLATED, allowZip64=True)
zfile.writestr(zinfo, data)
zfile.close()
In Konsole:

Code: Alles auswählen

dever@devbo:~/tmp$ unzip -l myarchive.zip 
Archive:  myarchive.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       11  2016-12-20 02:55   README.TXT
---------                     -------
       11                     1 file
dever@devbo:~/tmp$ unzip myarchive.zip 
Archive:  myarchive.zip
 extracting: README.TXT              
dever@devbo:~/tmp$ ls -l
total 0
-rw-rw-rw- 1 dever dever 129 Dec 20 03:01 myarchive.zip
---------- 1 dever dever  11 Dec 20 02:55 README.TXT
Komisch: Beim entpacken der Datei, die quasi im Speicher erstellt wurde über ZipFile.writestr() wird die Umask meines Users einfach ignoriert.

Das passiert allerdings wirklich nur bei ZIP Dateien, die ich über Python / ZipFile erstelle, NICHT wenn ich 7-zip nutze oder externe tools.

Und meine Umask funktioniert für normale Fälle:

Code: Alles auswählen

dever@devbo:~/tmp$ umask
0000
dever@devbo:~/tmp$ touch Datei
dever@devbo:~/tmp$ ls -l
total 0
-rw-rw-rw- 1 dever dever   0 Dec 20 03:12 Datei
-rw-rw-rw- 1 dever dever 129 Dec 20 03:01 myarchive.zip
---------- 1 dever dever  11 Dec 20 02:55 README.TXT
Wenn ich ein ZIP file von 7-zip entpacke in der exakt gleichen Shellumgebung, dann haben alle entpackten Dateien die "korrekten" file permissions.

Siehe hier:

Code: Alles auswählen

dever@devbo:~/tmp$ unzip -l primenumbers.zip 
Archive:  primenumbers.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
    72992  2014-06-18 19:52   primenumbers.txt
---------                     -------
    72992                     1 file
dever@devbo:~/tmp$ unzip primenumbers.zip 
Archive:  primenumbers.zip
  inflating: primenumbers.txt        
dever@devbo:~/tmp$ ls -l
total 100
-rw-rw-rw- 1 dever dever     0 Dec 20 03:12 Datei
-rw-rw-rw- 1 dever dever   129 Dec 20 03:01 myarchive.zip
-rw-rw-rw- 1 dever dever 72992 Jun 18  2014 primenumbers.txt
-rw-rw-rw- 1 dever dever 18949 Dec 20 03:17 primenumbers.zip
---------- 1 dever dever    11 Dec 20 02:55 README.TXT
Also entweder liegts am ZipFile Modul von Python oder evtl. an den ZipInfo.extra bits.

Hat jemand einschlägige Erfahrung mit ZIP Dateien in Python und kann evtl. was intelligentes dazu sagen?

Danke für wertvolle Beiträge im Voraus.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@akis.kapo: Du bist auf dem richtigen Weg. Woher soll Python wissen, welche Rechte Du für eine Datei vergeben willst? Die mußt Du schon explizit setzen:

Code: Alles auswählen

info = zipfile.ZipInfo(name)
info.external_attr = 0o640 << 16
Es sieht aber so aus, also ob ZipInfo nicht wirklich für den allgemeinen Gebrauch gedacht ist. Besser, Du setzt gar keine eigenes ZipInfo, sondern nimmst die Default-Info, die writestr sowieso erzeugt:

Code: Alles auswählen

import time
import zipfile

data = 'Hello World'
zfile = zipfile.ZipFile('myarchive.zip', 'w', zipfile.ZIP_DEFLATED, allowZip64=True)
zfile.writestr('README.TXT', data)
zfile.close()
Benutzeravatar
akis.kapo
User
Beiträge: 127
Registriert: Freitag 1. September 2006, 12:58

Ok, also diese default Werte sind schon mal besser als 0000 (tatsächlich: 0600).
D.h. die Umask wird auf keinen Fall berücksichtigt, anders als ich angenommen habe - es wird nur das genommen, was im ZipFile definiert ist.

Ich hab das scheinbar irgendwie total falsch verstanden (die .writestr() Definition in der libref).

Auch habe ich die Encodierung der file permissions unter .extra vermutet, weil ich da was verdächtiges gelesen habe (UNIX section unter PKZIP Doku).

Danke für das pointen in die richtige Richtung (.external_attr)!
Antworten