/*
* Copyright 2014 MovingBlocks
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.terasology.logic.permission;
import org.terasology.config.Config;
import org.terasology.config.PermissionConfig;
import org.terasology.entitySystem.entity.EntityManager;
import org.terasology.entitySystem.entity.EntityRef;
import org.terasology.entitySystem.systems.BaseComponentSystem;
import org.terasology.entitySystem.systems.RegisterSystem;
import org.terasology.logic.common.DisplayNameComponent;
import org.terasology.logic.console.Console;
import org.terasology.logic.console.commandSystem.ConsoleCommand;
import org.terasology.logic.console.commandSystem.annotations.Command;
import org.terasology.logic.console.commandSystem.annotations.CommandParam;
import org.terasology.logic.console.commandSystem.annotations.Sender;
import org.terasology.logic.console.suggesters.UsernameSuggester;
import org.terasology.network.ClientComponent;
import org.terasology.registry.In;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
@RegisterSystem
public class PermissionCommands extends BaseComponentSystem {
@In
private PermissionManager permissionManager;
@In
private EntityManager entityManager;
@In
private Console console;
@In
private Config config;
@Command(shortDescription = "Use an one time key to get all* permissions",
helpText = "The config file contains a one time key which can be used to get all* permissions."
+ "Please note that the debug permission will only be granted if the debug setting is on.",
runOnServer = true, requiredPermission = PermissionManager.NO_PERMISSION)
public String usePermissionKey(@CommandParam("key") String key, @Sender EntityRef client) {
PermissionConfig permissionConfig = config.getPermission();
String expectedKey = permissionConfig.getOneTimeAuthorizationKey();
if (expectedKey != null && !expectedKey.equals("") && key.equals(expectedKey)) {
permissionConfig.setOneTimeAuthorizationKey("");
ClientComponent clientComponent = client.getComponent(ClientComponent.class);
EntityRef clientInfo = clientComponent.clientInfo;
for (String permission: findAllPermissions()) {
boolean add = true;
if (permission.equals(PermissionManager.DEBUG_PERMISSION)) {
add = config.getSystem().isDebugEnabled();
}
if (add) {
permissionManager.addPermission(clientInfo, permission);
}
}
PermissionSetComponent permissionSetComp = clientInfo.getComponent(PermissionSetComponent.class);
return "Permission key used: You have now the following permissions: " + permissionSetComp.permissions;
} else {
return "Key invalid or used";
}
}
private Set<String> findAllPermissions() {
Set<String> allPermissions = new HashSet<>();
for (ConsoleCommand command: console.getCommands()) {
String permission = command.getRequiredPermission();
if (!permission.equals(PermissionManager.NO_PERMISSION)) {
allPermissions.add(permission);
}
}
return allPermissions;
}
@Command(shortDescription = "Gives specified permission to player",
helpText = "Gives specified permission to player",
runOnServer = true, requiredPermission = PermissionManager.USER_MANAGEMENT_PERMISSION)
public String givePermission(
@CommandParam(value = "player", suggester = UsernameSuggester.class) String player,
@CommandParam("permission") String permission,
@Sender EntityRef requester) {
boolean permissionGiven = false;
ClientComponent requesterClientComponent = requester.getComponent(ClientComponent.class);
EntityRef requesterClientInfo = requesterClientComponent.clientInfo;
if (!permissionManager.hasPermission(requesterClientInfo, permission)) {
return String.format("You can't give the permission %s because you don't have it yourself", permission);
}
for (EntityRef client : entityManager.getEntitiesWith(ClientComponent.class)) {
ClientComponent clientComponent = client.getComponent(ClientComponent.class);
if (clientHasName(clientComponent, player)) {
permissionManager.addPermission(clientComponent.clientInfo, permission);
permissionGiven = true;
}
}
if (permissionGiven) {
return "Permission " + permission + " added to player " + player;
} else {
return "Unable to find player " + player;
}
}
@Command(shortDescription = "Lists all permission the specified player has",
helpText = "Lists all permission the specified player has",
runOnServer = true, requiredPermission = PermissionManager.USER_MANAGEMENT_PERMISSION)
public String listPermissions(@CommandParam(value = "player", suggester = UsernameSuggester.class) String player) {
for (EntityRef client : entityManager.getEntitiesWith(ClientComponent.class)) {
ClientComponent clientComponent = client.getComponent(ClientComponent.class);
if (clientHasName(clientComponent, player)) {
EntityRef clientInfo = clientComponent.clientInfo;
PermissionSetComponent permissionSetComp = clientInfo.getComponent(PermissionSetComponent.class);
return Objects.toString(permissionSetComp.permissions);
}
}
return "Player not found";
}
@Command(shortDescription = "Removes specified permission from player",
helpText = "Removes specified permission from player",
runOnServer = true, requiredPermission = PermissionManager.USER_MANAGEMENT_PERMISSION)
public String removePermission(
@CommandParam(value = "player", suggester = UsernameSuggester.class) String player,
@CommandParam("permission") String permission,
@Sender EntityRef requester) {
boolean permissionGiven = false;
ClientComponent requesterClientComponent = requester.getComponent(ClientComponent.class);
EntityRef requesterClientInfo = requesterClientComponent.clientInfo;
if (!permissionManager.hasPermission(requesterClientInfo, permission)) {
return String.format("You can't remove the permission %s because you don't have it yourself", permission);
}
for (EntityRef client : entityManager.getEntitiesWith(ClientComponent.class)) {
ClientComponent clientComponent = client.getComponent(ClientComponent.class);
if (clientHasName(clientComponent, player)) {
permissionManager.removePermission(clientComponent.clientInfo, permission);
permissionGiven = true;
}
}
if (permissionGiven) {
return "Permission " + permission + " removed from player " + player;
} else {
return "Unable to find player " + player;
}
}
private boolean clientHasName(ClientComponent client, String playerName) {
EntityRef clientInfo = client.clientInfo;
if (clientInfo != null) {
String name = clientInfo.getComponent(DisplayNameComponent.class).name;
return playerName.equalsIgnoreCase(name);
}
return false;
}
}