Spaces:
Runtime error
Runtime error
| # 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) | |