Savoir si un fichier est protégé par mot de passe

Bonjour,

J'ai une macro qui liste les différents fichiers d'un dossier ainsi que leurs propriétés et je voudrais rajouter la mention "ouverture avec mot de passe" si c'est le cas.

Je n'ai pas besoin de connaître le mot de passe, juste de savoir qu'il y en a un soit à l'ouverture soit en édition.

Je ne trouve pas cette information dans les propriétés du fichier.

Merci

Claude

Mais on peut rajouter une propriété personnalisée soit en piochant dans ma liste de ce qui est proposé, soit en en créant une nouvelle ! Après, est-ce qu'elle va apparaître dans votre navigateur de fichiers c’est une autre paire de manches.

Dans Dolphin je ne la vois pas.

Je crois que je me suis mal exprimée. Je ne veux pas rajouter de propriété, je veux juste quand je liste des fichiers Libreoffice savoir s'ils sont protégés par mot de passe.

Actuellement si je fais un getfile, j'ai bien des infos sur le fichier en cours mais pas la protection (ou je n'ai pas su la trouver)

merci quand même

-------- Message original --------
*Sujet: *[INTERNET] Re: [fr-users] Savoir si un fichier est protégé par mot de passe
*Pour : *users@fr.libreoffice.org

Bonjour,

-----Message d'origine-----
De : PREF31 Libreoffice [mailto:pref-open-office@haute-garonne.gouv.fr]
Envoyé : mercredi 22 novembre 2017 15:21
À : users@fr.libreoffice.org
Objet : [fr-users] Savoir si un fichier est protégé par mot de passe

Bonjour,

J'ai une macro qui liste les différents fichiers d'un dossier ainsi que
leurs propriétés et je voudrais rajouter la mention "ouverture avec mot
de passe" si c'est le cas.

Je n'ai pas besoin de connaître le mot de passe, juste de savoir qu'il y
en a un soit à l'ouverture soit en édition.

Je ne trouve pas cette information dans les propriétés du fichier.

J'ai bien une solution (un peu lourde) pour les fichiers protégés en
ouverture, en voici les grandes lignes (j'ai testé sommairement):

- ouvrir le fichier (on peut le faire caché, Hidden = True)
- essayer de lire un objet, par exemple pour Calc l'objet feuilles:
  mesFeuilles = Doc.Sheets
- si le fichier Calc est protégé en ouverture, on a une erreur

Il faudra trouver un équivalent pour les ODT

Quant aux fichiers protégés en édition seulement (lecture seule), je n'ai
pas trouvé ...

Cordialement,
Michel

Bonjour,

Je crois que je me suis mal exprimée. Je ne veux pas rajouter de propriété, je veux juste quand je liste des fichiers Libreoffice savoir s'ils sont protégés par mot de passe.

Actuellement si je fais un getfile, j'ai bien des infos sur le fichier en cours mais pas la protection  (ou je n'ai pas su la trouver)

Ce sont les documents qui sont protégés pas les fichiers. Les documents protégés par mot de passe sont dans des archives au format ZIP comme les documents non protégés et ces fichiers s'ouvrent sans problème avec n'importe quel logiciel sachant lire le format ZIP. Ce sont certains fichiers contenus dans l'archive qui sont chiffrés. On peut savoir si un document est protégé en lisant le fichier manifest.xml qui se trouve dans le sous-dossier META-INF. En effet quand un document est protégé, ce fichier contient des informations sur le chiffrement des fichiers xml constituant le document. En particulier il contient la chaîne de caractères "encryption". On peut donc faire un script pour vérifier cette propriété, il suffit de décompresser l'archive dans un dossier temporaire, de faire un grep sur le fichier manifest.xml puis de jeter le dossier temporaire.

Bonne journée
JBF

Bonjour,

Juste une observation :
Si un fichier est protégé par un mot de passe, aucune miniature n'est créée.
Dans la liste des fichiers dézippés, il n'y a donc pas de dossier Thumbnails.

Jacques

Bonjour et merci

J'avais commencé en examinant les manifest.xml comme préconisé par Jean-Baptiste que je remercie aussi. mais c'est un peu compliqué de décompresser via une macro sous windows.
Par contre, chercher le dossier "Thumbnails" est très facile et ce d'autant que je l'avais déjà avec le dossier "Basic" pour savoir si les documents contiennent des macros.

Encore une fois merci à tous pour votre implication.

Claude

-------- Message original --------
*Sujet: *[INTERNET] Re: [fr-users] Savoir si un fichier est protégé par mot de passe
*Pour : *users@fr.libreoffice.org

Bonjour,

Bonjour et merci

J'avais commencé en examinant les manifest.xml comme préconisé par Jean-Baptiste que je remercie aussi. mais c'est un peu compliqué de décompresser via une macro sous windows.
Par contre, chercher le dossier "Thumbnails" est très facile et ce d'autant que je l'avais déjà avec le dossier "Basic" pour savoir si les documents contiennent des macros.

Je ne comprends pas bien : chercher le dossier Thumbnails suppose aussi de décompresser l'archive.

Bonne journée
JBF

Bonjour,

J'ai une macro qui liste les différents fichiers d'un dossier ainsi que
leurs propriétés et je voudrais rajouter la mention "ouverture avec mot
de passe" si c'est le cas.

Je n'ai pas besoin de connaître le mot de passe, juste de savoir qu'il y
en a un soit à l'ouverture soit en édition.

Je ne trouve pas cette information dans les propriétés du fichier.

