From 02ddd914817676c528d676c7debee67c0d43957b Mon Sep 17 00:00:00 2001 From: Tim Cooper Date: Sun, 13 Apr 2014 11:44:38 -0300 Subject: [PATCH] Allow user renames via UserList without requiring a reconnect. This commit also adds a check to Murmur's UserState handler that discards UserState messages that come from users. Only Murmur can send UserStates with a name. The client-facing way of renaming is through the UserList. When a user is renamed, Murmur will broadcast a UserState with the given session and name to perform a live rename operation. --- src/mumble/Log.cpp | 4 ++-- src/mumble/Log.h | 2 +- src/mumble/Messages.cpp | 8 +++++++- src/murmur/Messages.cpp | 18 ++++++++++++++++++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/mumble/Log.cpp b/src/mumble/Log.cpp index b05fc4414..48236e089 100644 --- a/src/mumble/Log.cpp +++ b/src/mumble/Log.cpp @@ -266,7 +266,7 @@ QString Log::formatChannel(::Channel *c) { return QString::fromLatin1("%2").arg(c->iId).arg(Qt::escape(c->qsName)).arg(QString::fromLatin1(g.sh->qbaDigest.toBase64())); } -QString Log::formatClientUser(ClientUser *cu, LogColorType t) { +QString Log::formatClientUser(ClientUser *cu, LogColorType t, const QString &displayName) { QString className; if (t == Log::Target) { className = QString::fromLatin1("target"); @@ -275,7 +275,7 @@ QString Log::formatClientUser(ClientUser *cu, LogColorType t) { } if (cu) { - QString name = Qt::escape(cu->qsName); + QString name = Qt::escape(displayName.isNull() ? cu->qsName : displayName); if (cu->qsHash.isEmpty()) { return QString::fromLatin1("%3").arg(className).arg(cu->uiSession).arg(name).arg(QString::fromLatin1(g.sh->qbaDigest.toBase64())); } else { diff --git a/src/mumble/Log.h b/src/mumble/Log.h index 0741c6b72..f634f3e45 100644 --- a/src/mumble/Log.h +++ b/src/mumble/Log.h @@ -94,7 +94,7 @@ class Log : public QObject { static QString imageToImg(const QByteArray &format, const QByteArray &image); static QString imageToImg(QImage img); static QString msgColor(const QString &text, LogColorType t); - static QString formatClientUser(ClientUser *cu, LogColorType t); + static QString formatClientUser(ClientUser *cu, LogColorType t, const QString &displayName=QString()); static QString formatChannel(::Channel *c); public slots: void log(MsgType t, const QString &console, const QString &terse=QString(), bool ownMessage = false); diff --git a/src/mumble/Messages.cpp b/src/mumble/Messages.cpp index f9e203d97..b8badae1d 100644 --- a/src/mumble/Messages.cpp +++ b/src/mumble/Messages.cpp @@ -479,7 +479,13 @@ void MainWindow::msgUserState(const MumbleProto::UserState &msg) { } } if (msg.has_name()) { - pmModel->renameUser(pDst, u8(msg.name())); + QString oldName = pDst->qsName; + QString newName = u8(msg.name()); + pmModel->renameUser(pDst, newName); + if (! oldName.isNull() && oldName != newName) { + g.l->log(Log::Information, tr("%1 renamed to %2").arg(Log::formatClientUser(pDst, Log::Target, oldName), + Log::formatClientUser(pDst, Log::Target))); + } } if (msg.has_texture_hash()) { pDst->qbaTextureHash = blob(msg.texture_hash()); diff --git a/src/murmur/Messages.cpp b/src/murmur/Messages.cpp index 2fa8e1c92..9ce39962c 100644 --- a/src/murmur/Messages.cpp +++ b/src/murmur/Messages.cpp @@ -492,6 +492,11 @@ void Server::msgUserState(ServerUser *uSource, MumbleProto::UserState &msg) { msg.set_session(pDstServerUser->uiSession); msg.set_actor(uSource->uiSession); + if (msg.has_name()) { + PERM_DENIED_TYPE(UserName); + return; + } + if (msg.has_channel_id()) { Channel *c = qhChannels.value(msg.channel_id()); if (!c || (c == pDstServerUser->cChannel)) @@ -1477,6 +1482,19 @@ void Server::msgUserList(ServerUser *uSource, MumbleProto::UserList &msg) { QMap info; info.insert(ServerDB::User_Name, name); setInfo(id, info); + + MumbleProto::UserState mpus; + foreach(ServerUser *u, qhUsers) { + if (u->iId == id) { + u->qsName = name; + mpus.set_session(u->uiSession); + break; + } + } + if (mpus.has_session()) { + mpus.set_name(u8(name)); + sendAll(mpus); + } } else { MumbleProto::PermissionDenied mppd; mppd.set_type(MumbleProto::PermissionDenied_DenyType_UserName);