diff options
author | Thorvald Natvig <slicer@users.sourceforge.net> | 2009-05-17 19:50:46 +0400 |
---|---|---|
committer | Thorvald Natvig <slicer@users.sourceforge.net> | 2009-05-17 19:50:46 +0400 |
commit | 73131d21cf1aca1df63a06655f549e7821404c1b (patch) | |
tree | 964911328399495f6c18c9dc7177d51a93e58813 | |
parent | 8a12ebc45586219bbf81add79422c37877991688 (diff) |
Server-side unregister
-rw-r--r-- | src/Message.h | 3 | ||||
-rw-r--r-- | src/Mumble.proto | 8 | ||||
-rw-r--r-- | src/murmur/Messages.cpp | 41 | ||||
-rw-r--r-- | src/murmur/Server.h | 2 | ||||
-rw-r--r-- | src/murmur/ServerDB.cpp | 1 |
5 files changed, 53 insertions, 2 deletions
diff --git a/src/Message.h b/src/Message.h index 623a6b394..d45e9b890 100644 --- a/src/Message.h +++ b/src/Message.h @@ -52,7 +52,8 @@ MUMBLE_MH_MSG(QueryUsers) \ MUMBLE_MH_MSG(CryptSetup) \ MUMBLE_MH_MSG(ContextActionAdd) \ - MUMBLE_MH_MSG(ContextAction) + MUMBLE_MH_MSG(ContextAction) \ + MUMBLE_MH_MSG(UserList) class MessageHandler { public: diff --git a/src/Mumble.proto b/src/Mumble.proto index 99b75ca20..9a0b099ec 100644 --- a/src/Mumble.proto +++ b/src/Mumble.proto @@ -182,3 +182,11 @@ message ContextAction { optional uint32 channel_id = 2; required string action = 3; } + +message UserList { + message User { + required uint32 user_id = 1; + optional string name = 2; + } + repeated User users = 1; +} diff --git a/src/murmur/Messages.cpp b/src/murmur/Messages.cpp index a287e274d..d25bc703c 100644 --- a/src/murmur/Messages.cpp +++ b/src/murmur/Messages.cpp @@ -1035,3 +1035,44 @@ void Server::msgVersion(ServerUser *uSource, MumbleProto::Version &msg) { uSource->qsOSVersion = u8(msg.os_version()); } } + +void Server::msgUserList(ServerUser *uSource, MumbleProto::UserList &msg) { + MSG_SETUP(User::Authenticated); + + if (! hasPermission(uSource, qhChannels.value(0), ChanACL::Register)) { + PERM_DENIED(uSource, qhChannels.value(0), ChanACL::Register); + return; + } + + if (msg.users_size() == 0) { + // Query mode. + QMap<int, QString> users = getRegisteredUsers(); + QMap<int, QString>::const_iterator i; + for(i = users.constBegin(); i != users.constEnd(); ++i) { + ::MumbleProto::UserList_User *u = msg.add_users(); + u->set_user_id(i.key()); + u->set_name(u8(i.value())); + } + sendMessage(uSource, msg); + } else { + for (int i=0;i < msg.users_size(); ++i) { + const MumbleProto::UserList_User &u = msg.users(i); + + int id = u.user_id(); + if (id == 0) + continue; + + if (! u.has_name()) { + log(uSource, QString::fromLatin1("Unregistered user %1").arg(id)); + unregisterUser(id); + } else { + const QString &name = u8(u.name()); + log(uSource, QString::fromLatin1("Renamed user %1 to '%2'").arg(id).arg(name)); + + QMap<QString, QString> info; + info.insert("name", name); + setInfo(id, info); + } + } + } +} diff --git a/src/murmur/Server.h b/src/murmur/Server.h index 2d8b9ea5b..71a3c5299 100644 --- a/src/murmur/Server.h +++ b/src/murmur/Server.h @@ -296,7 +296,7 @@ class Server : public QThread { QMap<QString, QString> getRegistration(int id); int registerUser(const QMap<QString, QString> &info); bool unregisterUser(int id); - QMap<int, QString > getRegisteredUsers(const QString &filter); + QMap<int, QString > getRegisteredUsers(const QString &filter = QString()); bool setInfo(int id, const QMap<QString, QString> &info); bool setTexture(int id, const QByteArray &texture); bool isUserId(int id); diff --git a/src/murmur/ServerDB.cpp b/src/murmur/ServerDB.cpp index 4868d4519..9616075a4 100644 --- a/src/murmur/ServerDB.cpp +++ b/src/murmur/ServerDB.cpp @@ -562,6 +562,7 @@ int Server::registerUser(const QMap<QString, QString> &info) { } bool Server::unregisterUser(int id) { + // FIXME: Update ACLs and groups to remove id. if (id <= 0) return false; |