Rename channel

git-svn-id: https://mumble.svn.sourceforge.net/svnroot/mumble/trunk@700 05730e5d-ab1b-0410-a4ac-84af385074fa
This commit is contained in:
Thorvald Natvig 2007-08-06 19:17:29 +00:00
parent b6b99c2b18
commit 93e427c1a8
12 changed files with 152 additions and 39 deletions

View File

@ -154,15 +154,15 @@ static void inline XOR(subblock *dst, const subblock *a, const subblock *b) {
static void inline S2(subblock *block) {
subblock carry = SWAPPED(block[0]) >> SHIFTBITS;
for (int i=0;i<BLOCKSIZE-1;i++)
block[i] = SWAPPED( (SWAPPED(block[i]) << 1) | (SWAPPED(block[i+1]) >> SHIFTBITS));
block[BLOCKSIZE-1] = SWAPPED((SWAPPED(block[BLOCKSIZE-1]) << 1) ^ (carry * 0x87));
block[i] = SWAPPED((SWAPPED(block[i]) << 1) | (SWAPPED(block[i+1]) >> SHIFTBITS));
block[BLOCKSIZE-1] = SWAPPED((SWAPPED(block[BLOCKSIZE-1]) << 1) ^(carry * 0x87));
}
static void inline S3(subblock *block) {
subblock carry = SWAPPED(block[0]) >> SHIFTBITS;
for (int i=0;i<BLOCKSIZE-1;i++)
block[i] ^= SWAPPED( (SWAPPED(block[i]) << 1) | (SWAPPED(block[i+1]) >> SHIFTBITS));
block[BLOCKSIZE-1] ^= SWAPPED((SWAPPED(block[BLOCKSIZE-1]) << 1) ^ (carry * 0x87));
block[i] ^= SWAPPED((SWAPPED(block[i]) << 1) | (SWAPPED(block[i+1]) >> SHIFTBITS));
block[BLOCKSIZE-1] ^= SWAPPED((SWAPPED(block[BLOCKSIZE-1]) << 1) ^(carry * 0x87));
}
static void inline ZERO(keyblock &block) {
@ -179,7 +179,7 @@ void CryptState::ocb_encrypt(const unsigned char *plain, unsigned char *encrypte
// Initialize
AESencrypt(nonce, delta, &encrypt_key);
ZERO(checksum);
while (len > AES_BLOCK_SIZE) {
S2(delta);
XOR(tmp, delta, reinterpret_cast<const subblock *>(plain));

View File

@ -121,6 +121,9 @@ Message *Message::networkToMessage(PacketDataStream &qdsIn) {
case ChannelLink:
mMsg = new MessageChannelLink();
break;
case ChannelRename:
mMsg = new MessageChannelRename();
break;
case TextMessage:
mMsg = new MessageTextMessage();
break;
@ -225,6 +228,9 @@ void MessageHandler::dispatch(Connection *cCon, Message *msg) {
case Message::ChannelLink:
msgChannelLink(cCon, static_cast<MessageChannelLink *>(msg));
break;
case Message::ChannelRename:
msgChannelRename(cCon, static_cast<MessageChannelRename *>(msg));
break;
case Message::TextMessage:
msgTextMessage(cCon, static_cast<MessageTextMessage *>(msg));
break;
@ -468,6 +474,14 @@ void MessageChannelMove::restoreStream(PacketDataStream &qdsIn) {
qdsIn >> iParent;
}
void MessageChannelRename::saveStream(PacketDataStream &qdsOut) const {
qdsOut << iId << qsName;
}
void MessageChannelRename::restoreStream(PacketDataStream &qdsIn) {
qdsIn >> iId >> qsName;
}
void MessageTextMessage::saveStream(PacketDataStream &qdsOut) const {
qdsOut << uiVictim;
qdsOut << qsMessage;

View File

@ -31,7 +31,7 @@
#ifndef _MESSAGE_H
#define _MESSAGE_H
#define MESSAGE_STREAM_VERSION 2
#define MESSAGE_STREAM_VERSION 3
#include "ACL.h"
@ -43,7 +43,7 @@ class Message {
virtual void saveStream(PacketDataStream &) const;
virtual void restoreStream(PacketDataStream &);
public:
enum MessageType { ServerReject, ServerAuthenticate, Speex, ServerSync, ServerJoin, ServerLeave, ServerBanList, PlayerMute, PlayerDeaf, PlayerKick, PlayerRename, PlayerBan, PlayerMove, PlayerSelfMuteDeaf, ChannelAdd, ChannelRemove, ChannelMove, ChannelLink, PermissionDenied, EditACL, QueryUsers, Ping, TextMessage, PlayerTexture, CryptSetup, CryptSync };
enum MessageType { ServerReject, ServerAuthenticate, Speex, ServerSync, ServerJoin, ServerLeave, ServerBanList, PlayerMute, PlayerDeaf, PlayerKick, PlayerRename, PlayerBan, PlayerMove, PlayerSelfMuteDeaf, ChannelAdd, ChannelRemove, ChannelMove, ChannelLink, ChannelRename, PermissionDenied, EditACL, QueryUsers, Ping, TextMessage, PlayerTexture, CryptSetup, CryptSync };
unsigned int uiSession;
Message();
@ -277,6 +277,18 @@ class MessageChannelLink : public Message {
};
};
class MessageChannelRename : public Message {
protected:
void saveStream(PacketDataStream &) const;
void restoreStream(PacketDataStream &);
public:
int iId;
QString qsName;
Message::MessageType messageType() const {
return ChannelRename;
};
};
class MessageServerBanList : public Message {
protected:
void saveStream(PacketDataStream &) const;
@ -421,6 +433,7 @@ class MessageHandler {
virtual void msgChannelRemove(Connection *, MessageChannelRemove *) = 0;
virtual void msgChannelMove(Connection *, MessageChannelMove *) = 0;
virtual void msgChannelLink(Connection *, MessageChannelLink *) = 0;
virtual void msgChannelRename(Connection *, MessageChannelRename *) = 0;
virtual void msgServerBanList(Connection *, MessageServerBanList *) = 0;
virtual void msgTextMessage(Connection *, MessageTextMessage *) = 0;
virtual void msgPermissionDenied(Connection *, MessagePermissionDenied *) = 0;

View File

@ -161,7 +161,7 @@ int AudioInput::getMaxBandwidth() {
if (g.s.bTransmitPosition)
audiorate += 12;
if (g.s.bTCPCompat)
audiorate += 12;

View File

@ -141,6 +141,10 @@ void MainWindow::createActions() {
qaChannelACL->setObjectName(QLatin1String("ChannelACL"));
qaChannelACL->setToolTip(tr("Edit Groups and ACL for channel"));
qaChannelACL->setWhatsThis(tr("This opens the Group and ACL dialog for the channel, to control permissions."));
qaChannelRename=new QAction(tr("&Rename channel"), this);
qaChannelRename->setObjectName(QLatin1String("ChannelRename"));
qaChannelRename->setToolTip(tr("Renames the channel"));
qaChannelRename->setWhatsThis(tr("This renames a channel."));
qaChannelLink=new QAction(tr("&Link"), this);
qaChannelLink->setObjectName(QLatin1String("ChannelLink"));
qaChannelLink->setToolTip(tr("Link your channel to another channel"));
@ -278,6 +282,8 @@ void MainWindow::setupGui() {
qmChannel->addAction(qaChannelAdd);
qmChannel->addAction(qaChannelRemove);
qmChannel->addAction(qaChannelACL);
qmChannel->addAction(qaChannelRename);
qmChannel->addSeparator();
qmChannel->addAction(qaChannelLink);
qmChannel->addAction(qaChannelUnlink);
qmChannel->addAction(qaChannelUnlinkAll);
@ -665,9 +671,9 @@ void MainWindow::on_Quit_triggered() {
void MainWindow::on_ChannelMenu_aboutToShow() {
QModelIndex idx = qtvPlayers->currentIndex();
bool add, remove, acl, link, unlink, unlinkall;
bool add, remove, acl, rename, link, unlink, unlinkall;
add = remove = acl = link = unlink = unlinkall = false;
add = remove = acl = rename = link = unlink = unlinkall = false;
if (g.uiSession != 0) {
add = true;
@ -676,8 +682,10 @@ void MainWindow::on_ChannelMenu_aboutToShow() {
Channel *c = pmModel->getChannel(idx);
Channel *home = ClientPlayer::get(g.uiSession)->cChannel;
if (c && c->iId != 0)
if (c && c->iId != 0) {
rename = true;
remove = true;
}
if (! c)
c = Channel::get(0);
@ -694,6 +702,7 @@ void MainWindow::on_ChannelMenu_aboutToShow() {
qaChannelAdd->setEnabled(add);
qaChannelRemove->setEnabled(remove);
qaChannelACL->setEnabled(acl);
qaChannelRename->setEnabled(rename);
qaChannelLink->setEnabled(link);
qaChannelUnlink->setEnabled(unlink);
qaChannelUnlinkAll->setEnabled(unlinkall);
@ -738,6 +747,28 @@ void MainWindow::on_ChannelRemove_triggered() {
}
}
void MainWindow::on_ChannelRename_triggered() {
bool ok;
Channel *c = pmModel->getChannel(qtvPlayers->currentIndex());
if (! c)
return;
int id = c->iId;
QString name = QInputDialog::getText(this, tr("Mumble"), tr("Channel Name"), QLineEdit::Normal, c->qsName, &ok);
c = Channel::get(id);
if (! c)
return;
if (ok) {
MessageChannelRename mcr;
mcr.iId = id;
mcr.qsName = name;
g.sh->sendMessage(&mcr);
}
}
void MainWindow::on_ChannelACL_triggered() {
Channel *c = pmModel->getChannel(qtvPlayers->currentIndex());
int id = c ? c->iId : 0;

View File

@ -62,7 +62,7 @@ class MainWindow : public QMainWindow, public MessageHandler {
QAction *qaAudioReset, *qaAudioMute, *qaAudioDeaf, *qaAudioTTS, *qaAudioStats, *qaAudioUnlink;
QAction *qaConfigDialog, *qaAudioWizard;
QAction *qaHelpWhatsThis, *qaHelpAbout, *qaHelpAboutSpeex, *qaHelpAboutQt, *qaHelpVersionCheck;
QAction *qaChannelAdd, *qaChannelRemove, *qaChannelACL, *qaChannelLink, *qaChannelUnlink, *qaChannelUnlinkAll;
QAction *qaChannelAdd, *qaChannelRemove, *qaChannelACL, *qaChannelRename, *qaChannelLink, *qaChannelUnlink, *qaChannelUnlinkAll;
QSplitter *qsSplit;
QSystemTrayIcon *qstiIcon;
QTextEdit *qteLog;
@ -107,6 +107,7 @@ class MainWindow : public QMainWindow, public MessageHandler {
void on_ChannelAdd_triggered();
void on_ChannelRemove_triggered();
void on_ChannelACL_triggered();
void on_ChannelRename_triggered();
void on_ChannelLink_triggered();
void on_ChannelUnlink_triggered();
void on_ChannelUnlinkAll_triggered();
@ -157,6 +158,7 @@ class MainWindow : public QMainWindow, public MessageHandler {
virtual void msgChannelRemove(Connection *, MessageChannelRemove *);
virtual void msgChannelMove(Connection *, MessageChannelMove *);
virtual void msgChannelLink(Connection *, MessageChannelLink *);
virtual void msgChannelRename(Connection *, MessageChannelRename *);
virtual void msgServerBanList(Connection *, MessageServerBanList *);
virtual void msgTextMessage(Connection *, MessageTextMessage *);
virtual void msgPermissionDenied(Connection *, MessagePermissionDenied *);

View File

@ -64,18 +64,20 @@ void MainWindow::msgServerJoin(Connection *, MessageServerJoin *msg) {
#define VICTIM_INIT \
ClientPlayer *pDst=ClientPlayer::get(msg->uiVictim); \
if (! pDst) \
qFatal("MainWindow: Message for nonexistant victim %d.", msg->uiVictim);
qWarning("MainWindow: Message for nonexistant victim %d.", msg->uiVictim); \
return;
void MainWindow::msgServerLeave(Connection *, MessageServerLeave *msg) {
MSG_INIT;
if (! pSrc)
return;
g.l->log(Log::PlayerLeave, MainWindow::tr("Left server: %1.").arg(pSrc->qsName));
pmModel->removePlayer(pSrc);
}
void MainWindow::msgServerBanList(Connection *, MessageServerBanList *msg) {
MSG_INIT;
if (banEdit) {
banEdit->reject();
delete banEdit;
@ -92,6 +94,9 @@ void MainWindow::msgSpeex(Connection *, MessageSpeex *) {
void MainWindow::msgPlayerSelfMuteDeaf(Connection *, MessagePlayerSelfMuteDeaf *msg) {
MSG_INIT;
if (! pSrc)
return;
pSrc->setSelfMuteDeaf(msg->bMute, msg->bDeaf);
if (msg->uiSession == g.uiSession || ! g.uiSession)
@ -161,12 +166,13 @@ void MainWindow::msgPlayerKick(Connection *, MessagePlayerKick *msg) {
void MainWindow::msgPlayerBan(Connection *, MessagePlayerBan *msg) {
MSG_INIT;
VICTIM_INIT;
QString admin = pSrc ? pSrc->qsName : QLatin1String("server");
if (msg->uiVictim == g.uiSession) {
g.l->log(Log::YouKicked, MainWindow::tr("You were kicked and banned from the server by %1: %2.").arg(pSrc->qsName).arg(msg->qsReason));
g.l->log(Log::YouKicked, MainWindow::tr("You were kicked and banned from the server by %1: %2.").arg(admin).arg(msg->qsReason));
g.l->setIgnore(Log::ServerDisconnected, 1);
} else {
g.l->setIgnore(Log::PlayerLeave, 1);
g.l->log((msg->uiSession == g.uiSession) ? Log::YouKicked : Log::PlayerKicked, MainWindow::tr("%3 was kicked and banned from the server by %1: %2.").arg(pSrc->qsName).arg(msg->qsReason).arg(pDst->qsName));
g.l->log((msg->uiSession == g.uiSession) ? Log::YouKicked : Log::PlayerKicked, MainWindow::tr("%3 was kicked and banned from the server by %1: %2.").arg(admin).arg(msg->qsReason).arg(pDst->qsName));
}
}
@ -190,7 +196,11 @@ void MainWindow::msgPlayerMove(Connection *, MessagePlayerMove *msg) {
g.l->log(Log::ChannelJoin, MainWindow::tr("%1 moved out by %2.").arg(pname).arg(admin));
}
pmModel->movePlayer(pDst, msg->iChannelId);
Channel *c = Channel::get(msg->iChannelId);
if (!c)
c = Channel::get(0);
pmModel->movePlayer(pDst, c);
if (log && (pDst->cChannel == ClientPlayer::get(g.uiSession)->cChannel)) {
if (pDst == pSrc || (!pSrc))
@ -202,7 +212,8 @@ void MainWindow::msgPlayerMove(Connection *, MessagePlayerMove *msg) {
void MainWindow::msgPlayerRename(Connection *, MessagePlayerRename *msg) {
MSG_INIT;
pmModel->renamePlayer(pSrc, msg->qsName);
if (pSrc)
pmModel->renamePlayer(pSrc, msg->qsName);
}
void MainWindow::msgChannelAdd(Connection *, MessageChannelAdd *msg) {
@ -218,15 +229,28 @@ void MainWindow::msgChannelRemove(Connection *, MessageChannelRemove *msg) {
}
void MainWindow::msgChannelMove(Connection *, MessageChannelMove *msg) {
pmModel->moveChannel(Channel::get(msg->iId), msg->iParent);
Channel *c = Channel::get(msg->iId);
Channel *p = Channel::get(msg->iParent);
if (c && p)
pmModel->moveChannel(c, p);
}
void MainWindow::msgChannelRename(Connection *, MessageChannelRename *msg) {
Channel *c = Channel::get(msg->iId);
if (c && c->cParent)
pmModel->renameChannel(c, msg->qsName);
}
void MainWindow::msgChannelLink(Connection *, MessageChannelLink *msg) {
Channel *c = Channel::get(msg->iId);
if (!c)
return;
QList<Channel *> qlChans;
foreach(int id, msg->qlTargets) {
Channel *l = Channel::get(id);
qlChans << l;
if (l)
qlChans << l;
}
switch (msg->ltType) {
@ -290,6 +314,8 @@ void MainWindow::msgServerSync(Connection *, MessageServerSync *msg) {
void MainWindow::msgTextMessage(Connection *, MessageTextMessage *msg) {
MSG_INIT;
if (! pSrc)
return;
g.l->log(Log::TextMessage, MainWindow::tr("From %1: %2").arg(pSrc->qsName).arg(msg->qsMessage),
MainWindow::tr("Message from %1").arg(pSrc->qsName));
}

View File

@ -521,7 +521,7 @@ void PlayerModel::recheckLinks() {
updateOverlay();
}
ClientPlayer *PlayerModel::addPlayer(unsigned int id, QString name) {
ClientPlayer *PlayerModel::addPlayer(unsigned int id, const QString &name) {
ClientPlayer *p = ClientPlayer::add(id, this);
p->qsName = name;
@ -545,19 +545,25 @@ void PlayerModel::removePlayer(ClientPlayer *p) {
delete item;
}
void PlayerModel::movePlayer(ClientPlayer *p, int id) {
Channel *np = Channel::get(id);
void PlayerModel::movePlayer(ClientPlayer *p, Channel *np) {
hidePlayer(p);
showPlayer(p, np);
}
void PlayerModel::renamePlayer(ClientPlayer *p, QString name) {
void PlayerModel::renamePlayer(ClientPlayer *p, const QString &name) {
Channel *c = p->cChannel;
hidePlayer(p);
p->qsName = name;
showPlayer(p, c);
}
void PlayerModel::renameChannel(Channel *c, const QString &name) {
Channel *pc = c->cParent;
hideChannel(c);
c->qsName = name;
showChannel(c, pc);
}
void PlayerModel::showChannel(Channel *c, Channel *p) {
ModelItem *item = ModelItem::c_qhChannels.value(p);
@ -595,7 +601,7 @@ void PlayerModel::hideChannel(Channel *c) {
item = ModelItem::c_qhChannels.value(c);
}
Channel *PlayerModel::addChannel(int id, Channel *p, QString name) {
Channel *PlayerModel::addChannel(int id, Channel *p, const QString &name) {
Channel *c = Channel::add(id, name, NULL);
new ModelItem(c);
@ -624,10 +630,9 @@ void PlayerModel::removeChannel(Channel *c) {
delete c;
}
void PlayerModel::moveChannel(Channel *c, int id) {
Channel *np = Channel::get(id);
void PlayerModel::moveChannel(Channel *c, Channel *p) {
hideChannel(c);
showChannel(c, np);
showChannel(c, p);
}
void PlayerModel::linkChannels(Channel *c, QList<Channel *> links) {

View File

@ -117,18 +117,19 @@ class PlayerModel : public QAbstractItemModel {
QMimeData *mimeData(const QModelIndexList &idx) const;
bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex & parent);
ClientPlayer *addPlayer(unsigned int id, QString name);
ClientPlayer *addPlayer(unsigned int id, const QString &name);
ClientPlayer *getPlayer(const QModelIndex &idx) const;
Channel *addChannel(int id, Channel *p, QString name);
Channel *addChannel(int id, Channel *p, const QString &name);
Channel *getChannel(const QModelIndex &idx) const;
Channel *getSubChannel(Channel *p, int idx) const;
void renamePlayer(ClientPlayer *p, QString name);
void renamePlayer(ClientPlayer *p, const QString &name);
void renameChannel(Channel *c, const QString &name);
void movePlayer(ClientPlayer *p, int id);
void moveChannel(Channel *p, int id);
void movePlayer(ClientPlayer *p, Channel *c);
void moveChannel(Channel *c, Channel *p);
void removePlayer(ClientPlayer *p);
void removeChannel(Channel *c);

View File

@ -502,6 +502,25 @@ void Server::msgChannelRemove(Connection *cCon, MessageChannelRemove *msg) {
removeChannel(c, uSource);
}
void Server::msgChannelRename(Connection *cCon, MessageChannelRename *msg) {
MSG_SETUP(Player::Authenticated);
Channel *c = qhChannels.value(msg->iId);
if (!c)
return;
if (! hasPermission(uSource, c, ChanACL::Write)) {
PERM_DENIED(uSource, c, ChanACL::Write);
return;
}
log(uSource, "Renamed channel %s to %s", qPrintable(c->qsName), qPrintable(msg->qsName));
c->qsName = msg->qsName;
updateChannel(c);
dbus->channelStateChanged(c);
sendAll(msg);
}
void Server::msgChannelMove(Connection *cCon, MessageChannelMove *msg) {
MSG_SETUP(Player::Authenticated);

View File

@ -236,6 +236,7 @@ class Server : public QThread, public MessageHandler {
virtual void msgChannelRemove(Connection *, MessageChannelRemove *);
virtual void msgChannelMove(Connection *, MessageChannelMove *);
virtual void msgChannelLink(Connection *, MessageChannelLink *);
virtual void msgChannelRename(Connection *, MessageChannelRename *);
virtual void msgServerBanList(Connection *, MessageServerBanList *);
virtual void msgTextMessage(Connection *, MessageTextMessage *);
virtual void msgPermissionDenied(Connection *, MessagePermissionDenied *);

View File

@ -138,9 +138,9 @@ void Client::sendVoice() {
void Client::doUdp(const unsigned char *buffer, int size) {
if (! udp || ! crypt.isValid())
return;
unsigned char crypted[size+4];
crypt.encrypt(reinterpret_cast<const unsigned char *>(buffer), crypted, size);
::sendto(socket, crypted, size+4, 0, reinterpret_cast<struct sockaddr *>(&srv), sizeof(srv));
}
@ -158,9 +158,9 @@ void Client::run() {
forever {
sz = sizeof(addr);
len = ::recvfrom(socket, reinterpret_cast<char *>(buffer), 1000, 0, reinterpret_cast<struct sockaddr *>(&addr), &sz);
if ( len <= 0)
if (len <= 0)
break;
if ( len >= 40)
if (len >= 40)
rcvd++;
}
}
@ -195,7 +195,8 @@ void Client::readyRead() {
} else if (ptype == Message::CryptSync) {
qWarning("Crypt desync!");
QCoreApplication::instance()->quit();
}if (ptype == Message::ServerSync) {
}
if (ptype == Message::ServerSync) {
uiSession = sess;
} else if (ptype == Message::Speex) {
rcvd++;