/****************************************************************************** * * * Copyright 2017 Subterranean Security * * * * 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 com.subterranean_security.crimson.server.net; import java.util.Observable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.subterranean_security.crimson.core.attribute.keys.AKeySimple; import com.subterranean_security.crimson.core.attribute.keys.AttributeKey; import com.subterranean_security.crimson.core.net.Connector; import com.subterranean_security.crimson.core.net.Connector.ConnectionState; import com.subterranean_security.crimson.core.proto.Delta.AttributeGroupContainer; import com.subterranean_security.crimson.core.proto.Delta.EV_ProfileDelta; import com.subterranean_security.crimson.core.proto.MSG.Message; import com.subterranean_security.crimson.core.store.ConnectionStore; import com.subterranean_security.crimson.core.store.ConnectionStore.ConnectionEventListener; import com.subterranean_security.crimson.server.store.Authentication; import com.subterranean_security.crimson.server.store.ProfileStore; import com.subterranean_security.crimson.sv.permissions.Perm; import com.subterranean_security.crimson.universal.Universal; import com.subterranean_security.crimson.universal.Universal.Instance; public final class ServerConnectionStore { private static final Logger log = LoggerFactory.getLogger(ServerConnectionStore.class); private ServerConnectionStore() { } public static void initialize() { ConnectionStore.initialize(new ServerConnectionEventListener()); } public static void sendToAll(Universal.Instance i, Message m) { for (Connector c : ConnectionStore.getValues()) { if (c.getInstance() == i) { c.write(m); } } } public static void sendToViewersWithAuthorityOverClient(int cid, int perm, Message.Builder m) { for (Connector c : ConnectionStore.getValues()) { if (c.getInstance() == Universal.Instance.VIEWER && ProfileStore.getViewer(c.getCvid()).getPermissions().getFlag(cid, perm)) { c.write(m.build()); } } } private static class ServerConnectionEventListener implements ConnectionEventListener { @Override public void update(Observable o, Object arg) { Connector connector = (Connector) o; ConnectionState state = (ConnectionState) arg; if (connector.getInstance() == Instance.CLIENT) { switch (state) { case AUTHENTICATED: Authentication.refreshVisibilityPermissions(connector.getCvid()); ProfileStore.getClient(connector.getCvid()).setOnline(true); // sendToViewersWithAuthorityOverClient(r.getCvid(), // Perm.client.visibility, // Message.newBuilder().setEvProfileDelta(EV_ProfileDelta.newBuilder().setCvid(r.getCvid()) // .putStrAttr(SimpleAttribute.CLIENT_ONLINE.ordinal(), // "1"))); break; case NOT_CONNECTED: ProfileStore.getClient(connector.getCvid()).setOnline(false); sendToViewersWithAuthorityOverClient(connector.getCvid(), Perm.client.visibility, Message.newBuilder() .setEvProfileDelta(EV_ProfileDelta.newBuilder().setCvid(connector.getCvid()) .addGroup(AttributeGroupContainer.newBuilder().setGroupId("") .setGroupType(AttributeKey.Type.GENERAL.ordinal()).putAttribute( AKeySimple.CLIENT_ONLINE.ordinal(), "0") .build()))); break; default: break; } } else { } } } }