diff options
-rw-r--r-- | Xi/Makefile.am | 4 | ||||
-rw-r--r-- | Xi/chaccess.c | 158 | ||||
-rw-r--r-- | Xi/chaccess.h | 36 | ||||
-rw-r--r-- | Xi/extinit.c | 25 | ||||
-rw-r--r-- | Xi/qryacces.c | 121 | ||||
-rw-r--r-- | Xi/qryacces.h | 38 | ||||
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | dix/Makefile.am | 1 | ||||
-rw-r--r-- | dix/access.c | 315 | ||||
-rw-r--r-- | dix/dispatch.c | 1 | ||||
-rw-r--r-- | dix/events.c | 132 | ||||
-rw-r--r-- | include/input.h | 24 |
12 files changed, 70 insertions, 787 deletions
diff --git a/Xi/Makefile.am b/Xi/Makefile.am index 768f996cc..09dd41d0e 100644 --- a/Xi/Makefile.am +++ b/Xi/Makefile.am @@ -21,8 +21,6 @@ libXi_la_SOURCES = \ chgprop.h \ chgptr.c \ chgptr.h \ - chaccess.c \ - chaccess.h \ closedev.c \ closedev.h \ devbell.c \ @@ -68,8 +66,6 @@ libXi_la_SOURCES = \ querydp.h \ queryst.c \ queryst.h \ - qryacces.c \ - qryacces.h \ selectev.c \ selectev.h \ sendexev.c \ diff --git a/Xi/chaccess.c b/Xi/chaccess.c deleted file mode 100644 index a6798b793..000000000 --- a/Xi/chaccess.c +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright 2007-2008 Peter Hutterer - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Peter Hutterer, University of South Australia, NICTA - */ - -#define NEED_EVENTS -#define NEED_REPLIES -#ifdef HAVE_DIX_CONFIG_H -#include <dix-config.h> -#endif - -#include <X11/X.h> /* for inputstr.h */ -#include <X11/Xproto.h> /* Request macro */ -#include "inputstr.h" /* DeviceIntPtr */ -#include "windowstr.h" /* window structure */ -#include "scrnintstr.h" /* screen structure */ -#include <X11/extensions/XI.h> -#include <X11/extensions/XIproto.h> -#include "extnsionst.h" -#include "exevents.h" -#include "exglobals.h" - -#include "chaccess.h" - -/*********************************************************************** - * This procedure allows a client to change window access control. - */ - -int -SProcXChangeWindowAccess(ClientPtr client) -{ - char n; - REQUEST(xChangeWindowAccessReq); - - swaps(&stuff->length, n); - swapl(&stuff->win, n); - return ProcXChangeWindowAccess(client); -} - -int -ProcXChangeWindowAccess(ClientPtr client) -{ - int padding, rc, i; - XID* deviceids = NULL; - WindowPtr win; - DeviceIntPtr* perm_devices = NULL; - DeviceIntPtr* deny_devices = NULL; - REQUEST(xChangeWindowAccessReq); - REQUEST_AT_LEAST_SIZE(xChangeWindowAccessReq); - - - padding = (4 - (((stuff->npermit + stuff->ndeny) * sizeof(XID)) % 4)) % 4; - - if (stuff->length != ((sizeof(xChangeWindowAccessReq) + - (((stuff->npermit + stuff->ndeny) * sizeof(XID)) + padding)) >> 2)) - { - return BadLength; - } - - - rc = dixLookupWindow(&win, stuff->win, client, DixWriteAccess); - if (rc != Success) - { - return rc; - } - - /* Are we clearing? if so, ignore the rest */ - if (stuff->clear) - { - rc = ACClearWindowAccess(client, win, stuff->clear); - return rc; - } - - if (stuff->npermit || stuff->ndeny) - deviceids = (XID*)&stuff[1]; - - if (stuff->npermit) - { - perm_devices = - (DeviceIntPtr*)xalloc(stuff->npermit * sizeof(DeviceIntPtr)); - if (!perm_devices) - { - ErrorF("[Xi] ProcXChangeWindowAccess: alloc failure.\n"); - return BadImplementation; - } - - /* if one of the devices cannot be accessed, we don't do anything.*/ - for (i = 0; i < stuff->npermit; i++) - { - rc = dixLookupDevice(&perm_devices[i], deviceids[i], client, - DixWriteAccess); - if (rc != Success) - { - xfree(perm_devices); - return rc; - } - } - } - - if (stuff->ndeny) - { - deny_devices = - (DeviceIntPtr*)xalloc(stuff->ndeny * sizeof(DeviceIntPtr)); - if (!deny_devices) - { - ErrorF("[Xi] ProcXChangeWindowAccecss: alloc failure.\n"); - xfree(perm_devices); - return BadImplementation; - } - - for (i = 0; i < stuff->ndeny; i++) - { - rc = dixLookupDevice(&deny_devices[i], - deviceids[i+stuff->npermit], - client, - DixWriteAccess); - if (rc != Success) - { - xfree(perm_devices); - xfree(deny_devices); - return rc; - } - } - } - - rc = ACChangeWindowAccess(client, win, stuff->defaultRule, - perm_devices, stuff->npermit, - deny_devices, stuff->ndeny); - if (rc != Success) - { - return rc; - } - - xfree(perm_devices); - xfree(deny_devices); - return Success; -} - diff --git a/Xi/chaccess.h b/Xi/chaccess.h deleted file mode 100644 index baea69ca2..000000000 --- a/Xi/chaccess.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2007-2008 Peter Hutterer - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Peter Hutterer, University of South Australia, NICTA - */ - -#ifdef HAVE_DIX_CONFIG_H -#include <dix-config.h> -#endif - -#ifndef CHACCESS_H -#define CHACCESS_H 1 - -int SProcXChangeWindowAccess(ClientPtr /* client */); -int ProcXChangeWindowAccess(ClientPtr /* client */); - -#endif /* CHACCESS_H */ diff --git a/Xi/extinit.c b/Xi/extinit.c index e222de6ed..673a7ee15 100644 --- a/Xi/extinit.c +++ b/Xi/extinit.c @@ -76,7 +76,6 @@ SOFTWARE. /* modules local to Xi */ #include "allowev.h" -#include "chaccess.h" #include "chdevcur.h" #include "chgdctl.h" #include "chdevhier.h" @@ -105,7 +104,6 @@ SOFTWARE. #include "gtmotion.h" #include "listdev.h" #include "opendev.h" -#include "qryacces.h" #include "querydp.h" #include "queryst.h" #include "selectev.h" @@ -219,12 +217,10 @@ static int (*ProcIVector[])(ClientPtr) = { ProcXWarpDevicePointer, /* 41 */ ProcXChangeDeviceCursor, /* 42 */ ProcXChangeDeviceHierarchy, /* 43 */ - ProcXChangeWindowAccess, /* 44 */ - ProcXQueryWindowAccess, /* 45 */ - ProcXSetClientPointer, /* 46 */ - ProcXGetClientPointer, /* 47 */ - ProcXiSelectEvent, /* 48 */ - ProcXExtendedGrabDevice /* 49 */ + ProcXSetClientPointer, /* 44 */ + ProcXGetClientPointer, /* 45 */ + ProcXiSelectEvent, /* 46 */ + ProcXExtendedGrabDevice /* 47 */ }; /* For swapped clients */ @@ -273,12 +269,10 @@ static int (*SProcIVector[])(ClientPtr) = { SProcXWarpDevicePointer, /* 41 */ SProcXChangeDeviceCursor, /* 42 */ SProcXChangeDeviceHierarchy, /* 43 */ - SProcXChangeWindowAccess, /* 44 */ - SProcXQueryWindowAccess, /* 45 */ - SProcXSetClientPointer, /* 46 */ - SProcXGetClientPointer, /* 47 */ - SProcXiSelectEvent, /* 48 */ - SProcXExtendedGrabDevice /* 49 */ + SProcXSetClientPointer, /* 44 */ + SProcXGetClientPointer, /* 45 */ + SProcXiSelectEvent, /* 46 */ + SProcXExtendedGrabDevice /* 47 */ }; /***************************************************************** @@ -481,9 +475,6 @@ SReplyIDispatch(ClientPtr client, int len, xGrabDeviceReply * rep) else if (rep->RepType == X_QueryDevicePointer) SRepXQueryDevicePointer(client, len, (xQueryDevicePointerReply *) rep); - else if (rep->RepType == X_QueryWindowAccess) - SRepXQueryWindowAccess(client, len, - (xQueryWindowAccessReply*) rep); else if (rep->RepType == X_GetClientPointer) SRepXGetClientPointer(client, len, (xGetClientPointerReply*) rep); else if (rep->RepType == X_ExtendedGrabDevice) diff --git a/Xi/qryacces.c b/Xi/qryacces.c deleted file mode 100644 index 99221ea7e..000000000 --- a/Xi/qryacces.c +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright 2007-2008 Peter Hutterer - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Peter Hutterer, University of South Australia, NICTA - */ - -#define NEED_EVENTS -#define NEED_REPLIES -#ifdef HAVE_DIX_CONFIG_H -#include <dix-config.h> -#endif - -#include <X11/X.h> /* for inputstr.h */ -#include <X11/Xproto.h> /* Request macro */ -#include "inputstr.h" /* DeviceIntPtr */ -#include "windowstr.h" /* window structure */ -#include "scrnintstr.h" /* screen structure */ -#include <X11/extensions/XI.h> -#include <X11/extensions/XIproto.h> -#include "extnsionst.h" -#include "extinit.h" /* LookupDeviceIntRec */ -#include "exevents.h" -#include "exglobals.h" - -#include "qryacces.h" - -/*********************************************************************** - * This procedure allows a client to query window access control. - */ - -int -SProcXQueryWindowAccess(ClientPtr client) -{ - char n; - REQUEST(xQueryWindowAccessReq); - - swaps(&stuff->length, n); - swapl(&stuff->win, n); - return ProcXQueryWindowAccess(client); -} - -int -ProcXQueryWindowAccess(ClientPtr client) -{ - int rc; - WindowPtr win; - DeviceIntPtr *perm, *deny; - int nperm, ndeny, i; - int defaultRule; - XID* deviceids; - xQueryWindowAccessReply rep; - - REQUEST(xQueryWindowAccessReq); - REQUEST_SIZE_MATCH(xQueryWindowAccessReq); - - rc = dixLookupWindow(&win, stuff->win, client, DixReadAccess); - if (rc != Success) - { - return rc; - } - - ACQueryWindowAccess(win, &defaultRule, &perm, &nperm, &deny, &ndeny); - - rep.repType = X_Reply; - rep.RepType = X_QueryWindowAccess; - rep.sequenceNumber = client->sequence; - rep.length = ((nperm + ndeny) * sizeof(XID) + 3) >> 2; - rep.defaultRule = defaultRule; - rep.npermit = nperm; - rep.ndeny = ndeny; - WriteReplyToClient(client, sizeof(xQueryWindowAccessReply), &rep); - - if (nperm + ndeny) - { - deviceids = (XID*)xalloc((nperm + ndeny) * sizeof(XID)); - if (!deviceids) - { - ErrorF("[Xi] ProcXQueryWindowAccess: xalloc failure.\n"); - return BadImplementation; - } - - for (i = 0; i < nperm; i++) - deviceids[i] = perm[i]->id; - for (i = 0; i < ndeny; i++) - deviceids[i + nperm] = deny[i]->id; - - WriteToClient(client, (nperm + ndeny) * sizeof(XID), (char*)deviceids); - xfree(deviceids); - } - return Success; -} - -void -SRepXQueryWindowAccess(ClientPtr client, - int size, - xQueryWindowAccessReply* rep) -{ - char n; - swaps(&rep->sequenceNumber, n); - swapl(&rep->length, n); - WriteToClient(client, size, (char*)rep); -} diff --git a/Xi/qryacces.h b/Xi/qryacces.h deleted file mode 100644 index 238cdba9a..000000000 --- a/Xi/qryacces.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2007-2008 Peter Hutterer - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Peter Hutterer, University of South Australia, NICTA - */ - -#ifdef HAVE_DIX_CONFIG_H -#include <dix-config.h> -#endif - -#ifndef QRYACCES_H -#define QRYACCES_H 1 - -int SProcXQueryWindowAccess(ClientPtr /* client */); -int ProcXQueryWindowAccess(ClientPtr /* client */); -void SRepXQueryWindowAccess(ClientPtr /* client */, - int /* size */, - xQueryWindowAccessReply* /* rep */); -#endif diff --git a/configure.ac b/configure.ac index 138208dbd..e75e6d3ee 100644 --- a/configure.ac +++ b/configure.ac @@ -657,7 +657,7 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.la' XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la' dnl Core modules for most extensions, et al. -REQUIRED_MODULES="[randrproto >= 1.2] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.5] [kbproto >= 1.0.3]" +REQUIRED_MODULES="[randrproto >= 1.2] [renderproto >= 0.9.3] [fixesproto >= 4.0] [damageproto >= 1.1] xcmiscproto [xextproto >= 7.0.3] [xproto >= 7.0.13] [xtrans >= 1.2.2] bigreqsproto resourceproto fontsproto [inputproto >= 1.9.99.6] [kbproto >= 1.0.3]" REQUIRED_LIBS="xfont xau fontenc [pixman-1 >= 0.9.5]" dnl HAVE_DBUS is true if we actually have the D-Bus library, whereas diff --git a/dix/Makefile.am b/dix/Makefile.am index bdc2d4570..a4b48c82e 100644 --- a/dix/Makefile.am +++ b/dix/Makefile.am @@ -5,7 +5,6 @@ AM_CFLAGS = $(DIX_CFLAGS) \ -DVENDOR_RELEASE="@VENDOR_RELEASE@" libdix_la_SOURCES = \ - access.c \ atom.c \ colormap.c \ cursor.c \ diff --git a/dix/access.c b/dix/access.c deleted file mode 100644 index f71b3cc8b..000000000 --- a/dix/access.c +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright 2007-2008 Peter Hutterer - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice (including the next - * paragraph) shall be included in all copies or substantial portions of the - * Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - * DEALINGS IN THE SOFTWARE. - * - * Author: Peter Hutterer, University of South Australia, NICTA - */ - -/* This file controls the access control lists for each window. - * Each device can be explicitely allowed or denied access to a given window. - */ - -#ifdef HAVE_DIX_CONFIG_H -#include <dix-config.h> -#endif - -#include <X11/Xlib.h> -#include <X11/extensions/XI.h> -#include "exglobals.h" - -#include "input.h" -#include "inputstr.h" -#include "windowstr.h" - - -/* Only one single client can be responsible for window access control. */ -static ClientPtr ACClient = NULL; - - -/* Forward declarations */ -static void acReplaceList(DeviceIntPtr** list, - int* count, - DeviceIntPtr* devices, - int ndevices); - -/* Register global window access control client - * Return True on success or False otherwise. - */ - -Bool -ACRegisterClient(ClientPtr client) -{ - if (ACClient && ACClient != client) - return False; - - ACClient = client; - return True; -} - - -/* Unregister global client. If client is not the registered client, nothing - * happens and False is returned. If no client is registered, return True. - * Returns True if client was registred and is now unregistered. - */ - -Bool -ACUnregisterClient(ClientPtr client) -{ - if (ACClient && ACClient != client) - return False; - - ACClient = NULL; - return True; -} - -/* Clears all access control for the window and remove the default rule, - * depending on what is set. */ -int ACClearWindowAccess(ClientPtr client, - WindowPtr win, - int what) -{ - if (client != ACClient && client != wClient(win)) - return BadAccess; - - if (!win->optional) - { - /* we shouldn't get here if programmers know what they're doing. - * A client should not request to clear a window's access controls - * if they've never been set before anyway. If they do, do nothing and - * let the client figure out what to do next. - */ - return Success; - } - - if (what & WindowAccessClearPerm) - { - xfree(win->optional->access.perm); - win->optional->access.perm = NULL; - win->optional->access.nperm = 0; - } - - if (what & WindowAccessClearDeny) - { - xfree(win->optional->access.deny); - win->optional->access.deny = NULL; - win->optional->access.ndeny = 0; - } - - if (what & WindowAccessClearRule) - win->optional->access.defaultRule = WindowAccessNoRule; - - return Success; -} - -/* - * Changes window access control. - * - * Returns Success or BadAccess if the client is not allowed to change - * anything. - */ - -int -ACChangeWindowAccess(ClientPtr client, - WindowPtr win, - int defaultRule, - DeviceIntPtr* perm_devices, - int nperm, - DeviceIntPtr* deny_devices, - int ndeny) -{ - if (client != ACClient && client != wClient(win)) - return BadAccess; - - if (!win->optional && !MakeWindowOptional(win)) - { - ErrorF("[dix] ACChangeWindowAcccess: Failed to make window optional.\n"); - return BadImplementation; - } - - if (defaultRule != WindowAccessKeepRule) - win->optional->access.defaultRule = defaultRule; - - if (nperm) - { - acReplaceList(&win->optional->access.perm, - &win->optional->access.nperm, - perm_devices, nperm); - } - - if (ndeny) - { - acReplaceList(&win->optional->access.deny, - &win->optional->access.ndeny, - deny_devices, ndeny); - } - - return Success; -} - -static void -acReplaceList(DeviceIntPtr** list, - int* count, - DeviceIntPtr* devices, - int ndevices) -{ - xfree(*list); - *list = NULL; - *count = 0; - - if (ndevices) - { - *list = - xalloc(ndevices * sizeof(DeviceIntPtr*)); - if (!*list) - { - ErrorF("[dix] ACChangeWindowAccess: out of memory\n"); - return; - } - memcpy(*list, - devices, - ndevices * sizeof(DeviceIntPtr)); - *count = ndevices; - } - return; -} - -/* - * Query the given window for the devices allowed to access a window. - * The caller is responsible for freeing perm and deny. - */ -void -ACQueryWindowAccess(WindowPtr win, - int* defaultRule, - DeviceIntPtr** perm, - int* nperm, - DeviceIntPtr** deny, - int* ndeny) -{ - *defaultRule = WindowAccessNoRule; - *perm = NULL; - *nperm = 0; - *deny = NULL; - *ndeny = 0; - - if (!win->optional) - return; - - *defaultRule = win->optional->access.defaultRule; - - if (win->optional->access.nperm) - { - *nperm = win->optional->access.nperm; - *perm = (DeviceIntPtr*)xalloc(*nperm * sizeof(DeviceIntPtr)); - if (!*perm) - { - ErrorF("[dix] ACQuerywinAccess: xalloc failure\n"); - return; - } - memcpy(*perm, - win->optional->access.perm, - *nperm * sizeof(DeviceIntPtr)); - } - - if (win->optional->access.ndeny) - { - *ndeny = win->optional->access.ndeny; - *deny = (DeviceIntPtr*)xalloc(*ndeny * sizeof(DeviceIntPtr)); - if (!*deny) - { - ErrorF("[dix] ACQuerywinAccess: xalloc failure\n"); - return; - } - memcpy(*deny, - win->optional->access.deny, - *ndeny * sizeof(DeviceIntPtr)); - } -} - -/* - * Check if the given device is allowed to send events to the window. Returns - * true if device is allowed or false otherwise. - * - * Checks are done in the following order until a result is found: - * If the device is explicitely permitted, allow. - * If the window has a default of DenyAll, do not allow. - * If the device is explicitely denied, do not allow. - * If the window has a default of AllowAll, allow. - * Check parent window. Rinse, wash, repeat. - * If no rule could be found, allow. - */ -Bool -ACDeviceAllowed(WindowPtr win, DeviceIntPtr dev, xEvent* xE) -{ - int i; - - if (!win) /* happens for parent of RootWindow */ - return True; - - /* there's a number of events we don't care about */ - switch (xE->u.u.type) - { - case ButtonPress: - case ButtonRelease: - case MotionNotify: - case EnterNotify: - case LeaveNotify: - case KeyPress: - case KeyRelease: - break; - default: - if (xE->u.u.type == DeviceMotionNotify || - xE->u.u.type == DeviceButtonPress || - xE->u.u.type == DeviceButtonRelease || - xE->u.u.type == DeviceKeyPress || - xE->u.u.type == DeviceKeyRelease || - xE->u.u.type == DeviceEnterNotify || - xE->u.u.type == DeviceLeaveNotify) - { - break; - } - return True; - } - - - if (!win->optional) /* no list, check parent */ - return ACDeviceAllowed(win->parent, dev, xE); - - for (i = 0; i < win->optional->access.nperm; i++) - { - if (win->optional->access.perm[i]->id == dev->id) - return True; - } - - if (win->optional->access.defaultRule == WindowAccessDenyAll) - return False; - - for (i = 0; i < win->optional->access.ndeny; i++) - { - if (win->optional->access.deny[i]->id == dev->id) - return False; - } - - if (win->optional->access.defaultRule == WindowAccessAllowAll) - return True; - - return ACDeviceAllowed(win->parent, dev, xE); -} - diff --git a/dix/dispatch.c b/dix/dispatch.c index c4a6a9cf8..66f8f79ff 100644 --- a/dix/dispatch.c +++ b/dix/dispatch.c @@ -3375,7 +3375,6 @@ CloseDownClient(ClientPtr client) DeleteClientFromAnySelections(client); ReleaseActiveGrabs(client); DeleteClientFontStuff(client); - ACUnregisterClient(client); if (!really_close_down) { /* This frees resources that should never be retained diff --git a/dix/events.c b/dix/events.c index 35c1bface..dad786dd6 100644 --- a/dix/events.c +++ b/dix/events.c @@ -2030,13 +2030,6 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent this mask is the mask of the grab. */ int type = pEvents->u.u.type; - /* if a is denied, we return 0. This could cause the caller to - * traverse the parent. May be bad! (whot) */ - if (!ACDeviceAllowed(pWin, pDev, pEvents)) - { - return 0; - } - /* CantBeFiltered means only window owner gets the event */ if ((filter == CantBeFiltered) || (!(type & EXTENSION_EVENT_BASE) && type != GenericEvent)) @@ -3633,83 +3626,80 @@ DeliverGrabbedEvent(xEvent *xE, DeviceIntPtr thisDev, } if (!deliveries) { - if (ACDeviceAllowed(grab->window, thisDev, xE)) + if (xE->u.u.type == GenericEvent) { - if (xE->u.u.type == GenericEvent) - { - /* find evmask for event's extension */ - xGenericEvent* ge = ((xGenericEvent*)xE); - GenericMaskPtr gemask = grab->genericMasks; - - if (!gemask || !gemask->eventMask[GEEXTIDX(ge)]) - return; - - if (GEEventFill(xE)) - GEEventFill(xE)(ge, thisDev, grab->window, grab); - deliveries = TryClientEvents(rClient(grab), thisDev, xE, - count, gemask->eventMask[GEEXTIDX(ge)], - generic_filters[GEEXTIDX(ge)][ge->evtype], - grab); - } else - { - Mask mask = grab->eventMask; + /* find evmask for event's extension */ + xGenericEvent* ge = ((xGenericEvent*)xE); + GenericMaskPtr gemask = grab->genericMasks; - sendCore = (thisDev->isMaster && thisDev->coreEvents); - /* try core event */ - if (sendCore && grab->coreGrab) - { - core = *xE; - core.u.u.type = XItoCoreType(xE->u.u.type); - if(core.u.u.type) { - FixUpEventFromWindow(thisDev, &core, grab->window, - None, TRUE); - if (XaceHook(XACE_SEND_ACCESS, 0, thisDev, - grab->window, &core, 1) || - XaceHook(XACE_RECEIVE_ACCESS, rClient(grab), - grab->window, &core, 1)) - deliveries = 1; /* don't send, but pretend we did */ - else if (!IsInterferingGrab(rClient(grab), thisDev, - &core)) - { - deliveries = TryClientEvents(rClient(grab), thisDev, - &core, 1, mask, - filters[thisDev->id][core.u.u.type], - grab); - } - } - } + if (!gemask || !gemask->eventMask[GEEXTIDX(ge)]) + return; - if (!deliveries) - { - /* try XI event */ - if (grabinfo->fromPassiveGrab && - grabinfo->implicitGrab && - (xE->u.u.type & EXTENSION_EVENT_BASE)) - mask = grab->deviceMask; - FixUpEventFromWindow(thisDev, xE, grab->window, - None, TRUE); + if (GEEventFill(xE)) + GEEventFill(xE)(ge, thisDev, grab->window, grab); + deliveries = TryClientEvents(rClient(grab), thisDev, xE, + count, gemask->eventMask[GEEXTIDX(ge)], + generic_filters[GEEXTIDX(ge)][ge->evtype], + grab); + } else + { + Mask mask = grab->eventMask; + sendCore = (thisDev->isMaster && thisDev->coreEvents); + /* try core event */ + if (sendCore && grab->coreGrab) + { + core = *xE; + core.u.u.type = XItoCoreType(xE->u.u.type); + if(core.u.u.type) { + FixUpEventFromWindow(thisDev, &core, grab->window, + None, TRUE); if (XaceHook(XACE_SEND_ACCESS, 0, thisDev, - grab->window, xE, count) || + grab->window, &core, 1) || XaceHook(XACE_RECEIVE_ACCESS, rClient(grab), - grab->window, xE, count)) + grab->window, &core, 1)) deliveries = 1; /* don't send, but pretend we did */ - else + else if (!IsInterferingGrab(rClient(grab), thisDev, + &core)) { - deliveries = - TryClientEvents(rClient(grab), thisDev, - xE, count, - mask, - filters[thisDev->id][xE->u.u.type], - grab); + deliveries = TryClientEvents(rClient(grab), thisDev, + &core, 1, mask, + filters[thisDev->id][core.u.u.type], + grab); } + } + } + if (!deliveries) + { + /* try XI event */ + if (grabinfo->fromPassiveGrab && + grabinfo->implicitGrab && + (xE->u.u.type & EXTENSION_EVENT_BASE)) + mask = grab->deviceMask; + FixUpEventFromWindow(thisDev, xE, grab->window, + None, TRUE); + + if (XaceHook(XACE_SEND_ACCESS, 0, thisDev, + grab->window, xE, count) || + XaceHook(XACE_RECEIVE_ACCESS, rClient(grab), + grab->window, xE, count)) + deliveries = 1; /* don't send, but pretend we did */ + else + { + deliveries = + TryClientEvents(rClient(grab), thisDev, + xE, count, + mask, + filters[thisDev->id][xE->u.u.type], + grab); } + } - if (deliveries && (xE->u.u.type == MotionNotify - || xE->u.u.type == DeviceMotionNotify)) - thisDev->valuator->motionHintWindow = grab->window; } + if (deliveries && (xE->u.u.type == MotionNotify + || xE->u.u.type == DeviceMotionNotify)) + thisDev->valuator->motionHintWindow = grab->window; } if (deliveries && !deactivateGrab && (xE->u.u.type != MotionNotify && xE->u.u.type != DeviceMotionNotify)) diff --git a/include/input.h b/include/input.h index bf63f4bd0..0d348ec38 100644 --- a/include/input.h +++ b/include/input.h @@ -526,30 +526,6 @@ extern void DeepCopyDeviceClasses(DeviceIntPtr from, extern int EnterLeaveSemaphoresIsset(WindowPtr win); extern int FocusSemaphoresIsset(WindowPtr win); -/* Window/device based access control */ -extern Bool ACRegisterClient(ClientPtr client); -extern Bool ACUnregisterClient(ClientPtr client); -extern int ACClearWindowAccess(ClientPtr client, - WindowPtr win, - int what); -extern int ACChangeWindowAccess(ClientPtr client, - WindowPtr win, - int defaultRule, - DeviceIntPtr* perm_devices, - int npermit, - DeviceIntPtr* deny_devices, - int ndeny); -extern void ACQueryWindowAccess(WindowPtr win, - int* defaultRule, - DeviceIntPtr** perm, - int* nperm, - DeviceIntPtr** deny, - int* ndeny); - -extern Bool ACDeviceAllowed(WindowPtr win, - DeviceIntPtr dev, - xEvent* xE); - /* Implemented by the DDX. */ extern int NewInputDeviceRequest( InputOption *options, |