Merge branch 'master' of github.com:highfidelity/hifi into tablet-ui-edit-js

This commit is contained in:
Seth Alves 2017-02-17 09:58:33 -08:00
commit 0d10667bb4
5 changed files with 72 additions and 81 deletions

View file

@ -61,7 +61,7 @@ void AudioMixerClientData::processPackets() {
_packetQueue.node.clear(); _packetQueue.node.clear();
while (!_packetQueue.empty()) { while (!_packetQueue.empty()) {
auto& packet = _packetQueue.back(); auto& packet = _packetQueue.front();
switch (packet->getType()) { switch (packet->getType()) {
case PacketType::MicrophoneAudioNoEcho: case PacketType::MicrophoneAudioNoEcho:

View file

@ -410,7 +410,7 @@ void AvatarMixer::broadcastAvatarData() {
bool isInView = nodeData->otherAvatarInView(otherNodeBox); bool isInView = nodeData->otherAvatarInView(otherNodeBox);
// this throttles the extra data to only be sent every Nth message // this throttles the extra data to only be sent every Nth message
if (!isInView && getsOutOfView && (lastSeqToReceiver % EXTRA_AVATAR_DATA_FRAME_RATIO > 0)) { if (!isInView && !getsOutOfView && (lastSeqToReceiver % EXTRA_AVATAR_DATA_FRAME_RATIO > 0)) {
return; return;
} }
@ -572,6 +572,7 @@ void AvatarMixer::handleRequestsDomainListDataPacket(QSharedPointer<ReceivedMess
bool isRequesting; bool isRequesting;
message->readPrimitive(&isRequesting); message->readPrimitive(&isRequesting);
nodeData->setRequestsDomainListData(isRequesting); nodeData->setRequestsDomainListData(isRequesting);
qDebug() << "node" << nodeData->getNodeID() << "requestsDomainListData" << isRequesting;
} }
} }
} }

View file

@ -30,6 +30,7 @@
#include <NumericalConstants.h> #include <NumericalConstants.h>
#include <SettingHandle.h> #include <SettingHandle.h>
#include <AvatarData.h> //for KillAvatarReason #include <AvatarData.h> //for KillAvatarReason
#include <FingerprintUtils.h>
#include "DomainServerNodeData.h" #include "DomainServerNodeData.h"
const QString SETTINGS_DESCRIPTION_RELATIVE_PATH = "/resources/describe-settings.json"; const QString SETTINGS_DESCRIPTION_RELATIVE_PATH = "/resources/describe-settings.json";
@ -668,9 +669,31 @@ void DomainServerSettingsManager::processNodeKickRequestPacket(QSharedPointer<Re
// ensure that the connect permission is clear // ensure that the connect permission is clear
userPermissions->clear(NodePermissions::Permission::canConnectToDomain); userPermissions->clear(NodePermissions::Permission::canConnectToDomain);
} else { } else {
// otherwise we apply the kick to the IP from active socket for this node and the MAC address // remove connect permissions for the machine fingerprint
DomainServerNodeData* nodeData = static_cast<DomainServerNodeData*>(matchingNode->getLinkedData());
if (nodeData) {
// get this machine's fingerprint
auto domainServerFingerprint = FingerprintUtils::getMachineFingerprint();
// remove connect permissions for the IP (falling back to the public socket if not yet active) if (nodeData->getMachineFingerprint() == domainServerFingerprint) {
qWarning() << "attempt to kick node running on same machine as domain server (by fingerprint), ignoring KickRequest";
return;
}
NodePermissionsKey machineFingerprintKey(nodeData->getMachineFingerprint().toString(), 0);
// check if there were already permissions for the fingerprint
bool hadFingerprintPermissions = hasPermissionsForMachineFingerprint(nodeData->getMachineFingerprint());
// grab or create permissions for the given fingerprint
auto fingerprintPermissions = _machineFingerprintPermissions[machineFingerprintKey];
// write them
if (!hadFingerprintPermissions || fingerprintPermissions->can(NodePermissions::Permission::canConnectToDomain)) {
newPermissions = true;
fingerprintPermissions->clear(NodePermissions::Permission::canConnectToDomain);
}
} else {
// if no node data, all we can do is IP address
auto& kickAddress = matchingNode->getActiveSocket() auto& kickAddress = matchingNode->getActiveSocket()
? matchingNode->getActiveSocket()->getAddress() ? matchingNode->getActiveSocket()->getAddress()
: matchingNode->getPublicSocket().getAddress(); : matchingNode->getPublicSocket().getAddress();
@ -685,6 +708,8 @@ void DomainServerSettingsManager::processNodeKickRequestPacket(QSharedPointer<Re
qWarning() << "attempt to kick node running on same machine as domain server, ignoring KickRequest"; qWarning() << "attempt to kick node running on same machine as domain server, ignoring KickRequest";
return; return;
} }
NodePermissionsKey ipAddressKey(kickAddress.toString(), QUuid()); NodePermissionsKey ipAddressKey(kickAddress.toString(), QUuid());
// check if there were already permissions for the IP // check if there were already permissions for the IP
@ -698,37 +723,10 @@ void DomainServerSettingsManager::processNodeKickRequestPacket(QSharedPointer<Re
ipPermissions->clear(NodePermissions::Permission::canConnectToDomain); ipPermissions->clear(NodePermissions::Permission::canConnectToDomain);
} }
// potentially remove connect permissions for the MAC address and machine fingerprint
DomainServerNodeData* nodeData = static_cast<DomainServerNodeData*>(matchingNode->getLinkedData());
if (nodeData) {
// mac address first
NodePermissionsKey macAddressKey(nodeData->getHardwareAddress(), 0);
bool hadMACPermissions = hasPermissionsForMAC(nodeData->getHardwareAddress());
auto macPermissions = _macPermissions[macAddressKey];
if (!hadMACPermissions || macPermissions->can(NodePermissions::Permission::canConnectToDomain)) {
newPermissions = true;
macPermissions->clear(NodePermissions::Permission::canConnectToDomain);
}
// now for machine fingerprint
NodePermissionsKey machineFingerprintKey(nodeData->getMachineFingerprint().toString(), 0);
bool hadFingerprintPermissions = hasPermissionsForMachineFingerprint(nodeData->getMachineFingerprint());
auto fingerprintPermissions = _machineFingerprintPermissions[machineFingerprintKey];
if (!hadFingerprintPermissions || fingerprintPermissions->can(NodePermissions::Permission::canConnectToDomain)) {
newPermissions = true;
fingerprintPermissions->clear(NodePermissions::Permission::canConnectToDomain);
} }
} }
}
// if we are here, then we kicked them, so send the KillAvatar message to everyone // if we are here, then we kicked them, so send the KillAvatar message
auto packet = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID + sizeof(KillAvatarReason), true); auto packet = NLPacket::create(PacketType::KillAvatar, NUM_BYTES_RFC4122_UUID + sizeof(KillAvatarReason), true);
packet->write(nodeUUID.toRfc4122()); packet->write(nodeUUID.toRfc4122());
packet->writePrimitive(KillAvatarReason::NoReason); packet->writePrimitive(KillAvatarReason::NoReason);

