From f79ecfe00189f54142fcce1157f097e96fa6f709 Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Sat, 8 Feb 2014 00:29:12 +0100 Subject: [PATCH 1/8] more verbose ssl error logging --- src/mirall/account.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/mirall/account.cpp b/src/mirall/account.cpp index 93022e524..f15f8484a 100644 --- a/src/mirall/account.cpp +++ b/src/mirall/account.cpp @@ -301,7 +301,11 @@ void Account::setState(int state) void Account::slotHandleErrors(QNetworkReply *reply , QList errors) { NetworkJobTimeoutPauser pauser(reply); - qDebug() << "SSL-Warnings happened for url " << reply->url().toString(); + qDebug() << "SSL-Errors happened for url " << reply->url().toString(); + foreach(const QSslError &error, errors) { + qDebug() << "\tError in " << error.certificate() << ":" + << error.errorString() << "("<< error.error()<< ")"; + } if( _treatSslErrorsAsFailure ) { // User decided once not to trust. Honor this decision. @@ -317,7 +321,7 @@ void Account::slotHandleErrors(QNetworkReply *reply , QList errors) QSslSocket::addDefaultCaCertificates(approvedCerts); addApprovedCerts(approvedCerts); // all ssl certs are known and accepted. We can ignore the problems right away. - qDebug() << "Certs are already known and trusted, Warnings are not valid."; + qDebug() << "Certs are already known and trusted, Errors are not valid."; reply->ignoreSslErrors(); } else { _treatSslErrorsAsFailure = true; From bcf73cfc405a053ee2196367907a170cc08b88a0 Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Wed, 12 Feb 2014 17:51:11 +0100 Subject: [PATCH 2/8] SSLButton: Omit arrow on Windows which can't display it --- src/mirall/sslbutton.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/mirall/sslbutton.cpp b/src/mirall/sslbutton.cpp index dd055ed08..006260512 100644 --- a/src/mirall/sslbutton.cpp +++ b/src/mirall/sslbutton.cpp @@ -127,8 +127,11 @@ QMenu* SslButton::buildCertMenu(QMenu *parent, const QSslCertificate& cert, QString txt; if (pos > 0) { txt += QString(2*pos, ' '); - txt += QChar(0x21AA); // nicer '->' symbol - txt += QChar(' '); + if (!Utility::isWindows()) { + // doesn't seem to work reliably on Windows + txt += QChar(0x21AA); // nicer '->' symbol + txt += QChar(' '); + } } QString certId = cn.isEmpty() ? ou : cn; From 958253bb2b5a0235a3cc31089106b6997047ffe0 Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Wed, 12 Feb 2014 12:17:32 +0100 Subject: [PATCH 3/8] Respect skipUpdate policy from global config files and windows policy. --- OWNCLOUD.cmake | 2 +- cmake/modules/NSIS.template.in | 34 +++++++++--------- config.h.in | 2 ++ src/mirall/application.cpp | 10 ++++-- src/mirall/mirallconfigfile.cpp | 63 ++++++++++++++++++++++++++++----- src/mirall/mirallconfigfile.h | 2 ++ src/mirall/utility.cpp | 1 - 7 files changed, 84 insertions(+), 30 deletions(-) diff --git a/OWNCLOUD.cmake b/OWNCLOUD.cmake index c4028f2f8..c17834c69 100644 --- a/OWNCLOUD.cmake +++ b/OWNCLOUD.cmake @@ -2,7 +2,7 @@ set( APPLICATION_NAME "ownCloud" ) #set( APPLICATION_SHORTNAME ${APPLICATION_NAME} ) set( APPLICATION_EXECUTABLE "owncloud" ) set( APPLICATION_DOMAIN "owncloud.com" ) -set( APPLICATION_VENDOR "ownCloud, Inc" ) +set( APPLICATION_VENDOR "ownCloud" ) set( APPLICATION_UPDATE_URL "https://updates.owncloud.com/client/" CACHE string "URL for updater" ) set( THEME_CLASS "ownCloudTheme" ) diff --git a/cmake/modules/NSIS.template.in b/cmake/modules/NSIS.template.in index 88b6afcd6..9c5fbedd2 100644 --- a/cmake/modules/NSIS.template.in +++ b/cmake/modules/NSIS.template.in @@ -67,7 +67,7 @@ Name "@CPACK_NSIS_PACKAGE_NAME@" BrandingText "${APPLICATION_NAME} ${VERSION} -- ${BUILD_TIME}" OutFile "@CPACK_TOPLEVEL_DIRECTORY@/@CPACK_OUTPUT_FILE_NAME@" InstallDir "$PROGRAMFILES\@CPACK_PACKAGE_INSTALL_DIRECTORY@" -InstallDirRegKey HKCU "Software\${APPLICATION_NAME}" "" +InstallDirRegKey HKCU "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "" InstType Standard InstType Full InstType Minimal @@ -277,21 +277,21 @@ FunctionEnd ############################################################################## Function PageReinstall - ReadRegStr $R0 HKLM "Software\${APPLICATION_NAME}" "" + ReadRegStr $R0 HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "" StrCmp $R0 "" 0 +2 Abort ;Detect version - ReadRegDWORD $R0 HKLM "Software\${APPLICATION_NAME}" "VersionMajor" + ReadRegDWORD $R0 HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionMajor" IntCmp $R0 ${VER_MAJOR} minor_check new_version older_version minor_check: - ReadRegDWORD $R0 HKLM "Software\${APPLICATION_NAME}" "VersionMinor" + ReadRegDWORD $R0 HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionMinor" IntCmp $R0 ${VER_MINOR} rev_check new_version older_version rev_check: - ReadRegDWORD $R0 HKLM "Software\${APPLICATION_NAME}" "VersionRevision" + ReadRegDWORD $R0 HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionRevision" IntCmp $R0 ${VER_PATCH} build_check new_version older_version build_check: - ReadRegDWORD $R0 HKLM "Software\${APPLICATION_NAME}" "VersionBuild" + ReadRegDWORD $R0 HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionBuild" IntCmp $R0 ${VER_BUILD} same_version new_version older_version new_version: @@ -487,11 +487,11 @@ Section -post SetDetailsPrint listonly ;Version numbers used to detect existing installation version for comparisson. - WriteRegStr HKLM "Software\${APPLICATION_NAME}" "" $INSTDIR - WriteRegDWORD HKLM "Software\${APPLICATION_NAME}" "VersionMajor" "${VER_MAJOR}" - WriteRegDWORD HKLM "Software\${APPLICATION_NAME}" "VersionMinor" "${VER_MINOR}" - WriteRegDWORD HKLM "Software\${APPLICATION_NAME}" "VersionRevision" "${VER_PATCH}" - WriteRegDWORD HKLM "Software\${APPLICATION_NAME}" "VersionBuild" "${VER_BUILD}" + WriteRegStr HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "" $INSTDIR + WriteRegDWORD HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionMajor" "${VER_MAJOR}" + WriteRegDWORD HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionMinor" "${VER_MINOR}" + WriteRegDWORD HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionRevision" "${VER_PATCH}" + WriteRegDWORD HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionBuild" "${VER_BUILD}" ;Add or Remove Programs entry. WriteRegExpandStr ${MEMENTO_REGISTRY_ROOT} "${MEMENTO_REGISTRY_KEY}" "UninstallString" '"$INSTDIR\Uninstall.exe"' @@ -563,12 +563,12 @@ Section Uninstall owncloud_installed: ;Delete registry keys. - DeleteRegValue HKLM "Software\${APPLICATION_NAME}" "VersionBuild" - DeleteRegValue HKLM "Software\${APPLICATION_NAME}" "VersionMajor" - DeleteRegValue HKLM "Software\${APPLICATION_NAME}" "VersionMinor" - DeleteRegValue HKLM "Software\${APPLICATION_NAME}" "VersionRevision" - DeleteRegValue HKLM "Software\${APPLICATION_NAME}" "" - DeleteRegKey HKLM "Software\${APPLICATION_NAME}" + DeleteRegValue HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionBuild" + DeleteRegValue HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionMajor" + DeleteRegValue HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionMinor" + DeleteRegValue HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "VersionRevision" + DeleteRegValue HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "" + DeleteRegKey HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" DeleteRegKey HKCR "${APPLICATION_NAME}" diff --git a/config.h.in b/config.h.in index 1f2bcbe41..d739a212a 100644 --- a/config.h.in +++ b/config.h.in @@ -10,6 +10,8 @@ #cmakedefine THEME_INCLUDE @THEME_INCLUDE@ #cmakedefine APPLICATION_NAME "@APPLICATION_NAME@" +#cmakedefine APPLICATION_VENDOR "@APPLICATION_VENDOR@" +#cmakedefine APPLICATION_REV_DOMAIN "@APPLICATION_REV_DOMAIN@" #cmakedefine APPLICATION_SHORTNAME "@APPLICATION_SHORTNAME@" #cmakedefine APPLICATION_EXECUTABLE "@APPLICATION_EXECUTABLE@" #cmakedefine APPLICATION_UPDATE_URL "@APPLICATION_UPDATE_URL@" diff --git a/src/mirall/application.cpp b/src/mirall/application.cpp index 9ab3f3627..054fcf1a7 100644 --- a/src/mirall/application.cpp +++ b/src/mirall/application.cpp @@ -33,9 +33,10 @@ #include "mirall/clientproxy.h" #include "updater/updater.h" - #include "creds/abstractcredentials.h" +#include "config.h" + #if defined(Q_OS_WIN) #include #endif @@ -88,6 +89,9 @@ Application::Application(int &argc, char **argv) : _logFlush(false), _userTriggeredConnect(false) { +// TODO: Can't set this without breaking current config pathes +// setOrganizationName(QLatin1String(APPLICATION_VENDOR)); + setOrganizationDomain(QLatin1String(APPLICATION_REV_DOMAIN)); setApplicationName( _theme->appNameGUI() ); setWindowIcon( _theme->applicationIcon() ); @@ -139,7 +143,9 @@ Application::Application(int &argc, char **argv) : // startup procedure. QTimer::singleShot( 0, this, SLOT( slotCheckConnection() )); - if( !cfg.skipUpdateCheck() ) { + if( cfg.skipUpdateCheck() ) { + qDebug() << Q_FUNC_INFO << "Skipping update check"; + } else { QTimer::singleShot( 3000, this, SLOT( slotStartUpdateDetector() )); } diff --git a/src/mirall/mirallconfigfile.cpp b/src/mirall/mirallconfigfile.cpp index 00ee58e46..e7a109f56 100644 --- a/src/mirall/mirallconfigfile.cpp +++ b/src/mirall/mirallconfigfile.cpp @@ -142,6 +142,26 @@ void MirallConfigFile::restoreGeometryHeader(QHeaderView *header) header->restoreState(getValue(geometryC, header->objectName()).toByteArray()); } +QVariant MirallConfigFile::getPolicySetting(const QString &setting, const QVariant& defaultValue) const +{ + if (Utility::isWindows()) { + // check for policies first and return immediately if a value is found. + QSettings userPolicy(QString::fromLatin1("HKEY_CURRENT_USER\\Software\\Policies\\%1\\%2") + .arg(APPLICATION_VENDOR).arg(APPLICATION_NAME), + QSettings::NativeFormat); + if(userPolicy.contains(setting)) { + return userPolicy.value(setting); + } + + QSettings machinePolicy(QString::fromLatin1("HKEY_LOCAL_MACHINE\\Software\\Policies\\%1\\%2") + .arg(APPLICATION_VENDOR).arg(APPLICATION_NAME), + QSettings::NativeFormat); + if(machinePolicy.contains(setting)) { + return machinePolicy.value(setting); + } + } + return defaultValue; +} QString MirallConfigFile::configPath() const { @@ -324,12 +344,13 @@ bool MirallConfigFile::skipUpdateCheck( const QString& connection ) const QString con( connection ); if( connection.isEmpty() ) con = defaultConnection(); - QSettings settings(configFile(), QSettings::IniFormat); - settings.beginGroup( con ); + QVariant fallback = getValue(QLatin1String(skipUpdateCheckC), con, false); + fallback = getValue(QLatin1String(skipUpdateCheckC), QString(), fallback); - bool skipIt = settings.value( QLatin1String(skipUpdateCheckC), false ).toBool(); - - return skipIt; + qDebug() << Q_FUNC_INFO << fallback; + QVariant value = getPolicySetting(QLatin1String(skipUpdateCheckC), fallback); + qDebug() << Q_FUNC_INFO << value; + return value.toBool(); } void MirallConfigFile::setSkipUpdateCheck( bool skip, const QString& connection ) @@ -382,11 +403,35 @@ void MirallConfigFile::setProxyType(int proxyType, QVariant MirallConfigFile::getValue(const QString& param, const QString& group, const QVariant& defaultValue) const { - QSettings settings(configFile(), QSettings::IniFormat); - if (!group.isEmpty()) - settings.beginGroup(group); + QVariant systemSetting; + qDebug() << Q_FUNC_INFO; + if (Utility::isMac()) { + QSettings systemSettings(QSettings::NativeFormat, QSettings::SystemScope, QCoreApplication::organizationName()); + if (!group.isEmpty()) { + systemSettings.beginGroup(group); + } + systemSetting = systemSettings.value(param, defaultValue); + } else if (Utility::isUnix()) { + QSettings systemSettings(QString( SYSCONFDIR "/%1/%1.conf").arg(Theme::instance()->appName()), QSettings::NativeFormat); + if (!group.isEmpty()) { + systemSettings.beginGroup(group); + } + systemSetting = systemSettings.value(param, defaultValue); + } else { // Windows + QSettings systemSettings(QString::fromLatin1("HKEY_LOCAL_MACHINE\\Software\\%1\\%2") + .arg(APPLICATION_VENDOR).arg(APPLICATION_NAME), + QSettings::NativeFormat); + if (!group.isEmpty()) { + systemSettings.beginGroup(group); + } + systemSetting = systemSettings.value(param, defaultValue); + qDebug() << Q_FUNC_INFO << "Windows, read" << systemSetting << "from registry!"; + } - return settings.value(param, defaultValue); + QSettings settings(configFile(), QSettings::IniFormat); + if (!group.isEmpty()) settings.beginGroup(group); + + return settings.value(param, systemSetting); } void MirallConfigFile::setValue(const QString& key, const QVariant &value) diff --git a/src/mirall/mirallconfigfile.h b/src/mirall/mirallconfigfile.h index b069f3733..1d7455d7c 100644 --- a/src/mirall/mirallconfigfile.h +++ b/src/mirall/mirallconfigfile.h @@ -108,7 +108,9 @@ public: void saveGeometryHeader(QHeaderView *header); void restoreGeometryHeader(QHeaderView *header); + protected: + QVariant getPolicySetting(const QString& policy, const QVariant& defaultValue = QVariant()) const; void storeData(const QString& group, const QString& key, const QVariant& value); QVariant retrieveData(const QString& group, const QString& key) const; void removeData(const QString& group, const QString& key); diff --git a/src/mirall/utility.cpp b/src/mirall/utility.cpp index fdf005ed0..61942a486 100644 --- a/src/mirall/utility.cpp +++ b/src/mirall/utility.cpp @@ -482,5 +482,4 @@ bool Utility::isLinux() #endif } - } // namespace Mirall From 4db7b5f2a7f8ea7e6fd31b85d1d5da7ffe8ef1be Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Wed, 12 Feb 2014 17:57:50 +0100 Subject: [PATCH 4/8] NSIS: accept /noautoupdate --- cmake/modules/NSIS.template.in | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cmake/modules/NSIS.template.in b/cmake/modules/NSIS.template.in index 9c5fbedd2..d6af9d8f1 100644 --- a/cmake/modules/NSIS.template.in +++ b/cmake/modules/NSIS.template.in @@ -54,6 +54,7 @@ !define VERSION "@CPACK_PACKAGE_VERSION@" Var InstallRunIfSilent +Var NoAutomaticUpdates ;----------------------------------------------------------------------------- ; Installer build timestamp. @@ -628,6 +629,13 @@ Function .onInit StrCpy $InstallRunIfSilent "yes" ${EndIf} + ${GetParameters} $R0 + ${GetOptions} $R0 "/noautoupdate" $R0 + ${IfNot} ${Errors} + StrCpy $NoAutomaticUpdates "yes" + ${EndIf} + + !insertmacro INSTALLOPTIONS_EXTRACT "NSIS.InstallOptions.ini" ; uncomment this line if you want to see the language selection @@ -695,6 +703,10 @@ FunctionEnd Function .onInstSuccess ${MementoSectionSave} + ${If} $NoAutomaticUpdates == "yes" + WriteRegDWORD HKLM "Software\${APPLICATION_VENDOR}\${APPLICATION_NAME}" "skipUpdateCheck" "1" + ${EndIf} + ${If} ${Silent} ${AndIf} $InstallRunIfSilent == "yes" Call LaunchApplication From 05ae467cd5d12999a53542b3b0884b7c9210eba8 Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Wed, 12 Feb 2014 18:05:28 +0100 Subject: [PATCH 5/8] Remove debug --- src/mirall/mirallconfigfile.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/mirall/mirallconfigfile.cpp b/src/mirall/mirallconfigfile.cpp index e7a109f56..27b67a0ab 100644 --- a/src/mirall/mirallconfigfile.cpp +++ b/src/mirall/mirallconfigfile.cpp @@ -347,9 +347,7 @@ bool MirallConfigFile::skipUpdateCheck( const QString& connection ) const QVariant fallback = getValue(QLatin1String(skipUpdateCheckC), con, false); fallback = getValue(QLatin1String(skipUpdateCheckC), QString(), fallback); - qDebug() << Q_FUNC_INFO << fallback; QVariant value = getPolicySetting(QLatin1String(skipUpdateCheckC), fallback); - qDebug() << Q_FUNC_INFO << value; return value.toBool(); } @@ -425,7 +423,6 @@ QVariant MirallConfigFile::getValue(const QString& param, const QString& group, systemSettings.beginGroup(group); } systemSetting = systemSettings.value(param, defaultValue); - qDebug() << Q_FUNC_INFO << "Windows, read" << systemSetting << "from registry!"; } QSettings settings(configFile(), QSettings::IniFormat); From fd40a25030d885181c02a846921764d3214345d0 Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Wed, 12 Feb 2014 18:06:01 +0100 Subject: [PATCH 6/8] Use the appName (which is the short name) instead of the full length name The full length name is allowed to change (or should be) --- src/mirall/mirallconfigfile.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mirall/mirallconfigfile.cpp b/src/mirall/mirallconfigfile.cpp index 27b67a0ab..946019540 100644 --- a/src/mirall/mirallconfigfile.cpp +++ b/src/mirall/mirallconfigfile.cpp @@ -147,7 +147,7 @@ QVariant MirallConfigFile::getPolicySetting(const QString &setting, const QVaria if (Utility::isWindows()) { // check for policies first and return immediately if a value is found. QSettings userPolicy(QString::fromLatin1("HKEY_CURRENT_USER\\Software\\Policies\\%1\\%2") - .arg(APPLICATION_VENDOR).arg(APPLICATION_NAME), + .arg(APPLICATION_VENDOR).arg(Theme::instance()->appName()), QSettings::NativeFormat); if(userPolicy.contains(setting)) { return userPolicy.value(setting); @@ -417,7 +417,7 @@ QVariant MirallConfigFile::getValue(const QString& param, const QString& group, systemSetting = systemSettings.value(param, defaultValue); } else { // Windows QSettings systemSettings(QString::fromLatin1("HKEY_LOCAL_MACHINE\\Software\\%1\\%2") - .arg(APPLICATION_VENDOR).arg(APPLICATION_NAME), + .arg(APPLICATION_VENDOR).arg(Theme::instance()->appName()), QSettings::NativeFormat); if (!group.isEmpty()) { systemSettings.beginGroup(group); From 1875a93a488d11b6585ced1eb0043021636a9b30 Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Wed, 12 Feb 2014 18:17:57 +0100 Subject: [PATCH 7/8] RC2 --- VERSION.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION.cmake b/VERSION.cmake index 0a69555a2..acebbbc82 100644 --- a/VERSION.cmake +++ b/VERSION.cmake @@ -4,7 +4,7 @@ set( MIRALL_VERSION_PATCH 1 ) set( MIRALL_SOVERSION 0 ) if ( NOT DEFINED MIRALL_VERSION_SUFFIX ) - set( MIRALL_VERSION_SUFFIX "rc1" ) #e.g. beta1, beta2, rc1 + set( MIRALL_VERSION_SUFFIX "rc2" ) #e.g. beta1, beta2, rc1 endif( NOT DEFINED MIRALL_VERSION_SUFFIX ) if( NOT DEFINED MIRALL_VERSION_BUILD ) From 1eb6e163de74361ce55b872f81d626091afb68b0 Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Wed, 12 Feb 2014 21:08:28 +0100 Subject: [PATCH 8/8] Add documentation on auto update feature --- doc/autoupdate.rst | 79 ++++++++++++++++++++++++++++++++++++++++++++++ doc/index.rst | 1 + 2 files changed, 80 insertions(+) create mode 100644 doc/autoupdate.rst diff --git a/doc/autoupdate.rst b/doc/autoupdate.rst new file mode 100644 index 000000000..36c8c94dd --- /dev/null +++ b/doc/autoupdate.rst @@ -0,0 +1,79 @@ +The Automatic Updater +===================== + +To ensure you're always using the latest version of ownCloud Client, an +auto-update mechanism has been added in Version 1.5.1. It will ensure +that will automatically profit from the latest features and bugfixes. + +The updater works differently depending on the operating system. + +Basic Workflow +-------------- + +Windows +^^^^^^^ + +ownCloud client will check for updates and download the update if one +is available. You can view the status under ``Settings -> General -> Updates``. +If an update is available and has been successfully downloaded, ownCloud +Client will start a silent update prior to its next launch and then start itself. +If the silent update fails, the client offers a manual download. + +.. note:: The user needs to be able to attain administrative privileges + to successfully perform the update. + +Mac OS X +^^^^^^^^ + +If a new update is available, ownCloud client will ask the user to update +to the latest version using a pop-up dialog. This is the default for Mac +OS X applications which use the Sparkle framework. + +Linux +^^^^^ + +Since distributions provide their own update tool, ownCloud Client on Linux +will not perform any updates on its own. It will, however, check for the +latest version and passively notify the user (``Settings -> General -> Updates``) +if an update is available. + + +Preventing Auto Updates +----------------------- + +In controlled environment such as companies or universities, the auto-update +mechanism might not be desired as it interferes with controlled deployment +tools and policies. In this case, it is possible to disable the auto-updater +entirely: + +Windows +^^^^^^^ + +There are two alternative approaches: + +1. In ``HKEY_LOCAL_MACHINE\Software\ownCloud\ownCloud``, add a key of type DWORD + with the value ``skipUpdateCheck`` and the value 1 to the machine. This key + can be manually overrideen by the same value in ``HKEY_CURRENT_USER``. + +2. In ``HKEY_LOCAL_MACHINE\Software\Policies\ownCloud\ownCloud``, add a key of + type DWORD the value ``skipUpdateCheck`` and the value 1 to the machine. + Setting the value here cannot be overridden by the user and is the preferred + way to control the updater behavior via Group Policies. + +Mac OS X +^^^^^^^^ + +You can disable the update check via the system-wide ``.plist`` file located +at ``/Library/Preferences/com.owncloud.desktopclient.plist``. Add a new root +level item of type bool and the name ``skipUpdateCheck`` and set it to ``true``. + +Linux +^^^^^ + +Since there is no updating functionality, there is no need to remove the check. +If you want to disable the check nontheless, open a file called +``/etc/ownCloud/ownCloud.conf`` and add the following content:: + + [General] + skipUpdateCheck=true + diff --git a/doc/index.rst b/doc/index.rst index 93cb8efdf..d79953ed8 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -10,6 +10,7 @@ Contents accountsetup visualtour advancedusage + autoupdate building architecture