On Sun, Jul 19, 2020 at 09:22:33PM -0400, Richard Kimberly Heck wrote:
> > when we export xHTML output, the exported images are in the form
> > "incrementnumber_path_to_the_image_imagefilename.png".
> >
> > I'm strugling with two issues:
> >
> > - the initial number is unstable - e.g. if you insert new fig in the 
> > document
> >   all subsequent ones suddenly get +1.  after several exports you get bunch 
> > of
> >   obsolete files which you need to manually delete after each update.
> >
> > - the filenames tend to unnecesarily disclose directory structures (from 
> > what I
> >   see full path, not just relative  used.)
> >
> > Is there some shortcoming if the filenames were hashes of the pictures
> > (or filename+hash so one can still makes sense of the files)?
> > It would help with both problems.
> 
> I used mangled names just because it was relatively easy to do. We can
> change it to whatever we want, I suppose.

Attached is the patch that mangles graphic filenames by hashes (sha2 of 
filename+abs path).
It omits counting part as I coud not figure out why we use counting at all.

Is there case in which xHTML meaningfully exports two pictures with the same
path+name but different counter? (I checked the same file with two different
size, but that still exports as a single file).

This should make the exported names stable and not disclosing absolute paths,
the payment are long unreadable filenames (we could add filename), e.g.
0d21b378304bfb8c834763b634ed37377e85f063bb1736138df93f3ee207c14c.jpg
and astronomically small probability that two different files will
end up with the same hash.

We could have this by default, we can have it as a pref or I can just
add this to my private patchset.

Opinions?

Pavel
diff --git a/src/insets/InsetGraphics.cpp b/src/insets/InsetGraphics.cpp
index b4ddd77a1a..62efa84dc0 100644
--- a/src/insets/InsetGraphics.cpp
+++ b/src/insets/InsetGraphics.cpp
@@ -575,7 +575,7 @@ copyToDirIfNeeded(DocFileName const & file, string const & 
dir)
        if (rtrim(only_path, "/") == rtrim(dir, "/"))
                return make_pair(IDENTICAL_PATHS, FileName(file_in));
 
-       string mangled = file.mangledFileName();
+       string mangled = file.mangledFileName(empty_string(), false, true);
        if (theFormats().isZippedFile(file)) {
                // We need to change _eps.gz to .eps.gz. The mangled name is
                // still unique because of the counter in mangledFileName().
diff --git a/src/support/FileName.cpp b/src/support/FileName.cpp
index 179fef46ee..307406e124 100644
--- a/src/support/FileName.cpp
+++ b/src/support/FileName.cpp
@@ -22,6 +22,7 @@
 #include "support/Package.h"
 #include "support/qstring_helpers.h"
 
+#include <QCryptographicHash>
 #include <QDateTime>
 #include <QDir>
 #include <QFile>
@@ -953,9 +954,13 @@ string DocFileName::outputFileName(string const & path) 
const
        return save_abs_path_ ? absFileName() : relFileName(path);
 }
 
-
 string DocFileName::mangledFileName(string const & dir) const
 {
+       return mangledFileName(dir, true, false);
+};
+
+string DocFileName::mangledFileName(string const & dir, bool use_counter, bool 
encrypt_path) const
+{
        // Concurrent access to these variables is possible.
 
        // We need to make sure that every DocFileName instance for a given
@@ -970,8 +975,16 @@ string DocFileName::mangledFileName(string const & dir) 
const
                return (*it).second;
 
        string const name = absFileName();
+
        // Now the real work. Remove the extension.
        string mname = support::changeExtension(name, string());
+       if (encrypt_path) {
+               QString qname = QString::fromStdString(mname);
+               QByteArray hash  = 
QCryptographicHash::hash(qname.toLocal8Bit(),QCryptographicHash::Sha256);
+               hash = hash.toHex();
+               mname = hash.toStdString();
+               }
+       
        // The mangled name must be a valid LaTeX name.
        // The list of characters to keep is probably over-restrictive,
        // but it is not really a problem.
@@ -991,9 +1004,12 @@ string DocFileName::mangledFileName(string const & dir) 
const
        // Prepend a counter to the filename. This is necessary to make
        // the mangled name unique.
        static int counter = 0;
-       ostringstream s;
-       s << counter++ << mname;
-       mname = s.str();
+
+       if (use_counter) {
+               ostringstream s;
+               s << counter++ << mname;
+               mname = s.str();
+       }
 
        // MiKTeX's YAP (version 2.4.1803) crashes if the file name
        // is longer than about 160 characters. MiKTeX's pdflatex
diff --git a/src/support/FileName.h b/src/support/FileName.h
index ac351c2386..9920168140 100644
--- a/src/support/FileName.h
+++ b/src/support/FileName.h
@@ -290,6 +290,8 @@ public:
         */
        std::string
        mangledFileName(std::string const & dir = empty_string()) const;
+       std::string
+       mangledFileName(std::string const & dir, bool use_counter, bool 
encrypt_path) const;
 
        /// \return the absolute file name without its .gz, .z, .Z extension
        std::string unzippedFileName() const;
-- 
lyx-devel mailing list
lyx-devel@lists.lyx.org
http://lists.lyx.org/mailman/listinfo/lyx-devel

Reply via email to