/****************************************************************************** * * * 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.exe; import java.io.IOException; import java.util.Date; import java.util.HashMap; import javax.xml.stream.XMLStreamException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.subterranean_security.crimson.core.attribute.keys.AKeySimple; import com.subterranean_security.crimson.core.net.Connector; 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.Delta.ProfileTimestamp; import com.subterranean_security.crimson.core.proto.MSG.Message; import com.subterranean_security.crimson.core.util.LocationUtil; import com.subterranean_security.crimson.core.util.ProtoUtil; import com.subterranean_security.crimson.core.util.ValidationUtil; import com.subterranean_security.crimson.server.net.ServerConnectionStore; import com.subterranean_security.crimson.server.store.ProfileStore; import com.subterranean_security.crimson.sv.permissions.Perm; import com.subterranean_security.crimson.sv.profile.ClientProfile; public final class DeltaExe { private static final Logger log = LoggerFactory.getLogger(DeltaExe.class); private DeltaExe() { } public static void ev_profileDelta(Connector r, EV_ProfileDelta pd) { if (pd.getFig()) { pd = EV_ProfileDelta.newBuilder(pd).addGroup(resolveLocation(r, pd)).build(); } if (pd.getCvid() != r.getCvid()) { System.out.println( "Attention: PD CVID differs from receptor! PD: " + pd.getCvid() + " receptor: " + r.getCvid()); pd = EV_ProfileDelta.newBuilder(pd).setCvid(r.getCvid()).build(); } ProfileStore.getClient(r.getCvid()).amalgamate(pd); ServerConnectionStore.sendToViewersWithAuthorityOverClient(r.getCvid(), Perm.client.visibility, Message.newBuilder().setEvProfileDelta(pd)); } private static AttributeGroupContainer resolveLocation(Connector receptor, EV_ProfileDelta pd) { AttributeGroupContainer general = ProtoUtil.getGeneralGroup(pd); AttributeGroupContainer.Builder update = AttributeGroupContainer.newBuilder(general).clearAttribute(); String ip = null; if (!general.containsAttribute(AKeySimple.NET_EXTERNALIP.getFullID())) { // amend IP ip = receptor.getRemoteIP(); update.putAttribute(AKeySimple.NET_EXTERNALIP.getFullID(), ip); } else { ip = general.getAttributeOrDefault(AKeySimple.NET_EXTERNALIP.getFullID(), ""); } if (!ValidationUtil.privateIP(ip)) { try { HashMap<String, String> location = LocationUtil.resolve(ip); update.putAttribute(AKeySimple.IPLOC_COUNTRYCODE.getFullID(), location.get("countrycode")); update.putAttribute(AKeySimple.IPLOC_COUNTRY.getFullID(), location.get("countryname")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (XMLStreamException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return update.build(); } public static void mi_trigger_profile_delta(Connector r, Message m) { for (ClientProfile cp : ProfileStore.getClientsUnderAuthority(r.getCvid())) { boolean flag = true; for (ProfileTimestamp pt : m.getMiTriggerProfileDelta().getProfileTimestampList()) { if (pt.getCvid() == cp.getCvid()) { log.debug("Updating client in viewer"); r.write( Message.newBuilder().setEvProfileDelta(cp.getUpdates(new Date(pt.getTimestamp()))).build()); flag = false; continue; } } if (flag) { log.debug("Sending new client to viewer"); r.write(Message.newBuilder().setEvProfileDelta(cp.getUpdates(new Date(0))).build()); } } } }