use of me.retrodaredevil.solarthing.commands.packets.open.CommandOpenPacket in project solarthing by wildmountainfarms.
the class SendEncryptedActionNode method createAction.
@Override
public Action createAction(ActionEnvironment actionEnvironment) {
SolarThingDatabase database = actionEnvironment.getInjectEnvironment().get(SolarThingDatabaseEnvironment.class).getSolarThingDatabase();
String sourceId = actionEnvironment.getInjectEnvironment().get(SourceIdEnvironment.class).getSourceId();
ZoneId zoneId = actionEnvironment.getInjectEnvironment().get(TimeZoneEnvironment.class).getZoneId();
CommandOpenPacket packet = packetProvider.get();
requireNonNull(packet, "The supplier should have given us a packet!");
PacketCollectionCreator creator = commandManager.makeCreator(sourceId, zoneId, InstanceTargetPackets.create(fragmentIdTargets), packet, PacketCollectionIdGenerator.Defaults.UNIQUE_GENERATOR);
return Actions.createLinkedActionRunner(new SendPacketAction(threadFactory, database::getOpenDatabase, creator, 100, 10, // TODO allow actions to be passed in for these
PassActionNode.getInstance().createAction(actionEnvironment), PassActionNode.getInstance().createAction(actionEnvironment)), WhenDone.BE_DONE, true);
}
use of me.retrodaredevil.solarthing.commands.packets.open.CommandOpenPacket in project solarthing by wildmountainfarms.
the class CommandManager method makeCreator.
/**
* @param instanceTargetPacket The {@link InstanceTargetPacket} to indicate which fragments to target or null. If null, it is not added to the packet collection
* @param commandOpenPacket The command packet
* @return A creator to make a packet collection. When supplied with an {@link Instant} representing now, a packet collection is created.
*/
public PacketCollectionCreator makeCreator(String sourceId, ZoneId zoneId, @Nullable InstanceTargetPacket instanceTargetPacket, CommandOpenPacket commandOpenPacket, PacketCollectionIdGenerator packetCollectionIdGenerator) {
// instanceTargetPacket may be null
KeyPair keyPair = getKeyPair();
InstanceSourcePacket instanceSourcePacket = InstanceSourcePackets.create(sourceId);
// ----
return now -> {
PacketCollection packetCollectionToNestAndEncrypt = PacketCollections.create(now, instanceTargetPacket == null ? Arrays.asList(commandOpenPacket, instanceSourcePacket) : Arrays.asList(commandOpenPacket, instanceSourcePacket, instanceTargetPacket), "unused document ID that does not get serialized");
// Note, on packetCollectionToNestAndEncrypt, _id is not serialized, so the generator and zoneId used above do NOT affect anything
final String payload;
try {
payload = MAPPER.writeValueAsString(packetCollectionToNestAndEncrypt);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
String hashString = Long.toHexString(now.toEpochMilli()) + "," + HashUtil.encodedHash(payload);
final String encrypted;
try {
synchronized (CIPHER) {
// It's possible we could be in a multi-threaded environment, and you cannot have multiple threads using a single cipher at once
encrypted = Encrypt.encrypt(CIPHER, keyPair.getPrivate(), hashString);
}
} catch (InvalidKeyException | EncryptException e) {
throw new RuntimeException(e);
}
List<Packet> packets = new ArrayList<>(Arrays.asList(new ImmutableLargeIntegrityPacket(sender, encrypted, payload), instanceSourcePacket));
if (instanceTargetPacket != null) {
packets.add(instanceTargetPacket);
}
return PacketCollections.createFromPackets(now, packets, packetCollectionIdGenerator, zoneId);
};
}
use of me.retrodaredevil.solarthing.commands.packets.open.CommandOpenPacket in project solarthing by wildmountainfarms.
the class ActionNodeDataReceiver method receivePacketGroup.
@Override
public void receivePacketGroup(String sender, TargetPacketGroup packetGroup) {
for (Packet packet : packetGroup.getPackets()) {
if (packet instanceof CommandOpenPacket) {
CommandOpenPacket commandOpenPacket = (CommandOpenPacket) packet;
if (commandOpenPacket.getPacketType() == CommandOpenPacketType.REQUEST_COMMAND) {
RequestCommandPacket requestCommand = (RequestCommandPacket) commandOpenPacket;
OpenSource source = new OpenSource(sender, packetGroup.getDateMillis(), requestCommand, requestCommand.getCommandName());
receiveData(source, requestCommand.getCommandName());
}
}
}
}
use of me.retrodaredevil.solarthing.commands.packets.open.CommandOpenPacket in project solarthing by wildmountainfarms.
the class CancelCommandChatBotHandler method cancelCommand.
private void cancelCommand(MessageSender messageSender, UUID schedulingId) {
List<VersionedPacket<StoredAlterPacket>> packets = alterPacketsProvider.getPackets();
if (packets == null) {
messageSender.sendMessage("Unable to cancel commands, as we are unable to reach the alter database.");
return;
}
List<VersionedPacket<StoredAlterPacket>> targets = findStoredPacketsWithSchedulingIdOrNull(packets.stream(), schedulingId);
if (targets.isEmpty()) {
messageSender.sendMessage("Unable to find a scheduled command that was scheduled with the ID of " + schedulingId);
} else if (targets.size() > 1) {
messageSender.sendMessage("Multiple packets corresponded to ID: " + schedulingId + ". Please report this error.");
} else {
VersionedPacket<StoredAlterPacket> target = targets.get(0);
messageSender.sendMessage("Going request cancel of " + target.getPacket().getDbId());
CommandOpenPacket packet = new ImmutableDeleteAlterPacket(target.getPacket().getDbId(), target.getUpdateToken());
PacketCollectionCreator creator = commandHelper.getCommandManager().makeCreator(sourceId, zoneId, null, packet, PacketCollectionIdGenerator.Defaults.UNIQUE_GENERATOR);
executorService.execute(() -> {
Instant now = Instant.now();
PacketCollection packetCollection = creator.create(now);
boolean success = true;
try {
database.getOpenDatabase().uploadPacketCollection(packetCollection, null);
} catch (SolarThingDatabaseException e) {
LOGGER.error("Could not upload alter delete request", e);
success = false;
}
if (success) {
messageSender.sendMessage("Sent request to delete the scheduled command");
} else {
messageSender.sendMessage("Could not upload request to delete scheduled command. You can try again.");
}
});
}
}
Aggregations