diff --git a/src/libtomahawk/CMakeLists.txt b/src/libtomahawk/CMakeLists.txt index 5e845fa2a..aafb63b74 100644 --- a/src/libtomahawk/CMakeLists.txt +++ b/src/libtomahawk/CMakeLists.txt @@ -162,7 +162,7 @@ set( libSources sourcelist.cpp pipeline.cpp - aclsystem.cpp + aclregistry.cpp artist.cpp artistplaylistinterface.cpp album.cpp diff --git a/src/libtomahawk/aclregistry.cpp b/src/libtomahawk/aclregistry.cpp new file mode 100644 index 000000000..20cf12674 --- /dev/null +++ b/src/libtomahawk/aclregistry.cpp @@ -0,0 +1,189 @@ +/* === This file is part of Tomahawk Player - === + * + * Copyright 2010-2011, Christian Muehlhaeuser + * + * Tomahawk is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Tomahawk is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Tomahawk. If not, see . + */ + +#include "aclregistry.h" + +#include +#include + +#include "tomahawksettings.h" + +#include "utils/logger.h" + + +ACLRegistry* ACLRegistry::s_instance = 0; + +ACLRegistry* +ACLRegistry::instance() +{ + if( !s_instance ) + new ACLRegistry(); + return s_instance; +} + + +ACLRegistry::ACLRegistry( QObject* parent ) + : QObject( parent ) +{ + s_instance = this; + //qRegisterMetaType< QHash< QString, QHash< QString, ACL > > >("ACLRegistry::ACLCacheHash"); + + m_cache = TomahawkSettings::instance()->aclEntries(); +} + + +ACLRegistry::~ACLRegistry() +{ +} + + +ACLRegistry::ACL +ACLRegistry::isAuthorizedPeer( const QString& dbid, ACLRegistry::ACL globalType ) +{ +// qDebug() << Q_FUNC_INFO; + QMutexLocker locker( &m_cacheMutex ); + qDebug() << "Current cache keys =" << m_cache.keys(); +// qDebug() << "Looking up dbid"; + if( m_cache.contains( dbid ) ) + { + QVariantHash peerHash = m_cache[ dbid ].toHash(); + if( peerHash.contains( "global" ) ) + return ACLRegistry::ACL( peerHash[ "global" ].toInt() ); + + if ( globalType == ACLRegistry::NotFound ) + return globalType; + + peerHash[ "global" ] = int( globalType ); + m_cache[ dbid ] = peerHash; + save(); + return globalType; + } + + //not found + if ( globalType == ACLRegistry::NotFound ) + return globalType; + + QVariantHash peerHash; + peerHash[ "global" ] = int( globalType ); + m_cache[ dbid ] = peerHash; + save(); + return globalType; +} + + +void +ACLRegistry::registerPeer( const QString& dbid, ACLRegistry::ACL globalType, const QString &username ) +{ +// qDebug() << Q_FUNC_INFO; + if( globalType == ACLRegistry::NotFound ) + return; + + QMutexLocker locker( &m_cacheMutex ); + + QVariantHash peerHash; + if( m_cache.contains( dbid ) ) + peerHash = m_cache[ dbid ].toHash(); + peerHash[ "global" ] = int( globalType ); + if ( !username.isEmpty() ) + { + if ( peerHash.contains( "usernames" ) ) + { + if ( !peerHash[ "usernames" ].toStringList().contains( username ) ) + peerHash[ "usernames" ] = peerHash[ "usernames" ].toStringList() + QStringList( username ); + } + else + peerHash[ "usernames" ] = QStringList( username ); + } + m_cache[ dbid ] = peerHash; + save(); +} + + +QPair< QString, ACLRegistry::ACL > +ACLRegistry::isAuthorizedUser( const QString &username, ACLRegistry::ACL globalType ) +{ +// qDebug() << Q_FUNC_INFO; + QMutexLocker locker( &m_cacheMutex ); + qDebug() << "Current cache keys =" << m_cache.keys(); + foreach ( QString dbid, m_cache.keys() ) + { + // qDebug() << "Looking up dbid"; + QVariantHash peerHash = m_cache[ dbid ].toHash(); + if ( !peerHash.contains( "usernames" ) ) + continue; + + if ( !peerHash[ "usernames" ].toStringList().contains( username ) ) + continue; + + if ( globalType != ACLRegistry::NotFound ) + { + peerHash[ "global" ] = int( globalType ); + m_cache[ dbid ] = peerHash; + save(); + return QPair< QString, ACLRegistry::ACL >( dbid, globalType ); + } + + return QPair< QString, ACLRegistry::ACL >( dbid, ACLRegistry::ACL( peerHash[ "global" ].toInt() ) ); + } + + return QPair< QString, ACLRegistry::ACL >( QString(), ACLRegistry::NotFound ); +} + + +// ACLRegistry::ACL +// ACLRegistry::isAuthorizedPath( const QString& dbid, const QString& path ) +// { +// QMutexLocker locker( &m_cacheMutex ); +// +// if( !m_cache.contains( dbid ) ) +// return ACLRegistry::NotFound; +// +// QHash< QString, ACL > peerHash = m_cache[dbid]; +// if( !peerHash.contains( path ) ) +// { +// if( peerHash.contains( "global" ) ) +// return peerHash["global"]; +// else +// return ACLRegistry::Deny; +// } +// return peerHash[path]; +// } +// +// void +// ACLRegistry::authorizePath( const QString& dbid, const QString& path, ACLRegistry::ACL type ) +// { +// TomahawkSettings *s = TomahawkSettings::instance(); +// if( !s->scannerPaths().contains( path ) ) +// { +// qDebug() << "path selected is not in our scanner path!"; +// return; +// } +// QMutexLocker locker( &m_cacheMutex ); +// QHash< QString, ACLRegistry::ACL > peerHash; +// if ( m_cache.contains( dbid ) ) +// peerHash = m_cache[dbid]; +// peerHash[path] = type; +// m_cache[dbid] = peerHash; +// } + + +void +ACLRegistry::save() +{ + TomahawkSettings::instance()->setAclEntries( m_cache ); +} \ No newline at end of file diff --git a/src/libtomahawk/aclregistry.h b/src/libtomahawk/aclregistry.h new file mode 100644 index 000000000..f0d4b98d1 --- /dev/null +++ b/src/libtomahawk/aclregistry.h @@ -0,0 +1,102 @@ +/* === This file is part of Tomahawk Player - === + * + * Copyright 2010-2011, Christian Muehlhaeuser + * + * Tomahawk is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Tomahawk is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Tomahawk. If not, see . + */ + +#ifndef TOMAHAWK_ACLREGISTRY_H +#define TOMAHAWK_ACLREGISTRY_H + +#include +#include +#include +#include +#include +#include + +#include "dllmacro.h" + +class DLLEXPORT ACLRegistry : public QObject +{ + Q_OBJECT + +public: + + static ACLRegistry* instance(); + + enum ACL { + Allow = 0, + Deny = 1, + NotFound = 2 + }; + + ACLRegistry( QObject *parent = 0 ); + ~ACLRegistry(); + + /** + * @brief Checks if peer is authorized; optionally, can authorize peer with given type if not found + * + * @param dbid DBID of peer + * @param globalType Global ACL to store if peer not found; if ACLRegistry::NotFound, does not store the peer Defaults to ACLRegistry::NotFound. + * @return ACLRegistry::ACL + **/ + ACLRegistry::ACL isAuthorizedPeer( const QString &dbid, ACLRegistry::ACL globalType = ACLRegistry::NotFound ); + + /** + * @brief Registers the global ACL value for this peer + * + * @param dbid DBID of peer + * @param globalType Global ACL to use for this peer. ACLRegistry::NotFound is invalid and will return immediately. + * @param username If not empty, will store the given username along with the new ACL value. Defaults to QString(). + * @return void + **/ + void registerPeer( const QString &dbid, ACLRegistry::ACL globalType, const QString &username = QString() ); + + /** + * @brief Checks if peer is authorized, using the username. Optionally, can change authorization of the peer, but only if the peer is found. + * + * @param username Username for the peer + * @param globalType Global ACL to store if peer is found; if ACLRegistry::NotFound, does not change the ACL. Defaults to ACLRegistry::NotFound. + * @return QPair< QString, ACLRegistry::ACL > + **/ + QPair< QString, ACLRegistry::ACL > isAuthorizedUser( const QString &username, ACLRegistry::ACL globalType = ACLRegistry::NotFound ); + + /** + * @brief Registers an alias for a known peer. If you do not know the DBID, you can retrieve it via isAuthorizedUser first. + * + * @param dbid DBID of peer + * @param username Username of the peer to be added to the entry + * @return void + **/ + void registerAlias( const QString &dbid, QString username ); + +// ACLRegistry::ACL isAuthorizedPath( const QString &dbid, const QString &path ); +// void authorizePath( const QString &dbid, const QString &path, ACLRegistry::ACL type ); + +private: + /** + * @brief Saves the cache. + * + * @return void + **/ + void save(); + + QVariantHash m_cache; + QMutex m_cacheMutex; + + static ACLRegistry* s_instance; +}; + +#endif // TOMAHAWK_ACLREGISTRY_H diff --git a/src/libtomahawk/aclsystem.cpp b/src/libtomahawk/aclsystem.cpp deleted file mode 100644 index ca0c8b434..000000000 --- a/src/libtomahawk/aclsystem.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/* === This file is part of Tomahawk Player - === - * - * Copyright 2010-2011, Christian Muehlhaeuser - * - * Tomahawk is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Tomahawk is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Tomahawk. If not, see . - */ - -#include "aclsystem.h" - -#include -#include - -#include "tomahawksettings.h" - -#include "utils/logger.h" - - -ACLSystem* ACLSystem::s_instance = 0; - -ACLSystem* -ACLSystem::instance() -{ - if( !s_instance ) - new ACLSystem(); - return s_instance; -} - - -ACLSystem::ACLSystem( QObject* parent ) - : QObject( parent ), - m_saveTimer( this ) -{ - s_instance = this; - //qRegisterMetaType< QHash< QString, QHash< QString, ACL > > >("ACLSystem::ACLCacheHash"); - - QStringList savedEntries = TomahawkSettings::instance()->aclEntries(); - if( !savedEntries.empty() && savedEntries.size() % 3 == 0 ) - { - int index = 0; - while( index < savedEntries.length() ) - { - if( !m_cache.contains( savedEntries.at( index ) ) ) - m_cache[savedEntries.at( index ) ] = QHash< QString, ACL >(); - m_cache[savedEntries.at( index )][savedEntries.at( index + 1 )] = (ACL)(savedEntries.at( index + 2 ).toInt() ); - index += 3; - } - } - - m_saveTimer.setSingleShot( false ); - m_saveTimer.setInterval( 60000 ); - connect( &m_saveTimer, SIGNAL( timeout() ), this, SLOT( saveTimerFired() ) ); - m_saveTimer.start(); -} - -ACLSystem::~ACLSystem() -{ - m_saveTimer.stop(); - saveTimerFired(); -} - -ACLSystem::ACL -ACLSystem::isAuthorizedUser( const QString& dbid ) -{ -// qDebug() << Q_FUNC_INFO; - QMutexLocker locker( &m_cacheMutex ); - qDebug() << "Current cache keys =" << m_cache.keys(); -// qDebug() << "Looking up dbid"; - if( !m_cache.contains( dbid ) ) - return ACLSystem::NotFound; - else - { - QHash< QString, ACL > peerHash = m_cache[dbid]; - if( peerHash.contains( "global" ) ) - return peerHash["global"]; - return ACLSystem::NotFound; - } -} - -void -ACLSystem::authorizeUser( const QString& dbid, ACLSystem::ACL globalType ) -{ -// qDebug() << Q_FUNC_INFO; - if( globalType == ACLSystem::NotFound ) - return; - - QMutexLocker locker( &m_cacheMutex ); - - QHash< QString, ACL > peerHash; - if( m_cache.contains( dbid ) ) - peerHash = m_cache[dbid]; - peerHash["global"] = globalType; - m_cache[dbid] = peerHash; -} - -ACLSystem::ACL -ACLSystem::isAuthorizedPath( const QString& dbid, const QString& path ) -{ - QMutexLocker locker( &m_cacheMutex ); - - if( !m_cache.contains( dbid ) ) - return ACLSystem::NotFound; - - QHash< QString, ACL > peerHash = m_cache[dbid]; - if( !peerHash.contains( path ) ) - { - if( peerHash.contains( "global" ) ) - return peerHash["global"]; - else - return ACLSystem::Deny; - } - return peerHash[path]; -} - -void -ACLSystem::authorizePath( const QString& dbid, const QString& path, ACLSystem::ACL type ) -{ - TomahawkSettings *s = TomahawkSettings::instance(); - if( !s->scannerPaths().contains( path ) ) - { - qDebug() << "path selected is not in our scanner path!"; - return; - } - QMutexLocker locker( &m_cacheMutex ); - QHash< QString, ACLSystem::ACL > peerHash; - if ( m_cache.contains( dbid ) ) - peerHash = m_cache[dbid]; - peerHash[path] = type; - m_cache[dbid] = peerHash; -} - -void -ACLSystem::saveTimerFired() -{ - QStringList saveCache; - foreach( QString dbid, m_cache.keys() ) - { - foreach( QString path, m_cache[dbid].keys() ) - saveCache << dbid << path << QString::number( (int)(m_cache[dbid][path]) ); - } - TomahawkSettings::instance()->setAclEntries( saveCache ); -} \ No newline at end of file diff --git a/src/libtomahawk/aclsystem.h b/src/libtomahawk/aclsystem.h deleted file mode 100644 index 8792cfd3a..000000000 --- a/src/libtomahawk/aclsystem.h +++ /dev/null @@ -1,64 +0,0 @@ -/* === This file is part of Tomahawk Player - === - * - * Copyright 2010-2011, Christian Muehlhaeuser - * - * Tomahawk is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Tomahawk is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Tomahawk. If not, see . - */ - -#ifndef TOMAHAWK_ACLSYSTEM_H -#define TOMAHAWK_ACLSYSTEM_H - -#include -#include -#include -#include -#include - -#include "dllmacro.h" - -class DLLEXPORT ACLSystem : public QObject -{ - Q_OBJECT - -public: - - static ACLSystem* instance(); - - enum ACL { - Allow = 0, - Deny = 1, - NotFound = 2 - }; - - ACLSystem( QObject *parent = 0 ); - ~ACLSystem(); - - ACL isAuthorizedUser( const QString &dbid ); - void authorizeUser( const QString &dbid, ACL globalType ); - - ACL isAuthorizedPath( const QString &dbid, const QString &path ); - void authorizePath( const QString &dbid, const QString &path, ACL type ); - -private slots: - void saveTimerFired(); - -private: - QHash< QString, QHash< QString, ACL > > m_cache; - QTimer m_saveTimer; - QMutex m_cacheMutex; - - static ACLSystem* s_instance; -}; - -#endif // TOMAHAWK_ACLSYSTEM_H diff --git a/src/libtomahawk/network/servent.cpp b/src/libtomahawk/network/servent.cpp index adfe6ec21..afd2dc2e2 100644 --- a/src/libtomahawk/network/servent.cpp +++ b/src/libtomahawk/network/servent.cpp @@ -38,7 +38,7 @@ #include "portfwdthread.h" #include "tomahawksettings.h" -#include +#include "libtomahawk/aclregistry.h" #include "utils/tomahawkutils.h" #include "utils/logger.h" @@ -64,7 +64,7 @@ Servent::Servent( QObject* parent ) s_instance = this; m_lanHack = qApp->arguments().contains( "--lanhack" ); - new ACLSystem( this ); + ACLRegistry::instance(); setProxy( QNetworkProxy::NoProxy ); { @@ -89,6 +89,7 @@ Servent::Servent( QObject* parent ) Servent::~Servent() { + delete ACLRegistry::instance(); delete m_portfwd; } @@ -696,9 +697,11 @@ bool Servent::checkACL( const Connection* conn, const QString &nodeid, bool showDialog ) const { Q_UNUSED( conn ); + Q_UNUSED( nodeid ); Q_UNUSED( showDialog ); - tDebug( LOGVERBOSE ) << "Checking ACLs"; + /* + tDebug( LOGVERBOSE ) << "Checking ACLs"; ACLSystem* aclSystem = ACLSystem::instance(); ACLSystem::ACL peerStatus = aclSystem->isAuthorizedUser( nodeid ); if( peerStatus == ACLSystem::Deny ) @@ -706,7 +709,7 @@ Servent::checkACL( const Connection* conn, const QString &nodeid, bool showDialo //FIXME: Actually enable it when it makes sense //FIXME: needs refactoring because it depends on QtGui and the servent is part of libtomahawk-core - /* + return true; if( peerStatus == ACLSystem::NotFound ) { diff --git a/src/libtomahawk/tomahawksettings.cpp b/src/libtomahawk/tomahawksettings.cpp index ae8bb9857..139352fc8 100644 --- a/src/libtomahawk/tomahawksettings.cpp +++ b/src/libtomahawk/tomahawksettings.cpp @@ -291,7 +291,7 @@ TomahawkSettings::doUpgrade( int oldVersion, int newVersion ) beginGroup( "accounts/" + accountKey ); setValue( "enabled", enabledSip.contains( sipPlugin ) == true ); setValue( "autoconnect", true ); - setValue( "acl", QVariantMap() ); + setValue( "acl", QVariantHash() ); setValue( "types", QStringList() << "SipType" ); endGroup(); accounts << accountKey; @@ -627,15 +627,19 @@ TomahawkSettings::setProxyDns( bool lookupViaProxy ) } -QStringList +QVariantHash TomahawkSettings::aclEntries() const { - return value( "acl/entries", QStringList() ).toStringList(); + QVariant retVal = value( "acl/entries", QVariantHash() ); + if ( retVal.isValid() && retVal.canConvert< QVariantHash >() ) + return retVal.toHash(); + + return QVariantHash(); } void -TomahawkSettings::setAclEntries( const QStringList &entries ) +TomahawkSettings::setAclEntries( const QVariantHash &entries ) { setValue( "acl/entries", entries ); } diff --git a/src/libtomahawk/tomahawksettings.h b/src/libtomahawk/tomahawksettings.h index 578f8a3cc..421782502 100644 --- a/src/libtomahawk/tomahawksettings.h +++ b/src/libtomahawk/tomahawksettings.h @@ -162,8 +162,8 @@ public: void setProxyDns( bool lookupViaProxy ); /// ACL settings - QStringList aclEntries() const; - void setAclEntries( const QStringList &entries ); + QVariantHash aclEntries() const; + void setAclEntries( const QVariantHash &entries ); /// XMPP Component Settings QString xmppBotServer() const; diff --git a/src/libtomahawk/utils/tomahawkutils.cpp b/src/libtomahawk/utils/tomahawkutils.cpp index 237b64c5c..945138e82 100644 --- a/src/libtomahawk/utils/tomahawkutils.cpp +++ b/src/libtomahawk/utils/tomahawkutils.cpp @@ -314,7 +314,7 @@ NetworkProxyFactory::NetworkProxyFactory( const NetworkProxyFactory& other ) QList< QNetworkProxy > NetworkProxyFactory::queryProxy( const QNetworkProxyQuery& query ) { - tDebug() << Q_FUNC_INFO << "query hostname is " << query.peerHostName(); + //tDebug() << Q_FUNC_INFO << "query hostname is " << query.peerHostName(); QList< QNetworkProxy > proxies; QString hostname = query.peerHostName(); s_noProxyHostsMutex.lock();