140 lines
5.1 KiB
Python
140 lines
5.1 KiB
Python
|
# Xlib.ext.security -- SECURITY extension module
|
||
|
#
|
||
|
# Copyright (C) 2010-2013 Outpost Embedded, LLC
|
||
|
# Forest Bond <forest.bond@rapidrollout.com>
|
||
|
#
|
||
|
# 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, write to the
|
||
|
# Free Software Foundation, Inc.,
|
||
|
# 59 Temple Place,
|
||
|
# Suite 330,
|
||
|
# Boston, MA 02111-1307 USA
|
||
|
|
||
|
'''
|
||
|
A partial implementation of the SECURITY extension. Support for the
|
||
|
SecurityAuthorizationRevoked event is not implemented.
|
||
|
'''
|
||
|
|
||
|
from Xlib.protocol import rq
|
||
|
|
||
|
|
||
|
extname = 'SECURITY'
|
||
|
|
||
|
|
||
|
SecurityClientTrusted = 0
|
||
|
SecurityClientUntrusted = 1
|
||
|
|
||
|
SecurityAuthorizationRevokedMask = 1
|
||
|
|
||
|
|
||
|
AUTHID = rq.Card32
|
||
|
|
||
|
|
||
|
class QueryVersion(rq.ReplyRequest):
|
||
|
_request = rq.Struct(rq.Card8('opcode'),
|
||
|
rq.Opcode(0),
|
||
|
rq.RequestLength(),
|
||
|
rq.Card16('major_version'),
|
||
|
rq.Card16('minor_version')
|
||
|
)
|
||
|
_reply = rq.Struct(rq.ReplyCode(),
|
||
|
rq.Pad(1),
|
||
|
rq.Card16('sequence_number'),
|
||
|
rq.ReplyLength(),
|
||
|
rq.Card16('major_version'),
|
||
|
rq.Card16('minor_version'),
|
||
|
rq.Pad(20)
|
||
|
)
|
||
|
|
||
|
|
||
|
def query_version(self):
|
||
|
return QueryVersion(display=self.display,
|
||
|
opcode=self.display.get_extension_major(extname),
|
||
|
major_version=1,
|
||
|
minor_version=0)
|
||
|
|
||
|
|
||
|
class SecurityGenerateAuthorization(rq.ReplyRequest):
|
||
|
# The order of fields here does not match the specifications I've seen
|
||
|
# online, but it *does* match with the X.org implementation. I guess the
|
||
|
# spec is out-of-date.
|
||
|
_request = rq.Struct(rq.Card8('opcode'),
|
||
|
rq.Opcode(1),
|
||
|
rq.RequestLength(),
|
||
|
rq.LengthOf('auth_proto', 2),
|
||
|
rq.LengthOf('auth_data', 2),
|
||
|
rq.Card32('value_mask'),
|
||
|
rq.String8('auth_proto'),
|
||
|
rq.Binary('auth_data'),
|
||
|
rq.List('values', rq.Card32Obj)
|
||
|
)
|
||
|
_reply = rq.Struct(rq.ReplyCode(),
|
||
|
rq.Pad(1),
|
||
|
rq.Card16('sequence_number'),
|
||
|
rq.ReplyLength(),
|
||
|
AUTHID('authid'),
|
||
|
rq.LengthOf('auth_data_return', 2),
|
||
|
rq.Pad(18),
|
||
|
rq.Binary('auth_data_return')
|
||
|
)
|
||
|
|
||
|
|
||
|
def generate_authorization(self, auth_proto, auth_data=b'', timeout=None,
|
||
|
trust_level=None, group=None, event_mask=None):
|
||
|
value_mask = 0
|
||
|
values = []
|
||
|
if timeout is not None:
|
||
|
value_mask |= 1
|
||
|
values.append(timeout)
|
||
|
if trust_level is not None:
|
||
|
value_mask |= 2
|
||
|
values.append(trust_level)
|
||
|
if group is not None:
|
||
|
value_mask |= 4
|
||
|
values.append(group)
|
||
|
if event_mask is not None:
|
||
|
value_mask |= 8
|
||
|
values.append(event_mask)
|
||
|
return SecurityGenerateAuthorization(display=self.display,
|
||
|
opcode=self.display.get_extension_major(extname),
|
||
|
value_mask=value_mask,
|
||
|
auth_proto=auth_proto,
|
||
|
auth_data=auth_data,
|
||
|
values=values)
|
||
|
|
||
|
|
||
|
class SecurityRevokeAuthorization(rq.Request):
|
||
|
_request = rq.Struct(rq.Card8('opcode'),
|
||
|
rq.Opcode(2),
|
||
|
rq.RequestLength(),
|
||
|
AUTHID('authid')
|
||
|
)
|
||
|
|
||
|
|
||
|
def revoke_authorization(self, authid):
|
||
|
return SecurityRevokeAuthorization(display=self.display,
|
||
|
opcode=self.display.get_extension_major(extname),
|
||
|
authid=authid)
|
||
|
|
||
|
|
||
|
def init(disp, info):
|
||
|
disp.extension_add_method('display',
|
||
|
'security_query_version',
|
||
|
query_version)
|
||
|
disp.extension_add_method('display',
|
||
|
'security_generate_authorization',
|
||
|
generate_authorization)
|
||
|
disp.extension_add_method('display',
|
||
|
'security_revoke_authorization',
|
||
|
revoke_authorization)
|