tsolinfo.h revision 1379
493N/A/*
493N/A * Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved.
493N/A *
1437N/A * Permission is hereby granted, free of charge, to any person obtaining a
493N/A * copy of this software and associated documentation files (the "Software"),
493N/A * to deal in the Software without restriction, including without limitation
919N/A * the rights to use, copy, modify, merge, publish, distribute, sublicense,
919N/A * and/or sell copies of the Software, and to permit persons to whom the
919N/A * Software is furnished to do so, subject to the following conditions:
919N/A *
919N/A * The above copyright notice and this permission notice (including the next
919N/A * paragraph) shall be included in all copies or substantial portions of the
919N/A * Software.
919N/A *
919N/A * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
919N/A * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
919N/A * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
919N/A * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
919N/A * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
919N/A * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
919N/A * DEALINGS IN THE SOFTWARE.
919N/A */
919N/A
493N/A
493N/A
493N/A#ifndef _TSOL_INFO_H
1003N/A#define _TSOL_INFO_H
1003N/A
1003N/A#include <sys/types.h>
493N/A
493N/A#include <tsol/label.h>
493N/A#include <sys/tsol/tndb.h>
967N/A#include <bsm/audit.h>
967N/A#include <sys/mkdev.h>
1423N/A#include <ucred.h>
967N/A#include "misc.h"
705N/A#include "dixstruct.h"
967N/A#include "selection.h"
493N/A#include "globals.h"
1422N/A#include <X11/keysym.h>
493N/A
851N/A/*********************************
1437N/A *
851N/A * DEBUG INFO
1437N/A *
1437N/A *********************************/
493N/A
810N/A/* Message verbosity levels passed to os/log.c functions
810N/A * Level 0 messages are printed by all servers to stderr.
810N/A * Xorg defaults to logging messages in 0-3 to /var/log/Xorg.<display>.log
606N/A * Ranges of messages to print to stderr can be changed with Xorg -verbose N
810N/A * and Xephyr -verbosity N
810N/A * Ranges of messages to print to log can be changed with Xorg -logverbose N
967N/A * Other servers don't support runtime configuration of log messages yet.
606N/A */
606N/A
851N/A#define TSOL_MSG_ERROR 0 /* Always printed */
606N/A#define TSOL_MSG_WARNING 4
606N/A#define TSOL_MSG_POLICY_DENIED 5
606N/A#define TSOL_MSG_UNIMPLEMENTED 6
606N/A#define TSOL_MSG_ACCESS_TRACE 7
606N/A
606N/A#define TSOL_LOG_PREFIX TSOLNAME ": "
606N/Aextern const char *TsolDixAccessModeNameString(Mask access_mode);
1422N/Aextern const char *TsolErrorNameString(int req);
851N/Aextern const char *TsolPolicyReturnString(int pr);
606N/Aextern const char *TsolRequestNameString(int req);
606N/Aextern const char *TsolResourceTypeString(RESTYPE resource);
606N/A
606N/A#define MAXNAME 64 /* 63 chars of process name stored */
606N/A
810N/A/*********************************
810N/A *
810N/A * CONSTANTS
810N/A *
810N/A *********************************/
810N/A
1437N/A
/*
* X audit events start from 9101 in audit_uevents.h. The first 2 events
* are non-protocol ones viz. ClientConnect, mapped to 9101 and
* ClientDisconnect, mapped to 9102.
* The protocol events are mapped from 9103 onwards in the serial order
* of their respective protocol opcode, for eg, the protocol UngrabPointer
* which is has a protocol opcode 27 is mapped to 9129 (9102 + 27).
* All extension protocols are mapped to a single audit event AUE_XExtension
* as opcodes are assigined dynamically to these protocols. We set the
* extension protocol opcode to be 128, one more than the last standard opcode.
*/
#define XAUDIT_Q_SIZE 1024 /* audit queue size for x server */
#define XAUDIT_OFFSET 9102
#define XAUDIT_EXTENSION 128
#define MAX_CLIENT 256
#define MAX_SLS 256 /* used in atom */
#define MAX_POLYPROPS 128 /* used in property */
#define DEF_UID (uid_t)0 /* uid used for default objects */
#define INVALID_UID (uid_t)0xFFFF /* invalid uid */
/*
* Various flags for TsolInfoRec, TsolResRec
*/
#define TSOL_IIL 0x0000001 /* iil changed for window */
#define TSOL_DOXAUDIT 0x0000002 /* write X audit rec if set */
#define TSOL_AUDITEVENT 0x0000004 /* this event mask selected for audit */
#define CONFIG_AUDITED 0x0000008 /* this priv has been asserted for */
#define DAC_READ_AUDITED 0x0000010 /* the same object before */
#define DAC_WRITE_AUDITED 0x0000020
#define MAC_READ_AUDITED 0x0000040
#define MAC_WRITE_AUDITED 0x0000080
#define TRUSTED_MASK 0x0000100 /* Window has Trusted Path */
/*
* Polyinstantiated property/selections
*/
#define POLY_SIZE 16 /* increase the list 16 at a time */
#define CONFIG_PRIV_FILE "config.privs"
#define CONFIG_EXTENSION_FILE "config.extensions"
#define PROCVECTORSIZE (256)
enum tsolconfig_types {
TSOL_ATOM = 0,
TSOL_PROPERTY,
TSOL_SELECTION,
TSOL_EXTENSION,
TSOL_PRIVILEGE
};
#define MAJOROP_CODE (client->requestBuffer != 0 ? MAJOROP : (-1))
typedef enum tsolconfig_types tsolconfig_t;
/*
* Masks corresponding various types
*/
#define TSOLM_ATOM 1
#define TSOLM_PROPERTY (1 << 1)
#define TSOLM_SELECTION (1 << 2)
#define SL_SIZE blabel_size()
/*********************************
*
* MACROS
*
*********************************/
#define WindowIsRoot(pWin) (pWin && (pWin->parent == NullWindow))
#define DrawableIsRoot(pDraw)\
(pDraw && (pDraw->id == pDraw->pScreen->root->drawable.id))
/*
* True if client is part of TrustedPath
*/
#define HasTrustedPath(tsolinfo)\
(tsolinfo->trusted_path ||\
(tsolinfo->forced_trust == 1))
#define XTSOLTrusted(pWin) \
((TsolWindowPrivate(pWin))->flags & TRUSTED_MASK)
/*********************************
*
* DATA STRUCTURES
*
*********************************/
enum client_types {
CLIENT_LOCAL,
CLIENT_REMOTE
};
typedef enum client_types client_type_t;
/*
* Extended attributes for each client.
* Most of the information comes from getpeerucred()
*/
typedef struct _TsolInfo {
uid_t uid; /* real user id */
uid_t euid; /* effective user id */
gid_t gid; /* real group id */
gid_t egid; /* effective group id */
pid_t pid; /* process id */
zoneid_t zid; /* zone id */
priv_set_t *privs; /* privileges */
bslabel_t *sl; /* sensitivity label */
ulong_t iaddr; /* internet addr */
Bool trusted_path; /* has trusted path */
Bool priv_debug; /* do privilege debugging */
ulong_t flags; /* various flags */
int forced_trust; /* client masked as trusted */
au_id_t auid; /* audit id */
au_mask_t amask; /* audit mask */
au_asid_t asid; /* audit session id */
client_type_t client_type; /* Local or Remote client */
int asaverd;
struct sockaddr_storage saddr; /* socket information */
char pname[MAXNAME]; /* process name for debug messages */
} TsolInfoRec, *TsolInfoPtr;
/*
* per resource info
*/
typedef struct _TsolRes {
bslabel_t *sl; /* sensitivity label */
uid_t uid; /* user id */
ulong_t flags; /* various flags */
pid_t pid; /* who created it */
Bool internal; /* Created internally by the server */
Bool poly; /* Polyinstantiated or not. Applicable
to selection or properties */
} TsolResRec, *TsolResPtr;
/*
* per keyboard info:
* Hot Key structure caches keycode/mask for primary & alternate Hot Keys
*/
typedef struct _HotKeyRec {
int initialized;
KeyCode key; /* Primary key */
unsigned shift; /* Primary modifier/shift */
KeyCode altkey; /* Alternate key */
unsigned altshift; /* Alternate modifier/shift */
} HotKeyRec, *HotKeyPtr;
/*
* information stored in devPrivates
*/
extern _X_HIDDEN DevPrivateKeyRec tsolClientPrivateKeyRec;
#define tsolClientPrivateKey (&tsolClientPrivateKeyRec)
extern _X_HIDDEN DevPrivateKeyRec tsolPixmapPrivateKeyRec;
#define tsolPixmapPrivateKey (&tsolPixmapPrivateKeyRec)
extern _X_HIDDEN DevPrivateKeyRec tsolWindowPrivateKeyRec;
#define tsolWindowPrivateKey (&tsolWindowPrivateKeyRec)
extern _X_HIDDEN DevPrivateKeyRec tsolPropertyPrivateKeyRec;
#define tsolPropertyPrivateKey (&tsolPropertyPrivateKeyRec)
extern _X_HIDDEN DevPrivateKeyRec tsolSelectionPrivateKeyRec;
#define tsolSelectionPrivateKey (&tsolSelectionPrivateKeyRec)
/* Currently only used in keyboard devices */
extern _X_HIDDEN DevPrivateKeyRec tsolDevicePrivateKeyRec;
#define tsolDevicePrivateKey (&tsolDevicePrivateKeyRec)
static inline TsolInfoPtr
TsolClientPrivate (ClientPtr pClient)
{
return (TsolInfoPtr) dixLookupPrivate(&(pClient->devPrivates),
tsolClientPrivateKey);
}
static inline TsolResPtr
TsolPixmapPrivate (PixmapPtr pPix)
{
return (TsolResPtr) dixLookupPrivate(&(pPix->devPrivates),
tsolPixmapPrivateKey);
}
static inline TsolResPtr
TsolWindowPrivate (WindowPtr pWin)
{
return (TsolResPtr) dixLookupPrivate(&(pWin->devPrivates),
tsolWindowPrivateKey);
}
static inline TsolResPtr
TsolPropertyPrivate (PropertyPtr pProp)
{
return (TsolResPtr) dixLookupPrivate(&(pProp->devPrivates),
tsolPropertyPrivateKey);
}
static inline TsolResPtr
TsolSelectionPrivate (Selection *pSel)
{
return (TsolResPtr) dixLookupPrivate(&(pSel->devPrivates),
tsolSelectionPrivateKey);
}
static inline HotKeyPtr
TsolKeyboardPrivate (DeviceIntPtr pDev)
{
return (HotKeyPtr) dixLookupPrivate(&(pDev->devPrivates),
tsolDevicePrivateKey);
}
#define NODE_SLSIZE 256 /* increase sl array by this amount */
typedef struct _TsolNodeRec {
unsigned int flags;
int slcount; /* no. of SLs referenced */
int slsize; /* size of the sl array */
int IsSpecial;
bslabel_t **sl;
} TsolNodeRec, *TsolNodePtr;
/*
* if polyinst true, the name list is polyinstantiated
* if false, the everything except the list is polyinstantiated
* NOTE: Default for seln: polyinstantiate the list
* Default for prop: polyinstantiate everything except the list
*/
typedef struct _TsolPolyAtom {
int polyinst;
int size; /* max size of the list */
int count; /* how many are actually valid */
char **name;
} TsolPolyAtomRec, *TsolPolyAtomPtr;
/*
* PolyInstInfo represents if a get request will match the
* client's sl,uid for this or it will use the polyinstinfo
* information to retrieve values for prop/selection
*/
typedef struct _TsolPolyInstInfo {
int enabled; /* if true use following sl, uid */
uid_t uid;
bslabel_t *sl;
} TsolPolyInstInfoRec, *TsolPolyInstInfoPtr;
/*********************************
*
* EXTERNS
*
*********************************/
extern int PolyProperty(Atom atom, WindowPtr pWin);
extern int PolySelection(Atom atom);
extern TsolPolyInstInfoRec tsolpolyinstinfo;
extern uid_t OwnerUID; /* Workstation owner uid */
extern Bool system_audit_on;
/*********************************
*
* FUNCTION PROTOTYPES
*
*********************************/
void TsolReadPolyAtoms(char *filename, TsolPolyAtomPtr polyatomptr);
extern WindowPtr TopClientWin(WindowPtr pWin);
extern WindowPtr RootWin(WindowPtr pWin);
extern Window RootOf(WindowPtr pWin);
extern Window RootOfClient(WindowPtr pWin);
extern int TsolDisabledExtension(const char *extname);
extern int MatchTsolConfig(const char *name, int len);
extern int HasWinSelection(TsolInfoPtr tsolinfo);
extern int same_client (ClientPtr client, XID xid);
extern int client_private (ClientPtr client, XID xid);
extern bslabel_t *lookupSL_low(void);
extern bslabel_t *lookupSL(bslabel_t *slptr);
extern BoxPtr WindowExtents(WindowPtr pWin, BoxPtr pBox);
extern Bool ShapeOverlap(WindowPtr pWin, BoxPtr pWinBox,
WindowPtr pSib, BoxPtr pSibBox);
extern TsolResPtr TsolDrawablePrivate(DrawablePtr pDraw, ClientPtr client);
#endif /* _TSOL_INFO_H */