Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
8a32f72
GUACAMOLE-261: Add native SPICE protocol support (libguac-client-spice)
ciroiriarte Jun 29, 2026
a5110da
GUACAMOLE-261: Fix botched-merge build break in __guac_terminal_send_key
ciroiriarte Jun 30, 2026
c058240
GUACAMOLE-261: fix channel connection and add keyboard layout support
ciroiriarte Jun 30, 2026
57f45aa
GUACAMOLE-261: add proxy, TLS public-key pinning, and swap-red-blue p…
ciroiriarte Jun 30, 2026
2e6ba56
GUACAMOLE-261: add audio input (microphone) support via the record ch…
ciroiriarte Jun 30, 2026
542c841
GUACAMOLE-261: add native file transfer (shared-folder file browser)
ciroiriarte Jun 30, 2026
644d399
GUACAMOLE-261: add preferred-compression param and honor playback mute
ciroiriarte Jul 1, 2026
dc8322c
GUACAMOLE-261: match audio input format to what the SPICE record chan…
ciroiriarte Jul 2, 2026
e079e45
GUACAMOLE-261: add disable-audio-opus parameter
ciroiriarte Jul 2, 2026
c70e127
GUACAMOLE-261: clarify disable-audio-opus behavior in comments
ciroiriarte Jul 2, 2026
1ee9d1c
GUACAMOLE-261: fix keyboard lock-vs-modifier cost so shifted symbols …
ciroiriarte Jul 2, 2026
cc9b746
GUACAMOLE-261: marshal spice-gtk channel calls onto the event-loop th…
ciroiriarte Jul 2, 2026
4058cb6
GUACAMOLE-261: implement client-to-guest display resize
ciroiriarte Jul 2, 2026
61dd550
GUACAMOLE-261: enable the primary monitor before resizing so the gues…
ciroiriarte Jul 2, 2026
18dde7e
GUACAMOLE-261: force monitors-config send on resize so successive res…
ciroiriarte Jul 2, 2026
96fe364
GUACAMOLE-261: revert to update_display(...,update=TRUE) for resize
ciroiriarte Jul 2, 2026
0978423
GUACAMOLE-261: gate display resize on guest readiness and send determ…
ciroiriarte Jul 2, 2026
c7a4a1f
GUACAMOLE-261: re-check agent monitors-config capability on main-agen…
ciroiriarte Jul 2, 2026
9e15384
GUACAMOLE-261: deliver gated resize via update_display timer send
ciroiriarte Jul 2, 2026
e6124e6
GUACAMOLE-261: TEMP diagnostic - log send_monitor_config return + age…
ciroiriarte Jul 2, 2026
e18592c
GUACAMOLE-261: finalize gated resize send (drop diagnostic logging)
ciroiriarte Jul 3, 2026
6415740
GUACAMOLE-261: request efficient video codecs (H264/VP9/VP8) for stre…
ciroiriarte Jul 3, 2026
5e2e432
GUACAMOLE-261: make preferred video codec opt-in via preferred-video-…
ciroiriarte Jul 3, 2026
d848c80
GUACAMOLE-261: apply drive-read-only to the shared folder
ciroiriarte Jul 4, 2026
636c128
GUACAMOLE-261: add unit tests for the SPICE protocol module
ciroiriarte Jul 4, 2026
efc77ec
GUACAMOLE-288: Port the libguac multi-monitor primitive from upstream
ciroiriarte Jul 4, 2026
40323c1
GUACAMOLE-288: Implement multi-monitor support for SPICE
ciroiriarte Jul 4, 2026
4f0b836
GUACAMOLE-288: publish SPICE multimon-layout from guest-actual config
ciroiriarte Jul 5, 2026
f83670d
GUACAMOLE-288: debounce SPICE monitor-config sends to stop guest thrash
ciroiriarte Jul 5, 2026
e94da33
GUACAMOLE-261: add image clipboard support (closes #7, part 1)
ciroiriarte Jul 5, 2026
ca2947e
GUACAMOLE-261: support clipboard recording (closes #7, part 2)
ciroiriarte Jul 5, 2026
84828ea
GUACAMOLE-261: record guest-to-client clipboard and annotate directio…
ciroiriarte Jul 5, 2026
2a6ec2d
GUACAMOLE-261: add agent-based file upload via file-transfer-mode (cl…
ciroiriarte Jul 5, 2026
2c19618
GUACAMOLE-261: fix security findings F1-F4 from the #21 assessment
ciroiriarte Jul 6, 2026
1777093
GUACAMOLE-261: add guacclip, a clipboard-artifact extractor for sessi…
ciroiriarte Jul 8, 2026
79d366a
GUACAMOLE-261: guacclip --dedup flag and CUnit test suite (#27)
ciroiriarte Jul 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,14 @@ DIST_SUBDIRS = \
src/guacd \
src/guacenc \
src/guaclog \
src/guacclip \
src/pulse \
src/protocols/kubernetes \
src/protocols/rdp \
src/protocols/ssh \
src/protocols/telnet \
src/protocols/vnc
src/protocols/vnc \
src/protocols/spice

SUBDIRS = \
src/libguac \
Expand Down Expand Up @@ -77,6 +79,10 @@ if ENABLE_VNC
SUBDIRS += src/protocols/vnc
endif

if ENABLE_SPICE
SUBDIRS += src/protocols/spice
endif

if ENABLE_GUACD
SUBDIRS += src/guacd
endif
Expand All @@ -89,6 +95,10 @@ if ENABLE_GUACLOG
SUBDIRS += src/guaclog
endif

if ENABLE_GUACCLIP
SUBDIRS += src/guacclip
endif

EXTRA_DIST = \
.dockerignore \
CONTRIBUTING \
Expand Down
68 changes: 67 additions & 1 deletion configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,10 @@ AC_SUBST([LIBGUAC_CLIENT_KUBERNETES_INCLUDE], '-I$(top_srcdir)/src/protocols/kub
AC_SUBST([LIBGUAC_CLIENT_RDP_LTLIB], '$(top_builddir)/src/protocols/rdp/libguac-client-rdp.la')
AC_SUBST([LIBGUAC_CLIENT_RDP_INCLUDE], '-I$(top_srcdir)/src/protocols/rdp')

# SPICE support
AC_SUBST([LIBGUAC_CLIENT_SPICE_LTLIB], '$(top_builddir)/src/protocols/spice/libguac-client-spice.la')
AC_SUBST([LIBGUAC_CLIENT_SPICE_INCLUDE], '-I$(top_srcdir)/src/protocols/spice')

# Terminal emulator
AC_SUBST([TERMINAL_LTLIB], '$(top_builddir)/src/terminal/libguac-terminal.la')
AC_SUBST([TERMINAL_INCLUDE], '-I$(top_srcdir)/src/terminal $(PANGO_CFLAGS) $(PANGOCAIRO_CFLAGS) $(COMMON_INCLUDE)')
Expand Down Expand Up @@ -558,6 +562,45 @@ fi
AM_CONDITIONAL([ENABLE_VNC], [test "x${have_libvncserver}" = "xyes"])
AC_SUBST(VNC_LIBS)

#
# spice-gtk (SPICE protocol support)
#

have_spice=disabled
AC_ARG_WITH([spice],
[AS_HELP_STRING([--with-spice],
[support SPICE @<:@default=check@:>@])],
[],
[with_spice=check])

if test "x$with_spice" != "xno"
then
have_spice=yes

# libguac-client-spice is built against the GObject-based SPICE client
# library provided by spice-gtk. PKG_CHECK_MODULES automatically defines
# and AC_SUBSTs SPICE_CFLAGS and SPICE_LIBS.
PKG_CHECK_MODULES([SPICE], [spice-client-glib-2.0 >= 0.38],,
[have_spice=no])
fi

#
# Optional shared-folder (WebDAV) support for SPICE via libphodav
#

have_phodav=no
if test "x${have_spice}" = "xyes"
then
PKG_CHECK_MODULES([PHODAV], [libphodav-3.0],
[have_phodav=yes
AC_DEFINE([ENABLE_SPICE_WEBDAV],,
[Whether SPICE shared-folder (WebDAV) support via libphodav is enabled.])],
[have_phodav=no])
fi

AM_CONDITIONAL([ENABLE_SPICE], [test "x${have_spice}" = "xyes"])
AM_CONDITIONAL([ENABLE_SPICE_WEBDAV], [test "x${have_phodav}" = "xyes"])

#
# Repeater support within libVNCServer
#
Expand Down Expand Up @@ -1460,6 +1503,18 @@ AC_ARG_ENABLE([guaclog],

AM_CONDITIONAL([ENABLE_GUACLOG], [test "x${enable_guaclog}" = "xyes"])

#
# guacclip
#

AC_ARG_ENABLE([guacclip],
[AS_HELP_STRING([--disable-guacclip],
[do not build the Guacamole clipboard artifact extraction tool])],
[],
[enable_guacclip=yes])

AM_CONDITIONAL([ENABLE_GUACCLIP], [test "x${enable_guacclip}" = "xyes"])

#
# Output Makefiles
#
Expand All @@ -1482,14 +1537,19 @@ AC_CONFIG_FILES([Makefile
src/guacenc/man/guacenc.1
src/guaclog/Makefile
src/guaclog/man/guaclog.1
src/guacclip/Makefile
src/guacclip/tests/Makefile
src/guacclip/man/guacclip.1
src/pulse/Makefile
src/protocols/kubernetes/Makefile
src/protocols/kubernetes/tests/Makefile
src/protocols/rdp/Makefile
src/protocols/rdp/tests/Makefile
src/protocols/ssh/Makefile
src/protocols/telnet/Makefile
src/protocols/vnc/Makefile])
src/protocols/vnc/Makefile
src/protocols/spice/Makefile
src/protocols/spice/tests/Makefile])
AC_OUTPUT

#
Expand All @@ -1501,6 +1561,7 @@ AM_COND_IF([ENABLE_RDP], [build_rdp=yes], [build_rdp=no])
AM_COND_IF([ENABLE_SSH], [build_ssh=yes], [build_ssh=no])
AM_COND_IF([ENABLE_TELNET], [build_telnet=yes], [build_telnet=no])
AM_COND_IF([ENABLE_VNC], [build_vnc=yes], [build_vnc=no])
AM_COND_IF([ENABLE_SPICE], [build_spice=yes], [build_spice=no])

#
# Service / tool build status
Expand All @@ -1509,6 +1570,7 @@ AM_COND_IF([ENABLE_VNC], [build_vnc=yes], [build_vnc=no])
AM_COND_IF([ENABLE_GUACD], [build_guacd=yes], [build_guacd=no])
AM_COND_IF([ENABLE_GUACENC], [build_guacenc=yes], [build_guacenc=no])
AM_COND_IF([ENABLE_GUACLOG], [build_guaclog=yes], [build_guaclog=no])
AM_COND_IF([ENABLE_GUACCLIP], [build_guacclip=yes], [build_guacclip=no])

#
# Init scripts
Expand Down Expand Up @@ -1550,6 +1612,8 @@ $PACKAGE_NAME version $PACKAGE_VERSION
libswscale .......... ${have_libswscale}
libtelnet ........... ${have_libtelnet}
libVNCServer ........ ${have_libvncserver}
spice-gtk ........... ${have_spice}
libphodav ........... ${have_phodav}
libvorbis ........... ${have_vorbis}
libpulse ............ ${have_pulse}
libwebsockets ....... ${have_libwebsockets}
Expand All @@ -1563,12 +1627,14 @@ $PACKAGE_NAME version $PACKAGE_VERSION
SSH ........... ${build_ssh}
Telnet ........ ${build_telnet}
VNC ........... ${build_vnc}
SPICE ......... ${build_spice}

Services / tools:

guacd ...... ${build_guacd}
guacenc .... ${build_guacenc}
guaclog .... ${build_guaclog}
guacclip ... ${build_guacclip}

FreeRDP plugins: ${build_rdp_plugins}
Init scripts: ${build_init}
Expand Down
7 changes: 7 additions & 0 deletions src/guacclip/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@

# Compiled guacclip
guacclip
guacclip.exe

# Documentation (built from .in files)
man/guacclip.1
59 changes: 59 additions & 0 deletions src/guacclip/Makefile.am
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you 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.
#
# NOTE: Parts of this file (Makefile.am) are automatically transcluded verbatim
# into Makefile.in. Though the build system (GNU Autotools) automatically adds
# its own license boilerplate to the generated Makefile.in, that boilerplate
# does not apply to the transcluded portions of Makefile.am which are licensed
# to you by the ASF under the Apache License, Version 2.0, as described above.
#

AUTOMAKE_OPTIONS = foreign

SUBDIRS = . tests

bin_PROGRAMS = guacclip

man_MANS = \
man/guacclip.1

noinst_HEADERS = \
guacclip.h \
instructions.h \
interpret.h \
log.h \
sha256.h \
state.h

guacclip_SOURCES = \
guacclip.c \
instructions.c \
interpret.c \
log.c \
sha256.c \
state.c

guacclip_CFLAGS = \
-Werror -Wall \
@LIBGUAC_INCLUDE@

guacclip_LDADD = \
@LIBGUAC_LTLIB@

EXTRA_DIST = \
man/guacclip.1.in
Loading