diff options
author | Le Liu <liulex@users.noreply.github.com> | 2016-11-27 01:40:47 +0800 |
---|---|---|
committer | Itay Grudev <itay-grudev@users.noreply.github.com> | 2016-11-26 17:40:47 +0000 |
commit | 0f821d44f3cee46b866f29830ce0987c8b36ed5e (patch) | |
tree | ef6c80ff8a62f019e08747b19eaae64f9dc8dd96 | |
parent | Fixed typo in README.md (diff) | |
download | singleapplication-0f821d44f3cee46b866f29830ce0987c8b36ed5e.tar.xz |
Allow data exclusion for the server name hash and Windows fixes (#16)
* Allows the application path and version to be excluded from the server name
hash. The following flags were added for this purpose:
* `SingleApplication::Mode::ExcludeAppVersion`
* `SingleApplication::Mode::ExcludeAppPath`
* Allow a non elevated process to connect to a local server created by an
elevated process run by the same user on Windows
* Fixes a problem with upper case letters in paths on Windows
-rw-r--r-- | singleapplication.cpp | 23 | ||||
-rw-r--r-- | singleapplication.h | 4 |
2 files changed, 24 insertions, 3 deletions
diff --git a/singleapplication.cpp b/singleapplication.cpp index 8fd8e7e..58eee7c 100644 --- a/singleapplication.cpp +++ b/singleapplication.cpp @@ -59,11 +59,21 @@ void SingleApplicationPrivate::genBlockServerName( int timeout ) QCryptographicHash appData( QCryptographicHash::Sha256 ); appData.addData( "SingleApplication", 17 ); appData.addData( SingleApplication::app_t::applicationName().toUtf8() ); - appData.addData( SingleApplication::app_t::applicationVersion().toUtf8() ); - appData.addData( SingleApplication::app_t::applicationFilePath().toUtf8() ); appData.addData( SingleApplication::app_t::organizationName().toUtf8() ); appData.addData( SingleApplication::app_t::organizationDomain().toUtf8() ); + if( ! (options & SingleApplication::Mode::ExcludeAppVersion) ) { + appData.addData( SingleApplication::app_t::applicationVersion().toUtf8() ); + } + + if( ! (options & SingleApplication::Mode::ExcludeAppPath) ) { +#ifdef Q_OS_WIN + appData.addData( SingleApplication::app_t::applicationFilePath().toLower().toUtf8() ); +#else + appData.addData( SingleApplication::app_t::applicationFilePath().toUtf8() ); +#endif + } + // User level block requires a user specific data in the hash if( options & SingleApplication::Mode::User ) { #ifdef Q_OS_WIN @@ -108,6 +118,15 @@ void SingleApplicationPrivate::startPrimary( bool resetMemory ) // So we start a QLocalServer to listen for connections QLocalServer::removeServer( blockServerName ); server = new QLocalServer(); + + // Restrict access to the socket according to the + // SingleApplication::Mode::User flag on User level or no restrictions + if( options & SingleApplication::Mode::User ) { + server->setSocketOptions( QLocalServer::UserAccessOption ); + } else { + server->setSocketOptions( QLocalServer::WorldAccessOption ); + } + server->listen( blockServerName ); QObject::connect( server, diff --git a/singleapplication.h b/singleapplication.h index 9376dfe..93447f4 100644 --- a/singleapplication.h +++ b/singleapplication.h @@ -59,7 +59,9 @@ public: enum Mode { User = 1 << 0, System = 1 << 1, - SecondaryNotification = 1 << 2 + SecondaryNotification = 1 << 2, + ExcludeAppVersion = 1 << 3, + ExcludeAppPath = 1 << 4 }; Q_DECLARE_FLAGS(Options, Mode) |