View file

@ -360,7 +360,7 @@ Rectangle {
TextMetrics { TextMetrics {
id: displayNameHeaderMetrics id: displayNameHeaderMetrics
text: displayNameHeader.title text: displayNameHeader.title
font: displayNameHeader.font // font: displayNameHeader.font // was this always undefined? giving error now...
} }
// This Rectangle refers to the [?] popup button next to "NAMES" // This Rectangle refers to the [?] popup button next to "NAMES"
Rectangle { Rectangle {
@ -426,7 +426,6 @@ Rectangle {
onExited: adminHelpText.color = hifi.colors.redHighlight onExited: adminHelpText.color = hifi.colors.redHighlight
} }
} }
}
HifiControls.Keyboard { HifiControls.Keyboard {
id: keyboard id: keyboard
@ -438,6 +437,7 @@ Rectangle {
right: parent.right right: parent.right
} }
} }
}
// Timer used when selecting table rows that aren't yet present in the model // Timer used when selecting table rows that aren't yet present in the model
// (i.e. when selecting avatars using edit.js or sphere overlays) // (i.e. when selecting avatars using edit.js or sphere overlays)

View file

@ -290,17 +290,14 @@ function populateUserList(selectData) {
userName: '', userName: '',
sessionId: id || '', sessionId: id || '',
audioLevel: 0.0, audioLevel: 0.0,
admin: false admin: false,
personalMute: !!id && Users.getPersonalMuteStatus(id), // expects proper boolean, not null
ignore: !!id && Users.getIgnoreStatus(id) // ditto
}; };
// Request the username, fingerprint, and admin status from the given UUID
// Username and fingerprint returns default constructor output if the requesting user isn't an admin
Users.requestUsernameFromID(id);
// Request personal mute status and ignore status
// from NodeList (as long as we're not requesting it for our own ID)
if (id) { if (id) {
avatarPalDatum['personalMute'] = Users.getPersonalMuteStatus(id);
avatarPalDatum['ignore'] = Users.getIgnoreStatus(id);
addAvatarNode(id); // No overlay for ourselves addAvatarNode(id); // No overlay for ourselves
// Everyone needs to see admin status. Username and fingerprint returns default constructor output if the requesting user isn't an admin.
Users.requestUsernameFromID(id);
} }
data.push(avatarPalDatum); data.push(avatarPalDatum);
print('PAL data:', JSON.stringify(avatarPalDatum)); print('PAL data:', JSON.stringify(avatarPalDatum));
@ -314,20 +311,13 @@ function populateUserList(selectData) {
// The function that handles the reply from the server // The function that handles the reply from the server
function usernameFromIDReply(id, username, machineFingerprint, isAdmin) { function usernameFromIDReply(id, username, machineFingerprint, isAdmin) {
var data; var data = [
// If the ID we've received is our ID... (MyAvatar.sessionUUID === id) ? '' : id, // Pal.qml recognizes empty id specially.
if (MyAvatar.sessionUUID === id) { // If we get username (e.g., if in future we receive it when we're friends), use it.
// Set the data to contain specific strings. // Otherwise, use valid machineFingerprint (which is not valid when not an admin).
data = ['', username, isAdmin]; username || (Users.canKick && machineFingerprint) || '',
} else if (Users.canKick) { isAdmin
// Set the data to contain the ID and the username (if we have one) ];
// or fingerprint (if we don't have a username) string.
data = [id, username || machineFingerprint, isAdmin];
} else {
// Set the data to contain specific strings.
data = [id, '', isAdmin];
}
print('Username Data:', JSON.stringify(data));
// Ship the data off to QML // Ship the data off to QML
sendToQml({ method: 'updateUsername', params: data }); sendToQml({ method: 'updateUsername', params: data });
} }
@ -339,13 +329,15 @@ function updateOverlays() {
if (!id) { if (!id) {
return; // don't update ourself return; // don't update ourself
} }
var avatar = AvatarList.getAvatar(id);
if (!avatar) {
return; // will be deleted below if there had been an overlay.
}
var overlay = ExtendedOverlay.get(id); var overlay = ExtendedOverlay.get(id);
if (!overlay) { // For now, we're treating this as a temporary loss, as from the personal space bubble. Add it back. if (!overlay) { // For now, we're treating this as a temporary loss, as from the personal space bubble. Add it back.
print('Adding non-PAL avatar node', id); print('Adding non-PAL avatar node', id);
overlay = addAvatarNode(id); overlay = addAvatarNode(id);
} }
var avatar = AvatarList.getAvatar(id);
var target = avatar.position; var target = avatar.position;
var distance = Vec3.distance(target, eye); var distance = Vec3.distance(target, eye);
var offset = 0.2; var offset = 0.2;