Compare commits

...

5 Commits

Author SHA1 Message Date
Matthew McClaskey 6151f98ec6 Merge branch 'bugfix/KASM-3196_clip_0.9.3.2_hotfix' into 'release/0.9.3.1'
# Conflicts:
#   .gitmodules
3 years ago
mmcclaskey 99f879ffb7 KASM-3196 seamless clip fix 3 years ago
mattmcclaskey a5b9d75d63 KASM-3119 correct code review issues on MR 3 years ago
Dmitry Maksyoma 3e3462a4de Fix Kali build by using gcc 11 3 years ago
mattmcclaskey 1e4ca3563c KASM-3119 send full frame on permission changes 3 years ago

2
.gitmodules vendored

@ -1,4 +1,4 @@
[submodule "kasmweb"] [submodule "kasmweb"]
path = kasmweb path = kasmweb
url = https://github.com/kasmtech/noVNC.git url = https://github.com/kasmtech/noVNC.git
branch = master branch = bugfix/KASM-3196_clip_0.9.3.2_hotfix

@ -1,4 +1,6 @@
#!/bin/sh -e #!/bin/bash
set -e
detect_quilt() { detect_quilt() {
if which quilt 1>/dev/null; then if which quilt 1>/dev/null; then
@ -13,11 +15,30 @@ ensure_crashpad_can_fetch_line_number_by_address() {
fi fi
} }
fail_on_gcc_12() {
if [[ -n "$CC" && -n "$CXX" ]]; then
return;
fi
if gcc --version | head -1 | grep -q 12; then
cat >&2 <<EOF
Error: gcc 12 detected. It has a bug causing the build to fail because of a
-Warray-bounds bug. Please use gcc 11 in the build Dockerfile:
ENV CC=gcc-11
ENV CXX=g++-11
RUN <install gcc 11>
EOF
exit 1
fi
}
# For build-dep to work, the apt sources need to have the source server # For build-dep to work, the apt sources need to have the source server
#sudo apt-get build-dep xorg-server #sudo apt-get build-dep xorg-server
#sudo apt-get install cmake git libjpeg-dev libgnutls-dev #sudo apt-get install cmake git libjpeg-dev libgnutls-dev
fail_on_gcc_12
# Ubuntu applies a million patches, but here we use upstream to simplify matters # Ubuntu applies a million patches, but here we use upstream to simplify matters
cd /tmp cd /tmp
# default to the version of x in Ubuntu 18.04, otherwise caller will need to specify # default to the version of x in Ubuntu 18.04, otherwise caller will need to specify

@ -4,6 +4,8 @@ ENV KASMVNC_BUILD_OS kali
ENV KASMVNC_BUILD_OS_CODENAME kali-rolling ENV KASMVNC_BUILD_OS_CODENAME kali-rolling
ENV XORG_VER 1.20.10 ENV XORG_VER 1.20.10
ENV DEBIAN_FRONTEND noninteractive ENV DEBIAN_FRONTEND noninteractive
ENV CC=gcc-11
ENV CXX=g++-11
RUN grep '^deb' /etc/apt/sources.list | sed 's#^deb#deb-src#' >> /etc/apt/sources.list RUN grep '^deb' /etc/apt/sources.list | sed 's#^deb#deb-src#' >> /etc/apt/sources.list
@ -12,6 +14,7 @@ RUN apt-get update && \
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata RUN DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata
RUN apt-get update && apt-get -y build-dep xorg-server libxfont-dev RUN apt-get update && apt-get -y build-dep xorg-server libxfont-dev
RUN apt-get update && apt-get -y install gcc-11 g++-11
RUN apt-get update && apt-get -y install cmake git libjpeg-dev libgnutls28-dev vim wget tightvncserver RUN apt-get update && apt-get -y install cmake git libjpeg-dev libgnutls28-dev vim wget tightvncserver
RUN apt-get update && apt-get -y install libpng-dev libtiff-dev libgif-dev libavcodec-dev libssl-dev libxrandr-dev libxcursor-dev RUN apt-get update && apt-get -y install libpng-dev libtiff-dev libgif-dev libavcodec-dev libssl-dev libxrandr-dev libxcursor-dev
@ -20,7 +23,7 @@ RUN cd /tmp && wget https://storage.googleapis.com/downloads.webmproject.org/rel
RUN cd /tmp && tar -xzf /tmp/libwebp-* RUN cd /tmp && tar -xzf /tmp/libwebp-*
RUN cd /tmp/libwebp-1.0.2 && \ RUN cd /tmp/libwebp-1.0.2 && \
./configure --enable-static --disable-shared && \ ./configure --enable-static --disable-shared && \
make && make install make -j$(nproc) && make install
RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo

@ -45,6 +45,7 @@ int ssl_initialized = 0;
int pipe_error = 0; int pipe_error = 0;
settings_t settings; settings_t settings;
extern int wakeuppipe[2];
void traffic(const char * token) { void traffic(const char * token) {
/*if ((settings.verbose) && (! settings.daemon)) { /*if ((settings.verbose) && (! settings.daemon)) {
@ -1083,6 +1084,9 @@ static uint8_t ownerapi_post(ws_ctx_t *ws_ctx, const char *in, const char * cons
free(set->entries); free(set->entries);
free(set); free(set);
//force full frame to all users with at least read
write(wakeuppipe[1], "", 1);
sprintf(buf, "HTTP/1.1 200 OK\r\n" sprintf(buf, "HTTP/1.1 200 OK\r\n"
"Server: KasmVNC/4.0\r\n" "Server: KasmVNC/4.0\r\n"
"Connection: close\r\n" "Connection: close\r\n"
@ -1172,6 +1176,9 @@ static uint8_t ownerapi_post(ws_ctx_t *ws_ctx, const char *in, const char * cons
} }
} }
//force full frame to all users with at least read
write(wakeuppipe[1], "", 1);
free(set->entries); free(set->entries);
free(set); free(set);
@ -1312,7 +1319,7 @@ static uint8_t ownerapi(ws_ctx_t *ws_ctx, const char *in, const char * const use
} }
} else entry("/api/create_user") { } else entry("/api/create_user") {
char decname[1024] = "", decpw[1024] = ""; char decname[1024] = "", decpw[1024] = "";
uint8_t read = 0, write = 0, owner = 0; uint8_t read_p = 0, write_p = 0, owner_p = 0;
param = parse_get(args, "name", &len); param = parse_get(args, "name", &len);
if (len) { if (len) {
@ -1337,29 +1344,32 @@ static uint8_t ownerapi(ws_ctx_t *ws_ctx, const char *in, const char * const use
param = parse_get(args, "read", &len); param = parse_get(args, "read", &len);
if (len && isalpha(param[0])) { if (len && isalpha(param[0])) {
if (!strncmp(param, "true", len)) if (!strncmp(param, "true", len))
read = 1; read_p = 1;
} }
param = parse_get(args, "write", &len); param = parse_get(args, "write", &len);
if (len && isalpha(param[0])) { if (len && isalpha(param[0])) {
if (!strncmp(param, "true", len)) if (!strncmp(param, "true", len))
write = 1; write_p = 1;
} }
param = parse_get(args, "owner", &len); param = parse_get(args, "owner", &len);
if (len && isalpha(param[0])) { if (len && isalpha(param[0])) {
if (!strncmp(param, "true", len)) if (!strncmp(param, "true", len))
owner = 1; owner_p = 1;
} }
if (!decname[0] || !decpw[0]) if (!decname[0] || !decpw[0])
goto nope; goto nope;
if (!settings.adduserCb(settings.messager, decname, decpw, read, write, owner)) { if (!settings.adduserCb(settings.messager, decname, decpw, read_p, write_p, owner_p)) {
handler_msg("Invalid params to create_user\n"); handler_msg("Invalid params to create_user\n");
goto nope; goto nope;
} }
//force full frame to all users with at least read
write(wakeuppipe[1], "", 1);
sprintf(buf, "HTTP/1.1 200 OK\r\n" sprintf(buf, "HTTP/1.1 200 OK\r\n"
"Server: KasmVNC/4.0\r\n" "Server: KasmVNC/4.0\r\n"
"Connection: close\r\n" "Connection: close\r\n"
@ -1444,6 +1454,9 @@ static uint8_t ownerapi(ws_ctx_t *ws_ctx, const char *in, const char * const use
goto nope; goto nope;
} }
//force full frame to all users with at least read
write(wakeuppipe[1], "", 1);
sprintf(buf, "HTTP/1.1 200 OK\r\n" sprintf(buf, "HTTP/1.1 200 OK\r\n"
"Server: KasmVNC/4.0\r\n" "Server: KasmVNC/4.0\r\n"
"Connection: close\r\n" "Connection: close\r\n"

@ -76,7 +76,7 @@ VNCSConnectionST::VNCSConnectionST(VNCServerST* server_, network::Socket *s,
kasmpasswdpath[0] = '\0'; kasmpasswdpath[0] = '\0';
wordexp_t wexp; wordexp_t wexp;
if (!wordexp(rfb::Server::kasmPasswordFile, &wexp, WRDE_NOCMD)) if (!wordexp(rfb::Server::kasmPasswordFile, &wexp, WRDE_NOCMD))
strncpy(kasmpasswdpath, wexp.we_wordv[0], 4096); strncpy(kasmpasswdpath, wexp.we_wordv[0], 4095);
kasmpasswdpath[4095] = '\0'; kasmpasswdpath[4095] = '\0';
wordfree(&wexp); wordfree(&wexp);

@ -1181,3 +1181,13 @@ void VNCServerST::handleClipboardAnnounceBinary(VNCSConnectionST* client,
clipboardClient = client; clipboardClient = client;
desktop->handleClipboardAnnounceBinary(num, mimes); desktop->handleClipboardAnnounceBinary(num, mimes);
} }
void VNCServerST::refreshClients()
{
add_changed(pb->getRect());
std::list<VNCSConnectionST*>::iterator i;
for (i = clients.begin(); i != clients.end(); i++) {
(*i)->add_changed_all();
}
}

@ -43,7 +43,6 @@ namespace rfb {
class ListConnInfo; class ListConnInfo;
class PixelBuffer; class PixelBuffer;
class KeyRemapper; class KeyRemapper;
class network::GetAPIMessager;
class VNCServerST : public VNCServer, class VNCServerST : public VNCServer,
public Timer::Callback, public Timer::Callback,
@ -198,6 +197,8 @@ namespace rfb {
void handleClipboardAnnounceBinary(VNCSConnectionST* client, const unsigned num, void handleClipboardAnnounceBinary(VNCSConnectionST* client, const unsigned num,
const char mimes[][32]); const char mimes[][32]);
void refreshClients();
protected: protected:
friend class VNCSConnectionST; friend class VNCSConnectionST;

@ -1 +1 @@
Subproject commit 7e5a302a7a47472a679391ef24b18a78c936a9f6 Subproject commit 637651c2c99ecb7b1fe04a40aaacc7c34ad117f3

@ -49,6 +49,8 @@
extern "C" { extern "C" {
void vncSetGlueContext(int screenIndex); void vncSetGlueContext(int screenIndex);
extern int wakeuppipe[2];
} }
using namespace rfb; using namespace rfb;
@ -307,6 +309,13 @@ void XserverDesktop::handleSocketEvent(int fd, bool read, bool write)
{ {
try { try {
if (read) { if (read) {
if (fd == wakeuppipe[0]) {
unsigned char buf;
while (::read(fd, &buf, 1) > 0);
server->refreshClients();
return;
}
if (handleListenerEvent(fd, &listeners, server)) if (handleListenerEvent(fd, &listeners, server))
return; return;
} }

@ -17,8 +17,10 @@
* USA. * USA.
*/ */
#include <fcntl.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <unistd.h>
#include <errno.h> #include <errno.h>
#include <set> #include <set>
@ -49,6 +51,8 @@
extern "C" { extern "C" {
void vncSetGlueContext(int screenIndex); void vncSetGlueContext(int screenIndex);
int wakeuppipe[2];
} }
using namespace rfb; using namespace rfb;
@ -225,6 +229,11 @@ void vncExtensionInit(void)
dummyY < 16) dummyY < 16)
vncFatalError("Invalid value to %s", Server::maxVideoResolution.getName()); vncFatalError("Invalid value to %s", Server::maxVideoResolution.getName());
pipe(wakeuppipe);
const int flags = fcntl(wakeuppipe[0], F_GETFL, 0);
fcntl(wakeuppipe[0], F_SETFL, flags | O_NONBLOCK);
vncSetNotifyFd(wakeuppipe[0], 0, true, false);
initialised = true; initialised = true;
} }

Loading…
Cancel
Save