[Libreoffice-commits] core.git: 7 commits - desktop/source onlineupdate/qa onlineupdate/source

Markus Mohrhard markus.mohrhard at googlemail.com
Fri Jun 16 15:34:24 UTC 2017


 desktop/source/app/updater.cxx                  |   17 +
 onlineupdate/qa/lang_packs/Makefile             |   21 ++
 onlineupdate/qa/lang_packs/update_en_signed.mar |binary
 onlineupdate/qa/lang_packs/update_signed.mar    |binary
 onlineupdate/qa/lang_packs/updater_lang.zip     |binary
 onlineupdate/qa/replace_request/README          |    2 
 onlineupdate/source/update/updater/updater.cxx  |  209 ++++++++++++++----------
 7 files changed, 161 insertions(+), 88 deletions(-)

New commits:
commit f680b3c0944894a18875ae8046026d48e850b37c
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Fri Jun 16 17:30:34 2017 +0200

    updater: add manual test for new language updates
    
    Change-Id: I6d77039f0cafe0f436cc687bb424588a59c3d464

diff --git a/onlineupdate/qa/lang_packs/Makefile b/onlineupdate/qa/lang_packs/Makefile
new file mode 100644
index 000000000000..d328472f53bf
--- /dev/null
+++ b/onlineupdate/qa/lang_packs/Makefile
@@ -0,0 +1,21 @@
+gb_Side := host
+include ../../../config_host.mk
+
+UPDATER_DIR := $(WORKDIR)/updater/lang_pack
+
+all : call
+
+unpack:
+	@echo "Unpacking the updater test project"
+	@rm -r $(UPDATER_DIR) || true
+	@mkdir -p $(WORKDIR)/updater/
+	@unzip updater_lang.zip -d $(WORKDIR)/updater > /dev/null
+	@cp update_signed.mar $(UPDATER_DIR)/user/patch/update.mar
+	@cp update_en_signed.mar $(UPDATER_DIR)/user/patch/update_en_signed.mar
+
+call: unpack
+	@echo "Update the test project"
+	@$(INSTDIR)/program/updater $(UPDATER_DIR)/user/patch $(UPDATER_DIR) $(UPDATER_DIR)/user/update -1
+
+call-gdb: unpack
+	gdb --args $(INSTDIR)/program/updater $(UPDATER_DIR)/user/patch $(UPDATER_DIR) $(UPDATER_DIR)/user/update -1
diff --git a/onlineupdate/qa/lang_packs/update_en_signed.mar b/onlineupdate/qa/lang_packs/update_en_signed.mar
new file mode 100644
index 000000000000..89ce8731f433
Binary files /dev/null and b/onlineupdate/qa/lang_packs/update_en_signed.mar differ
diff --git a/onlineupdate/qa/lang_packs/update_signed.mar b/onlineupdate/qa/lang_packs/update_signed.mar
new file mode 100644
index 000000000000..70ddd1ef0cbd
Binary files /dev/null and b/onlineupdate/qa/lang_packs/update_signed.mar differ
diff --git a/onlineupdate/qa/lang_packs/updater_lang.zip b/onlineupdate/qa/lang_packs/updater_lang.zip
new file mode 100644
index 000000000000..05b206bc8905
Binary files /dev/null and b/onlineupdate/qa/lang_packs/updater_lang.zip differ
commit 38a91e27f28cc14499f78f0c8bde105b06323916
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Fri Jun 16 17:29:36 2017 +0200

    updater: fix update file lookup for language pack files
    
    Change-Id: I221c81ff2f0bee7a8643304201722dbbbc114bec

diff --git a/onlineupdate/source/update/updater/updater.cxx b/onlineupdate/source/update/updater/updater.cxx
index 26f0b5df943d..8b3f7bceee8d 100644
--- a/onlineupdate/source/update/updater/updater.cxx
+++ b/onlineupdate/source/update/updater/updater.cxx
@@ -2553,7 +2553,7 @@ ReadMARChannelIDs(const NS_tchar *path, MARChannelStringTable *results)
 #endif
 
 static int
