mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-10-09 23:20:06 +02:00
.gitlab-ci
.reuse
LICENSES
docs
fuzzing
gio
completion
gdbus-2.0
inotify
kqueue
tests
cert-tests
de
desktop-files
gdbus-object-manager-example
modules
schema-tests
services
static-link
thumbnails
x-content
111_digit_test.gresource.xml
actions.c
appinfo-test-actions.desktop
appinfo-test-gnome.desktop.in
appinfo-test-notgnome.desktop.in
appinfo-test-path.desktop.in
appinfo-test-static.desktop
appinfo-test.c
appinfo-test.desktop.in
appinfo-test2.desktop.in
appinfo.c
application-command-line.c
appmonitor.c
apps.c
async-close-output-stream.c
async-splice-output-stream.c
autoptr.c
basic-application.c
buffered-input-stream.c
buffered-output-stream.c
cancellable.c
codegen.py
contenttype.c
contexts.c
converter-stream.c
converter.c
credentials.c
cxx.cpp
data-input-stream.c
data-output-stream.c
dbus-appinfo.c
dbus-launch.c
de.po
debugcontroller.c
defaultvalue.c
desktop-app-info.c
echo-server.c
empty.txt
enums.xml.template
error.c
fake-document-portal.c
fake-service-name.c
fdo-notification-backend.c
file-thumbnail.c
file.c
fileattributematcher.c
filter-cat.c
filter-streams.c
g-file-info-filesystem-readonly.c
g-file-info.c
g-file.c
g-icon.c
gapplication-example-actions.c
gapplication-example-cmdline.c
gapplication-example-cmdline2.c
gapplication-example-cmdline3.c
gapplication-example-cmdline4.c
gapplication-example-dbushooks.c
gapplication-example-open.c
gapplication.c
gdbus-address-get-session.c
gdbus-addresses.c
gdbus-auth.c
gdbus-bz627724.c
gdbus-close-pending.c
gdbus-connection-flush-helper.c
gdbus-connection-flush.c
gdbus-connection-loss.c
gdbus-connection-slow.c
gdbus-connection.c
gdbus-daemon.c
gdbus-error.c
gdbus-example-export.c
gdbus-example-objectmanager-client.c
gdbus-example-objectmanager-server.c
gdbus-example-own-name.c
gdbus-example-peer.c
gdbus-example-proxy-subclass.c
gdbus-example-server.c
gdbus-example-subtree.c
gdbus-example-unix-fd-client.c
gdbus-example-watch-name.c
gdbus-example-watch-proxy.c
gdbus-exit-on-close.c
gdbus-export.c
gdbus-introspection.c
gdbus-message.c
gdbus-method-invocation.c
gdbus-names.c
gdbus-non-socket.c
gdbus-overflow.c
gdbus-peer-object-manager.c
gdbus-peer.c
gdbus-proxy-threads.c
gdbus-proxy-unique-name.c
gdbus-proxy-well-known-name.c
gdbus-proxy.c
gdbus-sasl.c
gdbus-serialization.c
gdbus-server-auth.c
gdbus-sessionbus.c
gdbus-sessionbus.h
gdbus-subscribe.c
gdbus-test-codegen.c
gdbus-test-fixture.c
gdbus-tests.c
gdbus-tests.h
gdbus-testserver.c
gdbus-threading.c
gen-big-test-resource.py
gengiotypefuncs.py
gio-du.c
gio-tool.py
giomodule.c
glistmodel.c
gmenumodel.c
gnotification-server.c
gnotification-server.h
gnotification.c
gschema-compile.c
gsettings.c
gsocketclient-slow.c
gsubprocess-testprog.c
gsubprocess.c
gtesttlsbackend.c
gtesttlsbackend.h
gtlsconsoleinteraction.c
gtlsconsoleinteraction.h
httpd.c
inet-address.c
io-stream.c
live-g-file.c
live-g-file.txt
max-version.c
memory-input-stream.c
memory-monitor-dbus.py.in
memory-monitor-portal.py.in
memory-monitor.c
memory-output-stream.c
memory-settings-backend.c
meson.build
mimeapps.c
mock-resolver.c
mock-resolver.h
mount-operation.c
network-address.c
network-monitor-race.c
network-monitor.c
null-settings-backend.c
org.gtk.schemasourcecheck.gschema.xml
org.gtk.test.dbusappinfo.desktop
org.gtk.test.dbusappinfo.flatpak.desktop
org.gtk.test.gschema.override.orig
org.gtk.test.gschema.xml.orig
permission.c
pollable.c
portal-support-env-var.c
portal-support-flatpak-full.c
portal-support-flatpak-gsettings-only.c
portal-support-flatpak-network-only.c
portal-support-flatpak-none.c
portal-support-none.c
portal-support-snap-classic.c
portal-support-snap.c
portal-support-utils.c
portal-support-utils.h
power-profile-monitor-dbus.py.in
power-profile-monitor-portal.py.in
power-profile-monitor.c
proxy-test.c
proxy.c
readwrite.c
resolver-parsing.c
resolver.c
resourceplugin.c
resources.c
sandbox.c
send-data.c
simple-async-result.c
simple-proxy.c
sleepy-stream.c
slow-connect-preload.c
socket-address.c
socket-common.c
socket-listener.c
socket-service.c
socket-testclient.c
socket-testserver.c
socket.c
srvtarget.c
static-link.py
stream-rw_all.c
taptestrunner.py
task.c
test-codegen.xml
test-io-stream.c
test-io-stream.h
test-pipe-unix.c
test-pipe-unix.h
test.gresource.xml
test1.overlay
test1.txt
test2.gresource.xml
test2.txt
test3.gresource.xml
test3.txt
test4.gresource.xml
test5.gresource.xml
testenum.h
testfilemonitor.c
thumbnail-verification.c
tls-bindings.c
tls-certificate.c
tls-database.c
tls-interaction.c
trash.c
unix-fd.c
unix-mounts.c
unix-streams.c
vfs.c
volumemonitor.c
win32-appinfo.c
win32-streams.c
win32
xdgmime
data-to-c.py
dbus-daemon.xml
gaction.c
gaction.h
gactiongroup.c
gactiongroup.h
gactiongroupexporter.c
gactiongroupexporter.h
gactionmap.c
gactionmap.h
gappinfo.c
gappinfo.h
gappinfoprivate.h
gapplication-tool.c
gapplication.c
gapplication.h
gapplicationcommandline.c
gapplicationcommandline.h
gapplicationimpl-dbus.c
gapplicationimpl.h
gasynchelper.c
gasynchelper.h
gasyncinitable.c
gasyncinitable.h
gasyncresult.c
gasyncresult.h
gbufferedinputstream.c
gbufferedinputstream.h
gbufferedoutputstream.c
gbufferedoutputstream.h
gbytesicon.c
gbytesicon.h
gcancellable.c
gcancellable.h
gcharsetconverter.c
gcharsetconverter.h
gcocoanotificationbackend.m
gcontenttype-fdo.c
gcontenttype-osx.m
gcontenttype-win32.c
gcontenttype.c
gcontenttype.h
gcontenttypeprivate.h
gcontextspecificgroup.c
gcontextspecificgroup.h
gconverter.c
gconverter.h
gconverterinputstream.c
gconverterinputstream.h
gconverteroutputstream.c
gconverteroutputstream.h
gcredentials.c
gcredentials.h
gcredentialsprivate.h
gdatagrambased.c
gdatagrambased.h
gdatainputstream.c
gdatainputstream.h
gdataoutputstream.c
gdataoutputstream.h
gdbus-tool.c
gdbusactiongroup-private.h
gdbusactiongroup.c
gdbusactiongroup.h
gdbusaddress.c
gdbusaddress.h
gdbusauth.c
gdbusauth.h
gdbusauthmechanism.c
gdbusauthmechanism.h
gdbusauthmechanismanon.c
gdbusauthmechanismanon.h
gdbusauthmechanismexternal.c
gdbusauthmechanismexternal.h
gdbusauthmechanismsha1.c
gdbusauthmechanismsha1.h
gdbusauthobserver.c
gdbusauthobserver.h
gdbusconnection.c
gdbusconnection.h
gdbusdaemon.c
gdbusdaemon.h
gdbuserror.c
gdbuserror.h
gdbusinterface.c
gdbusinterface.h
gdbusinterfaceskeleton.c
gdbusinterfaceskeleton.h
gdbusintrospection.c
gdbusintrospection.h
gdbusmenumodel.c
gdbusmenumodel.h
gdbusmessage.c
gdbusmessage.h
gdbusmethodinvocation.c
gdbusmethodinvocation.h
gdbusnameowning.c
gdbusnameowning.h
gdbusnamewatching.c
gdbusnamewatching.h
gdbusobject.c
gdbusobject.h
gdbusobjectmanager.c
gdbusobjectmanager.h
gdbusobjectmanagerclient.c
gdbusobjectmanagerclient.h
gdbusobjectmanagerserver.c
gdbusobjectmanagerserver.h
gdbusobjectproxy.c
gdbusobjectproxy.h
gdbusobjectskeleton.c
gdbusobjectskeleton.h
gdbusprivate.c
gdbusprivate.h
gdbusproxy.c
gdbusproxy.h
gdbusserver.c
gdbusserver.h
gdbusutils.c
gdbusutils.h
gdebugcontroller.c
gdebugcontroller.h
gdebugcontrollerdbus.c
gdebugcontrollerdbus.h
gdelayedsettingsbackend.c
gdelayedsettingsbackend.h
gdesktopappinfo.c
gdesktopappinfo.h
gdocumentportal.c
gdocumentportal.h
gdrive.c
gdrive.h
gdtlsclientconnection.c
gdtlsclientconnection.h
gdtlsconnection.c
gdtlsconnection.h
gdtlsserverconnection.c
gdtlsserverconnection.h
gdummyfile.c
gdummyfile.h
gdummyproxyresolver.c
gdummyproxyresolver.h
gdummytlsbackend.c
gdummytlsbackend.h
gemblem.c
gemblem.h
gemblemedicon.c
gemblemedicon.h
gfdonotificationbackend.c
gfile.c
gfile.h
gfileattribute-priv.h
gfileattribute.c
gfileattribute.h
gfiledescriptorbased.c
gfiledescriptorbased.h
gfileenumerator.c
gfileenumerator.h
gfileicon.c
gfileicon.h
gfileinfo-priv.h
gfileinfo.c
gfileinfo.h
gfileinputstream.c
gfileinputstream.h
gfileiostream.c
gfileiostream.h
gfilemonitor.c
gfilemonitor.h
gfilenamecompleter.c
gfilenamecompleter.h
gfileoutputstream.c
gfileoutputstream.h
gfilterinputstream.c
gfilterinputstream.h
gfilteroutputstream.c
gfilteroutputstream.h
ggtknotificationbackend.c
ghttpproxy.c
ghttpproxy.h
gicon.c
gicon.h
ginetaddress.c
ginetaddress.h
ginetaddressmask.c
ginetaddressmask.h
ginetsocketaddress.c
ginetsocketaddress.h
ginitable.c
ginitable.h
ginputstream.c
ginputstream.h
gio-autocleanups.h
gio-launch-desktop.c
gio-querymodules.c
gio-tool-cat.c
gio-tool-copy.c
gio-tool-info.c
gio-tool-launch.c
gio-tool-list.c
gio-tool-mime.c
gio-tool-mkdir.c
gio-tool-monitor.c
gio-tool-mount.c
gio-tool-move.c
gio-tool-open.c
gio-tool-remove.c
gio-tool-rename.c
gio-tool-save.c
gio-tool-set.c
gio-tool-trash.c
gio-tool-tree.c
gio-tool.c
gio-tool.h
gio.h
gio.rc.in
gio.stp.in
gio_probes.d
gio_trace.h
gioenums.h
gioenumtypes.c.template
gioenumtypes.h.template
gioerror.c
gioerror.h
giomodule-priv.c
giomodule-priv.h
giomodule.c
giomodule.h
gioprivate.h
gioscheduler.c
gioscheduler.h
giostream.c
giostream.h
giotypes.h
giounix-private.c
giounix-private.h
giowin32-afunix.h
giowin32-priv.h
giowin32-private.c
gkeyfilesettingsbackend.c
glib-compile-resources.c
glib-compile-schemas.c
glistmodel.c
glistmodel.h
gliststore.c
gliststore.h
gloadableicon.c
gloadableicon.h
glocalfile.c
glocalfile.h
glocalfileenumerator.c
glocalfileenumerator.h
glocalfileinfo.c
glocalfileinfo.h
glocalfileinputstream.c
glocalfileinputstream.h
glocalfileiostream.c
glocalfileiostream.h
glocalfilemonitor.c
glocalfilemonitor.h
glocalfileoutputstream.c
glocalfileoutputstream.h
glocalvfs.c
glocalvfs.h
gmarshal-internal.c
gmarshal-internal.h
gmarshal-internal.list
gmemoryinputstream.c
gmemoryinputstream.h
gmemorymonitor.c
gmemorymonitor.h
gmemorymonitordbus.c
gmemorymonitordbus.h
gmemorymonitorportal.c
gmemorymonitorportal.h
gmemorymonitorwin32.c
gmemoryoutputstream.c
gmemoryoutputstream.h
gmemorysettingsbackend.c
gmenu.c
gmenu.h
gmenuexporter.c
gmenuexporter.h
gmenumodel.c
gmenumodel.h
gmount.c
gmount.h
gmountoperation.c
gmountoperation.h
gmountprivate.h
gnativesocketaddress.c
gnativesocketaddress.h
gnativevolumemonitor.c
gnativevolumemonitor.h
gnetworkaddress.c
gnetworkaddress.h
gnetworking.c
gnetworking.h.in
gnetworkingprivate.h
gnetworkmonitor.c
gnetworkmonitor.h
gnetworkmonitorbase.c
gnetworkmonitorbase.h
gnetworkmonitornetlink.c
gnetworkmonitornetlink.h
gnetworkmonitornm.c
gnetworkmonitornm.h
gnetworkmonitorportal.c
gnetworkmonitorportal.h
gnetworkservice.c
gnetworkservice.h
gnextstepsettingsbackend.m
gnotification-private.h
gnotification.c
gnotification.h
gnotificationbackend.c
gnotificationbackend.h
gnullsettingsbackend.c
gopenuriportal.c
gopenuriportal.h
gosxappinfo.h
gosxappinfo.m
gosxnetworkmonitor.c
gosxnetworkmonitor.h
goutputstream.c
goutputstream.h
gpermission.c
gpermission.h
gpollableinputstream.c
gpollableinputstream.h
gpollableoutputstream.c
gpollableoutputstream.h
gpollableutils.c
gpollableutils.h
gpollfilemonitor.c
gpollfilemonitor.h
gportalnotificationbackend.c
gportalsupport.c
gportalsupport.h
gpowerprofilemonitor.c
gpowerprofilemonitor.h
gpowerprofilemonitordbus.c
gpowerprofilemonitordbus.h
gpowerprofilemonitorportal.c
gpowerprofilemonitorportal.h
gpropertyaction.c
gpropertyaction.h
gproxy.c
gproxy.h
gproxyaddress.c
gproxyaddress.h
gproxyaddressenumerator.c
gproxyaddressenumerator.h
gproxyresolver.c
gproxyresolver.h
gproxyresolverportal.c
gproxyresolverportal.h
gregistrysettingsbackend.c
gregistrysettingsbackend.h
gremoteactiongroup.c
gremoteactiongroup.h
gresolver.c
gresolver.h
gresource-tool.c
gresource.c
gresource.dtd
gresource.h
gresourcefile.c
gresourcefile.h
gsandbox.c
gsandbox.h
gschema.dtd
gschema.its
gschema.loc
gseekable.c
gseekable.h
gsettings-mapping.c
gsettings-mapping.h
gsettings-tool.c
gsettings.c
gsettings.h
gsettingsbackend.c
gsettingsbackend.h
gsettingsbackendinternal.h
gsettingsschema-internal.h
gsettingsschema.c
gsettingsschema.h
gsimpleaction.c
gsimpleaction.h
gsimpleactiongroup.c
gsimpleactiongroup.h
gsimpleasyncresult.c
gsimpleasyncresult.h
gsimpleiostream.c
gsimpleiostream.h
gsimplepermission.c
gsimplepermission.h
gsimpleproxyresolver.c
gsimpleproxyresolver.h
gsocket.c
gsocket.h
gsocketaddress.c
gsocketaddress.h
gsocketaddressenumerator.c
gsocketaddressenumerator.h
gsocketclient.c
gsocketclient.h
gsocketconnectable.c
gsocketconnectable.h
gsocketconnection.c
gsocketconnection.h
gsocketcontrolmessage.c
gsocketcontrolmessage.h
gsocketinputstream.c
gsocketinputstream.h
gsocketlistener.c
gsocketlistener.h
gsocketoutputstream.c
gsocketoutputstream.h
gsocketservice.c
gsocketservice.h
gsocks4aproxy.c
gsocks4aproxy.h
gsocks4proxy.c
gsocks4proxy.h
gsocks5proxy.c
gsocks5proxy.h
gsrvtarget.c
gsrvtarget.h
gsubprocess.c
gsubprocess.h
gsubprocesslauncher-private.h
gsubprocesslauncher.c
gsubprocesslauncher.h
gtask.c
gtask.h
gtcpconnection.c
gtcpconnection.h
gtcpwrapperconnection.c
gtcpwrapperconnection.h
gtestdbus.c
gtestdbus.h
gthemedicon.c
gthemedicon.h
gthreadedresolver-private.h
gthreadedresolver.c
gthreadedresolver.h
gthreadedsocketservice.c
gthreadedsocketservice.h
gtlsbackend.c
gtlsbackend.h
gtlscertificate.c
gtlscertificate.h
gtlsclientconnection.c
gtlsclientconnection.h
gtlsconnection.c
gtlsconnection.h
gtlsdatabase.c
gtlsdatabase.h
gtlsfiledatabase.c
gtlsfiledatabase.h
gtlsinteraction.c
gtlsinteraction.h
gtlspassword.c
gtlspassword.h
gtlsserverconnection.c
gtlsserverconnection.h
gtrashportal.c
gtrashportal.h
gunionvolumemonitor.c
gunionvolumemonitor.h
gunixconnection.c
gunixconnection.h
gunixcredentialsmessage.c
gunixcredentialsmessage.h
gunixfdlist.c
gunixfdlist.h
gunixfdmessage.c
gunixfdmessage.h
gunixinputstream.c
gunixinputstream.h
gunixmount.c
gunixmount.h
gunixmounts.c
gunixmounts.h
gunixoutputstream.c
gunixoutputstream.h
gunixsocketaddress.c
gunixsocketaddress.h
gunixvolume.c
gunixvolume.h
gunixvolumemonitor.c
gunixvolumemonitor.h
gvfs.c
gvfs.h
gvolume.c
gvolume.h
gvolumemonitor.c
gvolumemonitor.h
gwin32api-application-activation-manager.h
gwin32api-iterator.h
gwin32api-misc.h
gwin32api-package.h
gwin32api-storage.h
gwin32appinfo.c
gwin32appinfo.h
gwin32file-sync-stream.c
gwin32file-sync-stream.h
gwin32inputstream.c
gwin32inputstream.h
gwin32mount.c
gwin32mount.h
gwin32networkmonitor.c
gwin32networkmonitor.h
gwin32notificationbackend.c
gwin32outputstream.c
gwin32outputstream.h
gwin32packageparser.c
gwin32packageparser.h
gwin32registrykey.c
gwin32registrykey.h
gwin32sid.c
gwin32sid.h
gwin32volumemonitor.c
gwin32volumemonitor.h
gzlibcompressor.c
gzlibcompressor.h
gzlibdecompressor.c
gzlibdecompressor.h
meson.build
org.freedesktop.portal.Documents.xml
org.freedesktop.portal.OpenURI.xml
org.freedesktop.portal.ProxyResolver.xml
org.freedesktop.portal.Trash.xml
strinfo.c
thumbnail-verify.c
thumbnail-verify.h
girepository
glib
gmodule
gobject
gthread
m4macros
po
subprojects
tests
tools
.clang-format
.dir-locals.el
.editorconfig
.gitignore
.gitlab-ci.yml
.gitmodules
.lcovrc
CODE_OF_CONDUCT.md
CONTRIBUTING.md
COPYING
INSTALL.md
NEWS
README.md
SECURITY.md
glib.doap
meson.build
meson.options
Instead of using a GDBusConnection, this does the handshake at a lower level using specific strings in the SASL handshake, to verify that we will interoperate with various clients including sd-bus, libdbus and older versions of GDBus. Signed-off-by: Simon McVittie <smcv@collabora.com>
335 lines
9.8 KiB
C
335 lines
9.8 KiB
C
/*
|
|
* Copyright 2019-2022 Collabora Ltd.
|
|
*
|
|
* SPDX-License-Identifier: LGPL-2.1-or-later
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General
|
|
* Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "config.h"
|
|
|
|
#include <errno.h>
|
|
#include <locale.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <glib.h>
|
|
#include <glib/gstdio.h>
|
|
#include <gio/gio.h>
|
|
|
|
/* For G_CREDENTIALS_*_SUPPORTED */
|
|
#include <gio/gcredentialsprivate.h>
|
|
|
|
static const char * const explicit_external_initial_response_fail[] =
|
|
{
|
|
"EXTERNAL with incorrect initial response",
|
|
"C:AUTH EXTERNAL <wrong-uid>",
|
|
"S:REJECTED.*$",
|
|
NULL
|
|
};
|
|
|
|
static const char * const explicit_external_fail[] =
|
|
{
|
|
"EXTERNAL without initial response, failing to authenticate",
|
|
"C:AUTH EXTERNAL",
|
|
"S:DATA$",
|
|
"C:DATA <wrong-uid>",
|
|
"S:REJECTED.*$",
|
|
NULL
|
|
};
|
|
|
|
#if defined(G_CREDENTIALS_SOCKET_GET_CREDENTIALS_SUPPORTED) || defined(G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED)
|
|
static const char * const explicit_external_initial_response[] =
|
|
{
|
|
"EXTERNAL with initial response",
|
|
/* This is what most older D-Bus libraries do. */
|
|
"C:AUTH EXTERNAL <uid>", /* I claim to be <uid> */
|
|
"S:OK [0-9a-f]+$",
|
|
NULL
|
|
};
|
|
|
|
static const char * const explicit_external[] =
|
|
{
|
|
"EXTERNAL without initial response",
|
|
/* In theory this is equally valid, although many D-Bus libraries
|
|
* probably don't support it correctly. */
|
|
"C:AUTH EXTERNAL", /* Start EXTERNAL, no initial response */
|
|
"S:DATA$", /* Who are you? */
|
|
"C:DATA <uid>", /* I claim to be <uid> */
|
|
"S:OK [0-9a-f]+$",
|
|
NULL
|
|
};
|
|
|
|
static const char * const implicit_external[] =
|
|
{
|
|
"EXTERNAL with empty authorization identity",
|
|
/* This is what sd-bus does. */
|
|
"C:AUTH EXTERNAL", /* Start EXTERNAL, no initial response */
|
|
"S:DATA$", /* Who are you? */
|
|
"C:DATA", /* I'm whoever the kernel says I am */
|
|
"S:OK [0-9a-f]+$",
|
|
NULL
|
|
};
|
|
|
|
static const char * const implicit_external_space[] =
|
|
{
|
|
"EXTERNAL with empty authorization identity and whitespace",
|
|
/* GDBus used to represent empty data blocks like this, although it
|
|
* isn't interoperable to do so (in particular sd-bus would reject this). */
|
|
"C:AUTH EXTERNAL", /* Start EXTERNAL, no initial response */
|
|
"S:DATA$", /* Who are you? */
|
|
"C:DATA ", /* I'm whoever the kernel says I am */
|
|
"S:OK [0-9a-f]+$",
|
|
NULL
|
|
};
|
|
#endif
|
|
|
|
static const char * const * const handshakes[] =
|
|
{
|
|
explicit_external_initial_response_fail,
|
|
explicit_external_fail,
|
|
#if defined(G_CREDENTIALS_SOCKET_GET_CREDENTIALS_SUPPORTED) || defined(G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED)
|
|
explicit_external_initial_response,
|
|
explicit_external,
|
|
implicit_external,
|
|
implicit_external_space,
|
|
#endif
|
|
};
|
|
|
|
static void
|
|
encode_uid (guint uid,
|
|
GString *dest)
|
|
{
|
|
gchar *str = g_strdup_printf ("%u", uid);
|
|
gchar *p;
|
|
|
|
g_string_assign (dest, "");
|
|
|
|
for (p = str; *p != '\0'; p++)
|
|
g_string_append_printf (dest, "%02x", (unsigned char) *p);
|
|
|
|
g_free (str);
|
|
}
|
|
|
|
typedef struct
|
|
{
|
|
GCond cond;
|
|
GMutex mutex;
|
|
GDBusServerFlags server_flags;
|
|
GMainContext *ctx;
|
|
GMainLoop *loop;
|
|
gchar *guid;
|
|
gchar *listenable_address;
|
|
gboolean ready;
|
|
} ServerInfo;
|
|
|
|
static gboolean
|
|
idle_in_server_thread_cb (gpointer user_data)
|
|
{
|
|
ServerInfo *info = user_data;
|
|
|
|
g_mutex_lock (&info->mutex);
|
|
info->ready = TRUE;
|
|
g_cond_broadcast (&info->cond);
|
|
g_mutex_unlock (&info->mutex);
|
|
return G_SOURCE_REMOVE;
|
|
}
|
|
|
|
static gpointer
|
|
server_thread_cb (gpointer user_data)
|
|
{
|
|
GDBusServer *server = NULL;
|
|
GError *error = NULL;
|
|
GSource *source;
|
|
ServerInfo *info = user_data;
|
|
|
|
g_main_context_push_thread_default (info->ctx);
|
|
server = g_dbus_server_new_sync (info->listenable_address,
|
|
info->server_flags,
|
|
info->guid,
|
|
NULL,
|
|
NULL,
|
|
&error);
|
|
g_assert_no_error (error);
|
|
g_assert_nonnull (server);
|
|
g_dbus_server_start (server);
|
|
|
|
/* Tell the main thread when the server is ready to accept connections */
|
|
source = g_idle_source_new ();
|
|
g_source_set_callback (source, idle_in_server_thread_cb, info, NULL);
|
|
g_source_attach (source, info->ctx);
|
|
g_source_unref (source);
|
|
|
|
g_main_loop_run (info->loop);
|
|
|
|
g_main_context_pop_thread_default (info->ctx);
|
|
g_dbus_server_stop (server);
|
|
g_clear_object (&server);
|
|
return NULL;
|
|
}
|
|
|
|
static void
|
|
test_sasl_server (void)
|
|
{
|
|
GError *error = NULL;
|
|
GSocketAddress *addr = NULL;
|
|
GString *buf = g_string_new ("");
|
|
GString *encoded_uid = g_string_new ("");
|
|
GString *encoded_wrong_uid = g_string_new ("");
|
|
GThread *server_thread = NULL;
|
|
ServerInfo info =
|
|
{
|
|
.server_flags = G_DBUS_SERVER_FLAGS_RUN_IN_THREAD,
|
|
};
|
|
gchar *escaped = NULL;
|
|
gchar *path = NULL;
|
|
gchar *tmpdir = NULL;
|
|
gsize i;
|
|
|
|
tmpdir = g_dir_make_tmp ("gdbus-server-auth-XXXXXX", &error);
|
|
g_assert_no_error (error);
|
|
escaped = g_dbus_address_escape_value (tmpdir);
|
|
|
|
path = g_build_filename (tmpdir, "socket", NULL);
|
|
g_cond_init (&info.cond);
|
|
g_mutex_init (&info.mutex);
|
|
info.ctx = g_main_context_new ();
|
|
info.guid = g_dbus_generate_guid ();
|
|
info.listenable_address = g_strdup_printf ("unix:path=%s/socket", escaped);
|
|
info.loop = g_main_loop_new (info.ctx, FALSE);
|
|
info.ready = FALSE;
|
|
server_thread = g_thread_new ("GDBusServer", server_thread_cb, &info);
|
|
|
|
g_mutex_lock (&info.mutex);
|
|
|
|
while (!info.ready)
|
|
g_cond_wait (&info.cond, &info.mutex);
|
|
|
|
g_mutex_unlock (&info.mutex);
|
|
|
|
addr = g_unix_socket_address_new (path);
|
|
|
|
encode_uid (geteuid (), encoded_uid);
|
|
encode_uid (geteuid () == 0 ? 65534 : 0, encoded_wrong_uid);
|
|
|
|
for (i = 0; i < G_N_ELEMENTS (handshakes); i++)
|
|
{
|
|
const char * const *handshake = handshakes[i];
|
|
GSocketClient *client;
|
|
GSocketConnection *conn;
|
|
GUnixConnection *conn_unix; /* unowned */
|
|
GInputStream *istream; /* unowned */
|
|
GDataInputStream *istream_data;
|
|
GOutputStream *ostream; /* unowned */
|
|
GError *error = NULL;
|
|
gsize j;
|
|
|
|
g_test_message ("New handshake: %s", handshake[0]);
|
|
|
|
client = g_socket_client_new ();
|
|
conn = g_socket_client_connect (client, G_SOCKET_CONNECTABLE (addr),
|
|
NULL, &error);
|
|
g_assert_no_error (error);
|
|
|
|
g_assert_true (G_IS_UNIX_CONNECTION (conn));
|
|
conn_unix = G_UNIX_CONNECTION (conn);
|
|
istream = g_io_stream_get_input_stream (G_IO_STREAM (conn));
|
|
ostream = g_io_stream_get_output_stream (G_IO_STREAM (conn));
|
|
istream_data = g_data_input_stream_new (istream);
|
|
g_data_input_stream_set_newline_type (istream_data, G_DATA_STREAM_NEWLINE_TYPE_CR_LF);
|
|
|
|
g_unix_connection_send_credentials (conn_unix, NULL, &error);
|
|
g_assert_no_error (error);
|
|
|
|
for (j = 1; handshake[j] != NULL; j++)
|
|
{
|
|
if (j % 2 == 1)
|
|
{
|
|
/* client to server */
|
|
const char *line = handshake[j];
|
|
|
|
g_assert_cmpint (line[0], ==, 'C');
|
|
g_assert_cmpint (line[1], ==, ':');
|
|
g_string_assign (buf, line + 2);
|
|
g_string_replace (buf, "<uid>", encoded_uid->str, 0);
|
|
g_string_replace (buf, "<wrong-uid>", encoded_wrong_uid->str, 0);
|
|
g_test_message ("C:“%s”", buf->str);
|
|
g_string_append (buf, "\r\n");
|
|
|
|
g_output_stream_write_all (ostream, buf->str, buf->len, NULL, NULL, &error);
|
|
g_assert_no_error (error);
|
|
}
|
|
else
|
|
{
|
|
/* server to client */
|
|
const char *pattern = handshake[j];
|
|
char *line;
|
|
gsize len;
|
|
|
|
g_assert_cmpint (pattern[0], ==, 'S');
|
|
g_assert_cmpint (pattern[1], ==, ':');
|
|
|
|
g_test_message ("Expect: /^%s/", pattern + 2);
|
|
line = g_data_input_stream_read_line (istream_data, &len, NULL, &error);
|
|
g_assert_no_error (error);
|
|
g_test_message ("S:“%s”", line);
|
|
g_assert_cmpuint (len, ==, strlen (line));
|
|
|
|
if (!g_regex_match_simple (pattern + 2, line,
|
|
G_REGEX_ANCHORED,
|
|
G_REGEX_MATCH_ANCHORED))
|
|
g_error ("Expected /^%s/, got “%s”", pattern + 2, line);
|
|
|
|
g_free (line);
|
|
}
|
|
}
|
|
|
|
g_object_unref (istream_data);
|
|
g_object_unref (conn);
|
|
g_object_unref (client);
|
|
}
|
|
|
|
g_main_loop_quit (info.loop);
|
|
g_thread_join (server_thread);
|
|
|
|
if (tmpdir != NULL)
|
|
g_assert_no_errno (g_rmdir (tmpdir));
|
|
|
|
g_clear_pointer (&info.ctx, g_main_context_unref);
|
|
g_clear_pointer (&info.loop, g_main_loop_unref);
|
|
g_clear_object (&addr);
|
|
g_string_free (buf, TRUE);
|
|
g_string_free (encoded_uid, TRUE);
|
|
g_string_free (encoded_wrong_uid, TRUE);
|
|
g_free (escaped);
|
|
g_free (info.guid);
|
|
g_free (info.listenable_address);
|
|
g_free (path);
|
|
g_free (tmpdir);
|
|
g_cond_clear (&info.cond);
|
|
g_mutex_clear (&info.mutex);
|
|
}
|
|
|
|
int
|
|
main (int argc,
|
|
char *argv[])
|
|
{
|
|
setlocale (LC_ALL, "");
|
|
g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL);
|
|
|
|
g_test_add_func ("/gdbus/sasl/server", test_sasl_server);
|
|
|
|
return g_test_run();
|
|
}
|