Merge branch 'feature/KASM-2445_clipboard_ids' into 'master'

Log and send clipboard op ids

See merge request kasm-technologies/internal/KasmVNC!37
This commit is contained in:
Matthew McClaskey 2022-04-05 12:52:39 +00:00
commit b73d3fc786
10 changed files with 37 additions and 15 deletions

View File

@ -292,7 +292,7 @@ void SConnection::clearBinaryClipboard()
} }
void SConnection::addBinaryClipboard(const char mime[], const rdr::U8 *data, void SConnection::addBinaryClipboard(const char mime[], const rdr::U8 *data,
const rdr::U32 len) const rdr::U32 len, const rdr::U32 id)
{ {
binaryClipboard_t bin; binaryClipboard_t bin;
strncpy(bin.mime, mime, sizeof(bin.mime)); strncpy(bin.mime, mime, sizeof(bin.mime));
@ -301,6 +301,8 @@ void SConnection::addBinaryClipboard(const char mime[], const rdr::U8 *data,
bin.data.resize(len); bin.data.resize(len);
memcpy(&bin.data[0], data, len); memcpy(&bin.data[0], data, len);
bin.id = id;
binaryClipboard.push_back(bin); binaryClipboard.push_back(bin);
} }

View File

@ -76,7 +76,7 @@ namespace rfb {
virtual void clearBinaryClipboard(); virtual void clearBinaryClipboard();
virtual void addBinaryClipboard(const char mime[], const rdr::U8 *data, virtual void addBinaryClipboard(const char mime[], const rdr::U8 *data,
const rdr::U32 len); const rdr::U32 len, const rdr::U32 id);
virtual void supportsQEMUKeyEvent(); virtual void supportsQEMUKeyEvent();
@ -193,6 +193,7 @@ namespace rfb {
struct binaryClipboard_t { struct binaryClipboard_t {
char mime[32]; char mime[32];
rdr::U32 id;
std::vector<unsigned char> data; std::vector<unsigned char> data;
}; };

View File

@ -73,7 +73,7 @@ void SMsgHandler::clearBinaryClipboard()
} }
void SMsgHandler::addBinaryClipboard(const char mime[], const rdr::U8 *data, void SMsgHandler::addBinaryClipboard(const char mime[], const rdr::U8 *data,
const rdr::U32 len) const rdr::U32 len, const rdr::U32 id)
{ {
} }

View File

@ -57,7 +57,7 @@ namespace rfb {
virtual void handleClipboardAnnounceBinary(const unsigned num, const char mimes[][32]); virtual void handleClipboardAnnounceBinary(const unsigned num, const char mimes[][32]);
virtual void clearBinaryClipboard(); virtual void clearBinaryClipboard();
virtual void addBinaryClipboard(const char mime[], const rdr::U8 *data, virtual void addBinaryClipboard(const char mime[], const rdr::U8 *data,
const rdr::U32 len); const rdr::U32 len, const rdr::U32 id);
virtual void sendStats(const bool toClient = true) = 0; virtual void sendStats(const bool toClient = true) = 0;
virtual void handleFrameStats(rdr::U32 all, rdr::U32 render) = 0; virtual void handleFrameStats(rdr::U32 all, rdr::U32 render) = 0;

View File

@ -276,7 +276,7 @@ void SMsgReader::readBinaryClipboard()
vlog.debug("Received binary clipboard, type %s, %u bytes", mime, len); vlog.debug("Received binary clipboard, type %s, %u bytes", mime, len);
handler->addBinaryClipboard(mime, (rdr::U8 *) ca.buf, len); handler->addBinaryClipboard(mime, (rdr::U8 *) ca.buf, len, 0);
valid++; valid++;
} }

View File

