/* * Copyright 2013 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.config; import com.google.common.collect.Maps; import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import org.terasology.identity.PrivateIdentityCertificate; import org.terasology.identity.PublicIdentityCertificate; import java.lang.reflect.Type; import java.security.SecurityPermission; import java.util.Map; /** * */ public class SecurityConfig { public static final SecurityPermission PRIVATE_CERTIFICATE_ACCESS_PERMISSION = new SecurityPermission("PRIVATE_CERTIFICATE_ACCESS_PERMISSION"); public static final SecurityPermission CERTIFICATE_WRITE_PERMISSION = new SecurityPermission("CERTIFICATE_WRITE_PERMISSION"); private PublicIdentityCertificate serverPublicCertificate; private PrivateIdentityCertificate serverPrivateCertificate; private Map<PublicIdentityCertificate, ClientIdentity> clientCertificates = Maps.newHashMap(); public PublicIdentityCertificate getServerPublicCertificate() { return serverPublicCertificate; } public PrivateIdentityCertificate getServerPrivateCertificate() { if (System.getSecurityManager() != null) { System.getSecurityManager().checkPermission(PRIVATE_CERTIFICATE_ACCESS_PERMISSION); } return serverPrivateCertificate; } public void setServerCredentials(PublicIdentityCertificate publicCert, PrivateIdentityCertificate privateCert) { if (System.getSecurityManager() != null) { System.getSecurityManager().checkPermission(CERTIFICATE_WRITE_PERMISSION); } this.serverPublicCertificate = publicCert; this.serverPrivateCertificate = privateCert; } public ClientIdentity getIdentity(PublicIdentityCertificate serverCertificate) { return clientCertificates.get(serverCertificate); } public void addIdentity(PublicIdentityCertificate serverCertificate, ClientIdentity identity) { if (System.getSecurityManager() != null) { System.getSecurityManager().checkPermission(CERTIFICATE_WRITE_PERMISSION); } clientCertificates.put(serverCertificate, identity); } public static class Handler implements JsonSerializer<SecurityConfig>, JsonDeserializer<SecurityConfig> { public static final String SERVER_PUBLIC_CERTIFICATE = "serverPublicCertificate"; public static final String SERVER_PRIVATE_CERTIFICATE = "serverPrivateCertificate"; public static final String CLIENT_IDENTITIES = "clientIdentities"; @Override public SecurityConfig deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { SecurityConfig result = new SecurityConfig(); JsonObject jsonObject = json.getAsJsonObject(); if (jsonObject.has(SERVER_PUBLIC_CERTIFICATE)) { result.serverPublicCertificate = context.deserialize(jsonObject.getAsJsonObject(SERVER_PUBLIC_CERTIFICATE), PublicIdentityCertificate.class); } if (jsonObject.has(SERVER_PRIVATE_CERTIFICATE)) { result.serverPrivateCertificate = context.deserialize(jsonObject.getAsJsonObject(SERVER_PRIVATE_CERTIFICATE), PrivateIdentityCertificate.class); } if (jsonObject.has(CLIENT_IDENTITIES)) { JsonArray clientArray = jsonObject.getAsJsonArray(CLIENT_IDENTITIES); for (JsonElement jsonEntry : clientArray) { ClientEntry entry = context.deserialize(jsonEntry, ClientEntry.class); result.addIdentity(entry.server, new ClientIdentity(entry.clientPublic, entry.clientPrivate)); } } return result; } @Override public JsonElement serialize(SecurityConfig src, Type typeOfSrc, JsonSerializationContext context) { JsonObject result = new JsonObject(); result.add(SERVER_PUBLIC_CERTIFICATE, context.serialize(src.serverPublicCertificate)); result.add(SERVER_PRIVATE_CERTIFICATE, context.serialize(src.serverPrivateCertificate)); JsonArray clientArray = new JsonArray(); for (Map.Entry<PublicIdentityCertificate, ClientIdentity> entry : src.clientCertificates.entrySet()) { ClientEntry clientEntry = new ClientEntry(); clientEntry.server = entry.getKey(); clientEntry.clientPublic = entry.getValue().getPlayerPublicCertificate(); clientEntry.clientPrivate = entry.getValue().getPlayerPrivateCertificate(); clientArray.add(context.serialize(clientEntry)); } result.add(CLIENT_IDENTITIES, clientArray); return result; } } private static class ClientEntry { public PublicIdentityCertificate server; public PublicIdentityCertificate clientPublic; public PrivateIdentityCertificate clientPrivate; } }