Pour ceux que ça intéresse, la macro ci-dessous permet de vérifier la protection d'un document en testant, comme indiqué par Jacques, l'existence du dossier "Thumbnails" dans le document (zip).

8< ----------------------------------------------------------------

Function IsDocumentProtected(ByRef pDocURL As String) As Integer
'Checks whether a given LibreOffice document is protected
'This test is based upon the fact that a LibO protected document zip structure
'doesn't contain the usual 'Thumbnails' directory.
'
'Input:
'-- pDocURL: the document name (FQDN) in URL form.
' This document is supposed to exist.
'Output: 1 if the document is protected in any way, 0 if the document is not protected
' or -1 if an error occurred (eg: the document is not a LibO one/not in zip format)

  Const ZIP_DIR_ROOT = ""
  Const ZIP_DIR_THUMBNAILS = "Thumbnails"

  Dim l_Protected As Integer
  Dim lo_Package As Object 'the zip document container
  Dim l_Arg As New com.sun.star.beans.NamedValue
  
  l_Protected = -1 'default value: unknown/error

  On Local Error Goto ErrHandler
  lo_Package = createUnoService("com.sun.star.packages.Package")
  
  'open the document zip container
  l_Arg.Name = "PackageFormat"
  l_Arg.Value = False 'plain Zip format
  lo_Package.initialize(Array(pDocURL), l_Arg)
  
  'check for "Thumbnails" directory
  'Checking for root first allows to ignore non-zip containers
  If lo_Package.hasByHierarchicalName(ZIP_DIR_ROOT) Then
    If lo_Package.hasByHierarchicalName(ZIP_DIR_THUMBNAILS) Then
      l_Protected = 0 'not protected
    Else
      l_Protected = 1 'protected
    End If
  End If
    
  'close zip container
  lo_Package = Nothing
  
  ErrHandler:
    'do nothing
    'We get here either because everything went OK or because the .initialize went wrong.

  IsDocumentProtected = l_Protected
End Function 'IsDocumentProtected

---------------------------------------------------------------- >8

Pour l'appeler, voici un bout de code :

8< ----------------------------------------------------------------

Sub Test()

  Dim l_FileName As String
  Dim l_ThisDir As String

  l_ThisDir = "C:/Chemin/Vers/"
  l_FileName = ConvertToURL(l_ThisDir & "MonFichier.ods")

  Select Case IsDocumentProtected(l_FileName)
  
    Case 0
      MsgBox l_FileName & " NON protégé"

    Case 1
      MsgBox l_FileName & " protégé"

    Case -1
      MsgBox l_FileName & " INCONNU"
  
  End Select
  
End Sub 'Test

---------------------------------------------------------------- >8

Si vous répondez, merci de penser à utiliser la fonction "répondre à tous" de votre logiciel de courrier électronique de façon que la liste reçoive une copie de votre réponse.

Bien cordialement,

Bonjour,
Non, pour examiner le contenu d'un dossier zippé, il n'est pas nécessaire de le décompresser.

Je me sers du code trouvé (comme tout ce que je fais sur les macros) de l'excellent livre de Bernard Marcelly et Laurent Godard

Voici le code

function ChercheZip(URLzip As String, zipFolder As String, nomcherche as string) as boolean
Dim ZipService As Object, ZipPackageFolder As Object
Dim ZipElement As Object, enuZ As Object, liste As String

ChercheZip =false
ZipService = CreateUnoService("com.sun.star.packages.Package")
ZipService.initialize(Array(URLzip))
if ZipService.hasByHierarchicalName(zipFolder) then
   ZipPackageFolder = ZipService.getByHierarchicalName(zipFolder)
   enuZ = ZipPackageFolder.createEnumeration
   liste = ""
   Do while enuZ.hasMoreElements
     ZipElement = enuZ.nextElement
     if ZipElement.supportsService("com.sun.star.packages.PackageFolder") then
       liste = liste & "Répertoire : " & ZipElement.Name & "/" & chr(13)
     else
      liste = liste & "Fichier : " & ZipElement.Name & chr(13)
     end if
     If ZipElement.Name = nomcherche then

         ChercheZip = true
         exit do
         'msgbox nomcherche & " existe dans " & URLzip
        'else
         'msgbox zipfolder & " n'existe dans " & URLzip
     endif
   Loop
   'MsgBox(liste, 0, "Répertoire " & urlzip)
'else
   'MsgBox("Ce répertoire n'existe pas dans le zip", 16, "Répertoire " & zipFolder)
end if
End function

Pour l'appeler
ChercheZip(fichier"","Thumbnails") pour la protection
ou
ChercheZip(fichier"","Basic") pour la détection de macros
avec fichier en notation url

Claude

-------- Message original --------
*Sujet: *[INTERNET] Re: [fr-users] Re: Re: [fr-users] Savoir si un fichier est protégé par mot de passe
*Pour : *users@fr.libreoffice.org

Bonjour Claude,

en fait on ouvre le fichier (zip) pour accéder à son dictionnaire.
C'est ce que font les lignes :

'création de l'objet conteneur
ZipService = CreateUnoService("com.sun.star.packages.Package")
'ouverture du conteneur (et accès à son contenu)
ZipService.initialize(Array(URLzip))
'[etc.]

Le dictionnaire du zip se trouve en fin de fichier, en clair (ouvre un .od* avec Notepad++ pour le voir). Il est lisible en effet sans décompression à proprement parler.
Voir ici : https://en.wikipedia.org/wiki/Zip_(file_format)#Structure

Très cordialement,