76 lines
2.4 KiB
C
76 lines
2.4 KiB
C
#define HOOK_NAME "recieve"
|
|
|
|
#include <dix-config.h>
|
|
|
|
#include <X11/Xmd.h>
|
|
|
|
#include "dix/extension_priv.h"
|
|
#include "dix/registry_priv.h"
|
|
#include "dix/resource_priv.h"
|
|
#include "Xext/xacestr.h"
|
|
#include "Xi/exglobals.h"
|
|
|
|
#include "namespace.h"
|
|
#include "hooks.h"
|
|
|
|
static inline Bool isRootWin(WindowPtr pWin) {
|
|
return (pWin->parent == NullWindow && dixClientForWindow(pWin) == serverClient);
|
|
}
|
|
|
|
void
|
|
hookReceive(CallbackListPtr *pcbl, void *unused, void *calldata)
|
|
{
|
|
XNS_HOOK_HEAD(XaceReceiveAccessRec);
|
|
struct XnamespaceClientPriv *obj = XnsClientPriv(dixClientForWindow(param->pWin));
|
|
|
|
// send and receive within same namespace permitted without restrictions
|
|
if (XnsClientSameNS(subj, obj))
|
|
goto pass;
|
|
|
|
for (int i=0; i<param->count; i++) {
|
|
const int type = param->events[i].u.u.type;
|
|
switch (type) {
|
|
case GenericEvent: {
|
|
xGenericEvent *gev = (xGenericEvent*)¶m->events[i].u;
|
|
if (gev->extension == EXTENSION_MAJOR_XINPUT) {
|
|
switch (gev->evtype) {
|
|
case XI_RawMotion:
|
|
if ((!subj->ns->allowMouseMotion) || !isRootWin(param->pWin))
|
|
goto reject;
|
|
continue;
|
|
case XI_RawKeyPress:
|
|
case XI_RawKeyRelease:
|
|
goto reject;
|
|
default:
|
|
XNS_HOOK_LOG("XI unknown %d\n", gev->evtype);
|
|
goto reject;
|
|
}
|
|
}
|
|
XNS_HOOK_LOG("BLOCKED #%d generic event extension=%d\n", i, gev->extension);
|
|
goto reject;
|
|
}
|
|
break;
|
|
|
|
default:
|
|
XNS_HOOK_LOG("BLOCKED event type #%d 0%0x 0%0x %s %s%s\n", i, type, param->events[i].u.u.detail,
|
|
LookupEventName(type), (type & 128) ? "fake" : "",
|
|
isRootWin(param->pWin) ? " (root window)" : "");
|
|
goto reject;
|
|
break;
|
|
}
|
|
}
|
|
|
|
pass:
|
|
return;
|
|
|
|
reject:
|
|
param->status = BadAccess;
|
|
XNS_HOOK_LOG("BLOCKED client %d [NS %s] receiving event sent to window 0x%lx of client %d [NS %s]\n",
|
|
client->index,
|
|
subj->ns->name,
|
|
(unsigned long)param->pWin->drawable.id,
|
|
dixClientForWindow(param->pWin)->index,
|
|
obj->ns->name);
|
|
return;
|
|
}
|