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);