-GetUpdateFileNames(std::vector<tstring> fileNames)
+GetUpdateFileNames(std::vector<tstring>& fileNames)
 {
     NS_tchar fileName[MAXPATHLEN];
     NS_tsnprintf(fileName, MAXPATHLEN,
@@ -2572,7 +2572,8 @@ GetUpdateFileNames(std::vector<tstring> fileNames)
     while ((entry = NS_treaddir(dir)) != nullptr)
     {
         if (NS_tstrcmp(entry->d_name, NS_T(".")) &&
-                NS_tstrcmp(entry->d_name, NS_T("..")))
+                NS_tstrcmp(entry->d_name, NS_T("..")) &&
+                NS_tstrcmp(entry->d_name, NS_T("update.mar")))
         {
             if (NS_tstrncmp(entry->d_name, NS_T("update"), 6) == 0)
             {
commit a87e03035f8a6d000785f719e2d327e2f6e6d124
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Fri Jun 16 13:57:52 2017 +0200

    updater: rename test directory to reflect the tested code
    
    Change-Id: I672bbb2ac30c5e27b729fe34e206642e436c076b

diff --git a/onlineupdate/qa/updater/Makefile b/onlineupdate/qa/replace_request/Makefile
similarity index 100%
rename from onlineupdate/qa/updater/Makefile
rename to onlineupdate/qa/replace_request/Makefile
diff --git a/onlineupdate/qa/updater/README b/onlineupdate/qa/replace_request/README
similarity index 100%
rename from onlineupdate/qa/updater/README
rename to onlineupdate/qa/replace_request/README
diff --git a/onlineupdate/qa/updater/updater.zip b/onlineupdate/qa/replace_request/updater.zip
similarity index 100%
rename from onlineupdate/qa/updater/updater.zip
rename to onlineupdate/qa/replace_request/updater.zip
commit a5adc48d5f9066088af076ff2066a3b773405208
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Fri Jun 16 13:55:59 2017 +0200

    updater: add short explanation about the test
    
    Change-Id: Ic0cfa565048793181ece17b33337e011028a2aad

diff --git a/onlineupdate/qa/updater/README b/onlineupdate/qa/updater/README
index dab8d8a753db..f50c692fd692 100644
--- a/onlineupdate/qa/updater/README
+++ b/onlineupdate/qa/updater/README
@@ -1 +1,3 @@
+Tests the replacement request done by the automatic updater
+
 After calling 'make call' the content in workdir/updater/program/datei.txt should say "new".
commit 5244a49b92fa5acfa7445292775edf61bde6b232
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Fri Jun 16 13:53:57 2017 +0200

    updater: find all the language update files
    
    Change-Id: I5261d8d96f83b8b81b0dc2576cbd9241705ae9b7

diff --git a/onlineupdate/source/update/updater/updater.cxx b/onlineupdate/source/update/updater/updater.cxx
index b3de68a80f6f..26f0b5df943d 100644
--- a/onlineupdate/source/update/updater/updater.cxx
+++ b/onlineupdate/source/update/updater/updater.cxx
@@ -2556,13 +2556,39 @@ static int
 GetUpdateFileNames(std::vector<tstring> fileNames)
 {
     NS_tchar fileName[MAXPATHLEN];
-    // TODO: moggi: needs adaption for LibreOffice
-    // We would like to store the name inside of an ini file
     NS_tsnprintf(fileName, MAXPATHLEN,
                  NS_T("%s/update.mar"), gPatchDirPath);
     fileNames.push_back(fileName);
 
     // add the language packs
+    NS_tDIR* dir = NS_topendir(gPatchDirPath);
+    if (!dir)
+    {
+        LOG(("Could not open directory " LOG_S, gPatchDirPath));
+        return READ_ERROR;
+    }
+
+    NS_tdirent* entry;
+    while ((entry = NS_treaddir(dir)) != nullptr)
+    {
+        if (NS_tstrcmp(entry->d_name, NS_T(".")) &&
+                NS_tstrcmp(entry->d_name, NS_T("..")))
+        {
+            if (NS_tstrncmp(entry->d_name, NS_T("update"), 6) == 0)
+            {
+                char *dot = strrchr(entry->d_name, '.');
+                if (dot && !strcmp(dot, ".mar"))
+                {
+                    NS_tchar updatePath[MAXPATHLEN];
+                    NS_tsnprintf(updatePath, sizeof(updatePath)/sizeof(updatePath[0]),
+                            NS_T("%s/%s"), gPatchDirPath, entry->d_name);
+
+                    LOG (("Found language update file: " LOG_S, updatePath));
+                    fileNames.push_back(updatePath);
+                }
+            }
+        }
+    }
     return OK;
 }
 
commit ebeb76f00e094abe4ca023e29471a3711a022451
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Fri Jun 16 13:21:48 2017 +0200

    updater: work on supporting language pack updates
    
    Change-Id: I563aa8ee285d4c2ecdb45835b5cee38074295106

diff --git a/onlineupdate/source/update/updater/updater.cxx b/onlineupdate/source/update/updater/updater.cxx
index 629e19e33c0c..b3de68a80f6f 100644
--- a/onlineupdate/source/update/updater/updater.cxx
+++ b/onlineupdate/source/update/updater/updater.cxx
@@ -2553,133 +2553,143 @@ ReadMARChannelIDs(const NS_tchar *path, MARChannelStringTable *results)
 #endif
 
 static int
-GetUpdateFileName(NS_tchar *fileName, int maxChars)
+GetUpdateFileNames(std::vector<tstring> fileNames)
 {
+    NS_tchar fileName[MAXPATHLEN];
     // TODO: moggi: needs adaption for LibreOffice
     // We would like to store the name inside of an ini file
-    NS_tsnprintf(fileName, maxChars,
+    NS_tsnprintf(fileName, MAXPATHLEN,
                  NS_T("%s/update.mar"), gPatchDirPath);
+    fileNames.push_back(fileName);
+
+    // add the language packs
     return OK;
 }
 
-static void
-UpdateThreadFunc(void * /*param*/)
+static int
+CheckSignature(tstring& fileName)
 {
-    // open ZIP archive and process...
-    int rv;
-    if (sReplaceRequest)
-    {
-        rv = ProcessReplaceRequest();
-    }
-    else
-    {
-        NS_tchar dataFile[MAXPATHLEN];
-        rv = GetUpdateFileName(dataFile, sizeof(dataFile)/sizeof(dataFile[0]));
-        if (rv == OK)
-        {
-            rv = gArchiveReader.Open(dataFile);
-        }
+    int rv = gArchiveReader.Open(fileName.c_str());
 
 #ifdef VERIFY_MAR_SIGNATURE
-        if (rv == OK)
-        {
+    if (rv == OK)
+    {
 #ifdef _WIN32
-            HKEY baseKey = nullptr;
-            wchar_t valueName[] = L"Image Path";
-            wchar_t rasenh[] = L"rsaenh.dll";
-            bool reset = false;
-            if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
-                              L"SOFTWARE\\Microsoft\\Cryptography\\Defaults\\Provider\\Microsoft Enhanced Cryptographic Provider v1.0",
-                              0, KEY_READ | KEY_WRITE,
-                              &baseKey) == ERROR_SUCCESS)
+        HKEY baseKey = nullptr;
+        wchar_t valueName[] = L"Image Path";
+        wchar_t rasenh[] = L"rsaenh.dll";
+        bool reset = false;
+        if (RegOpenKeyExW(HKEY_LOCAL_MACHINE,
+                          L"SOFTWARE\\Microsoft\\Cryptography\\Defaults\\Provider\\Microsoft Enhanced Cryptographic Provider v1.0",
+                          0, KEY_READ | KEY_WRITE,
+                          &baseKey) == ERROR_SUCCESS)
+        {
+            wchar_t path[MAX_PATH + 1];
+            DWORD size = sizeof(path);
+            DWORD type;
+            if (RegQueryValueExW(baseKey, valueName, 0, &type,
+                                 (LPBYTE)path, &size) == ERROR_SUCCESS)
             {
-                wchar_t path[MAX_PATH + 1];
-                DWORD size = sizeof(path);
-                DWORD type;
-                if (RegQueryValueExW(baseKey, valueName, 0, &type,
-                                     (LPBYTE)path, &size) == ERROR_SUCCESS)
+                if (type == REG_SZ && wcscmp(path, rasenh) == 0)
                 {
-                    if (type == REG_SZ && wcscmp(path, rasenh) == 0)
+                    wchar_t rasenhFullPath[] = L"%SystemRoot%\\System32\\rsaenh.dll";
+                    if (RegSetValueExW(baseKey, valueName, 0, REG_SZ,
+                                       (const BYTE*)rasenhFullPath,
+                                       sizeof(rasenhFullPath)) == ERROR_SUCCESS)
                     {
-                        wchar_t rasenhFullPath[] = L"%SystemRoot%\\System32\\rsaenh.dll";
-                        if (RegSetValueExW(baseKey, valueName, 0, REG_SZ,
-                                           (const BYTE*)rasenhFullPath,
-                                           sizeof(rasenhFullPath)) == ERROR_SUCCESS)
-                        {
-                            reset = true;
-                        }
+                        reset = true;
                     }
                 }
             }
+        }
 #endif
-            rv = gArchiveReader.VerifySignature();
+        rv = gArchiveReader.VerifySignature();
 #ifdef _WIN32
-            if (baseKey)
+        if (baseKey)
+        {
+            if (reset)
             {
-                if (reset)
-                {
-                    RegSetValueExW(baseKey, valueName, 0, REG_SZ,
-                                   (const BYTE*)rasenh,
-                                   sizeof(rasenh));
-                }
-                RegCloseKey(baseKey);
+                RegSetValueExW(baseKey, valueName, 0, REG_SZ,
+                               (const BYTE*)rasenh,
+                               sizeof(rasenh));
             }
-#endif
+            RegCloseKey(baseKey);
         }
+#endif
+    }
 
+    if (rv == OK)
+    {
         if (rv == OK)
         {
-            if (rv == OK)
-            {
-                NS_tchar updateSettingsPath[MAX_TEXT_LEN];
+            NS_tchar updateSettingsPath[MAX_TEXT_LEN];
 
-                // TODO: moggi: needs adaption for LibreOffice
-                // These paths need to be adapted for us.
-                NS_tsnprintf(updateSettingsPath,
-                             sizeof(updateSettingsPath) / sizeof(updateSettingsPath[0]),
+            // TODO: moggi: needs adaption for LibreOffice
+            // These paths need to be adapted for us.
+            NS_tsnprintf(updateSettingsPath,
+                         sizeof(updateSettingsPath) / sizeof(updateSettingsPath[0]),
 #ifdef MACOSX
-                             NS_T("%s/Contents/Resources/update-settings.ini"),
+                         NS_T("%s/Contents/Resources/update-settings.ini"),
 #else
-                             NS_T("%s/update-settings.ini"),
+                         NS_T("%s/update-settings.ini"),
 #endif
-                             gWorkingDirPath);
-                MARChannelStringTable MARStrings;
-                if (ReadMARChannelIDs(updateSettingsPath, &MARStrings) != OK)
-                {
-                    // If we can't read from update-settings.ini then we shouldn't impose
-                    // a MAR restriction.  Some installations won't even include this file.
-                    MARStrings.MARChannelID[0] = '\0';
-                }
-
-                rv = gArchiveReader.VerifyProductInformation(MARStrings.MARChannelID,
-                        LIBO_VERSION_DOTTED);
+                         gWorkingDirPath);
+            MARChannelStringTable MARStrings;
+            if (ReadMARChannelIDs(updateSettingsPath, &MARStrings) != OK)
+            {
+                // If we can't read from update-settings.ini then we shouldn't impose
+                // a MAR restriction.  Some installations won't even include this file.
+                MARStrings.MARChannelID[0] = '\0';
             }
+
+            rv = gArchiveReader.VerifyProductInformation(MARStrings.MARChannelID,
+                    LIBO_VERSION_DOTTED);
         }
+    }
 #endif
 
-        if (rv == OK && sStagedUpdate)
+    gArchiveReader.Close();
+
+    return rv;
+}
+
+static void
+UpdateThreadFunc(void * /*param*/)
+{
+    // open ZIP archive and process...
+    int rv;
+    if (sReplaceRequest)
+    {
+        rv = ProcessReplaceRequest();
+    }
+    else
+    {
+        std::vector<tstring> fileNames;
+        GetUpdateFileNames(fileNames);
+
+        for (auto& fileName: fileNames)
         {
-#ifdef TEST_UPDATER
-            // The MOZ_TEST_SKIP_UPDATE_STAGE environment variable prevents copying
-            // the files in dist/bin in the test updater when staging an update since
-            // this can cause tests to timeout.
-            if (EnvHasValue("MOZ_TEST_SKIP_UPDATE_STAGE"))
+            rv = CheckSignature(fileName);
+            if (rv != OK)
             {
-                rv = OK;
-            }
-            else
-            {
-                rv = CopyInstallDirToDestDir();
+                LOG(("Could not verify the signature of " LOG_S, fileName.c_str()));
+                break;
             }
-#else
+        }
+
+        if (rv == OK && sStagedUpdate)
+        {
             rv = CopyInstallDirToDestDir();
-#endif
         }
 
         if (rv == OK)
         {
-            rv = DoUpdate();
-            gArchiveReader.Close();
+            for (auto& fileName: fileNames)
+            {
+                gArchiveReader.Open(fileName.c_str());
+                rv = DoUpdate();
+                gArchiveReader.Close();
+            }
             NS_tchar updatingDir[MAXPATHLEN];
             NS_tsnprintf(updatingDir, sizeof(updatingDir)/sizeof(updatingDir[0]),
                          NS_T("%s/updating"), gWorkingDirPath);
commit fc26bbc05e8a3afdffb660d5ea8562afd53918ff
Author: Markus Mohrhard <markus.mohrhard at googlemail.com>
Date:   Wed Jun 14 18:04:09 2017 +0200

    updater: only download language packs for installed languages
    
    Change-Id: I8c605e2c64fee4d369732f783cc9dd76f7dc858c

diff --git a/desktop/source/app/updater.cxx b/desktop/source/app/updater.cxx
index fbb48d137811..949ec186d1fe 100644
--- a/desktop/source/app/updater.cxx
+++ b/desktop/source/app/updater.cxx
@@ -33,6 +33,12 @@
 #include <orcus/pstring.hpp>
 #include <comphelper/hash.hxx>
 
+#include <com/sun/star/container/XNameAccess.hpp>
+
+#include <officecfg/Setup.hxx>
+
+#include <set>
+
 namespace {
 
 class error_updater : public std::exception
@@ -626,6 +632,7 @@ void update_checker()
         std::string response_body = download_content(aURL, false, aHash);
         if (!response_body.empty())
         {
+
             update_info aUpdateInfo = parse_response(response_body);
             if (aUpdateInfo.aUpdateFile.aURL.isEmpty())
             {
@@ -636,11 +643,17 @@ void update_checker()
             }
             else
             {
+                css::uno::Sequence<OUString> aInstalledLanguages(officecfg::Setup::Office::InstalledLocales::get()->getElementNames());
+                std::set<OUString> aInstalledLanguageSet(std::begin(aInstalledLanguages), std::end(aInstalledLanguages));
                 download_file(aUpdateInfo.aUpdateFile.aURL, aUpdateInfo.aUpdateFile.nSize, aUpdateInfo.aUpdateFile.aHash, "update.mar");
                 for (auto& lang_update : aUpdateInfo.aLanguageFiles)
                 {
-                    OUString aFileName = "update_" + lang_update.aLangCode + ".mar";
-                    download_file(lang_update.aUpdateFile.aURL, lang_update.aUpdateFile.nSize, lang_update.aUpdateFile.aHash, aFileName);
+                    // only download the language packs for installed languages
+                    if (aInstalledLanguageSet.find(lang_update.aLangCode) != aInstalledLanguageSet.end())
+                    {
+                        OUString aFileName = "update_" + lang_update.aLangCode + ".mar";
+                        download_file(lang_update.aUpdateFile.aURL, lang_update.aUpdateFile.nSize, lang_update.aUpdateFile.aHash, aFileName);
+                    }
                 }
                 CreateValidUpdateDir(aUpdateInfo);
             }


More information about the Libreoffice-commits mailing list