@ -92,6 +92,9 @@ void SMsgWriter::writeBinaryClipboard(const std::vector<SConnection::binaryClipb
os->writeU8(b.size()); os->writeU8(b.size());
rdr::U8 i; rdr::U8 i;
for (i = 0; i < b.size(); i++) { for (i = 0; i < b.size(); i++) {
const rdr::U32 id = b[i].id;
os->writeU32(id);
const rdr::U8 mimelen = strlen(b[i].mime); const rdr::U8 mimelen = strlen(b[i].mime);
os->writeU8(mimelen); os->writeU8(mimelen);
os->writeBytes(b[i].mime, mimelen); os->writeBytes(b[i].mime, mimelen);

View File

@ -367,17 +367,18 @@ char *percentEncode4(const uint16_t *str, const unsigned len) {
} }
static void cliplog(const char *str, const int len, const int origlen, static void cliplog(const char *str, const int len, const int origlen,
const char *dir, const char *client) { const char *dir, const char *client, const unsigned id) {
if (Server::DLP_ClipLog[0] == 'o') if (Server::DLP_ClipLog[0] == 'o')
return; return;
if (Server::DLP_ClipLog[0] == 'i') { if (Server::DLP_ClipLog[0] == 'i') {
vlog.info("DLP: client %s: %s %u (%u requested) clipboard bytes", client, dir, len, origlen); vlog.info("DLP: client %s: %s %u (%u requested) clipboard bytes, id %u", client, dir,
len, origlen, id);
} else { } else {
// URL-encode it // URL-encode it
char *enc = percentEncode(str, len); char *enc = percentEncode(str, len);
vlog.info("DLP: client %s: %s %u (%u requested) clipboard bytes: '%s'", vlog.info("DLP: client %s: %s %u (%u requested) clipboard bytes, id %u: '%s'",
client, dir, len, origlen, enc); client, dir, len, origlen, id, enc);
free(enc); free(enc);
} }
} }
@ -439,7 +440,8 @@ void VNCSConnectionST::clearBinaryClipboardData()
void VNCSConnectionST::sendBinaryClipboardDataOrClose(const char* mime, void VNCSConnectionST::sendBinaryClipboardDataOrClose(const char* mime,
const unsigned char *data, const unsigned char *data,
const unsigned len) const unsigned len,
const unsigned id)
{ {
try { try {
if (!(accessRights & AccessCutText)) return; if (!(accessRights & AccessCutText)) return;
@ -450,10 +452,11 @@ void VNCSConnectionST::sendBinaryClipboardDataOrClose(const char* mime,
return; return;
} }
cliplog((const char *) data, len, len, "sent", sock->getPeerAddress()); cliplog((const char *) data, len, len, "sent", sock->getPeerAddress(),
id);
if (state() != RFBSTATE_NORMAL) return; if (state() != RFBSTATE_NORMAL) return;
addBinaryClipboard(mime, data, len); addBinaryClipboard(mime, data, len, id);
binclipTimer.start(100); binclipTimer.start(100);
} catch(rdr::Exception& e) { } catch(rdr::Exception& e) {
close(e.str()); close(e.str());
@ -1049,6 +1052,14 @@ void VNCSConnectionST::handleClipboardAnnounceBinary(const unsigned num, const c
if (!(accessRights & AccessCutText)) return; if (!(accessRights & AccessCutText)) return;
if (!rfb::Server::acceptCutText) return; if (!rfb::Server::acceptCutText) return;
server->handleClipboardAnnounceBinary(this, num, mimes); server->handleClipboardAnnounceBinary(this, num, mimes);
const unsigned tolog = server->clipboardId++;
if (Server::DLP_ClipLog[0] == 'o')
return;
vlog.info("DLP: client %s: %s %u clipboard mimes, id %u",
sock->getPeerAddress(), "received",
num, tolog);
} }
// supportsLocalCursor() is called whenever the status of // supportsLocalCursor() is called whenever the status of

View File

@ -80,7 +80,7 @@ namespace rfb {
void announceClipboardOrClose(bool available); void announceClipboardOrClose(bool available);
void clearBinaryClipboardData(); void clearBinaryClipboardData();
void sendBinaryClipboardDataOrClose(const char* mime, const unsigned char *data, void sendBinaryClipboardDataOrClose(const char* mime, const unsigned char *data,
const unsigned len); const unsigned len, const unsigned id);
void getBinaryClipboardData(const char* mime, const unsigned char **data, void getBinaryClipboardData(const char* mime, const unsigned char **data,
unsigned *len); unsigned *len);

View File

@ -131,7 +131,8 @@ VNCServerST::VNCServerST(const char* name_, SDesktop* desktop_)
renderedCursorInvalid(false), renderedCursorInvalid(false),
queryConnectionHandler(0), keyRemapper(&KeyRemapper::defInstance), queryConnectionHandler(0), keyRemapper(&KeyRemapper::defInstance),
lastConnectionTime(0), disableclients(false), lastConnectionTime(0), disableclients(false),
frameTimer(this), apimessager(NULL), trackingFrameStats(0) frameTimer(this), apimessager(NULL), trackingFrameStats(0),
clipboardId(0)
{ {
lastUserInputTime = lastDisconnectTime = time(0); lastUserInputTime = lastDisconnectTime = time(0);
slog.debug("creating single-threaded server %s", name.buf); slog.debug("creating single-threaded server %s", name.buf);
@ -539,8 +540,10 @@ void VNCServerST::sendBinaryClipboardData(const char* mime, const unsigned char
std::list<VNCSConnectionST*>::iterator ci, ci_next; std::list<VNCSConnectionST*>::iterator ci, ci_next;
for (ci = clients.begin(); ci != clients.end(); ci = ci_next) { for (ci = clients.begin(); ci != clients.end(); ci = ci_next) {
ci_next = ci; ci_next++; ci_next = ci; ci_next++;
(*ci)->sendBinaryClipboardDataOrClose(mime, data, len); (*ci)->sendBinaryClipboardDataOrClose(mime, data, len, clipboardId);
} }
clipboardId++;
} }
void VNCServerST::getBinaryClipboardData(const char* mime, const unsigned char **data, void VNCServerST::getBinaryClipboardData(const char* mime, const unsigned char **data,

View File

@ -281,6 +281,8 @@ namespace rfb {
} DLPRegion; } DLPRegion;
void translateDLPRegion(rdr::U16 &x1, rdr::U16 &y1, rdr::U16 &x2, rdr::U16 &y2) const; void translateDLPRegion(rdr::U16 &x1, rdr::U16 &y1, rdr::U16 &x2, rdr::U16 &y2) const;
rdr::U32 clipboardId;
}; };
}; };