1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-25 23:21:54 +03:00
samba-mirror/python/samba/tests/ndr.py
Andrew Bartlett 0cc4478070 selftest: Add test of NDR marshalling from python, starting with wbint
These patches are to address an issue unpacking a very large
winbind.wbint_Principals array (100,000).

We need the NDR_TOKEN_MAX_LIST_SIZE value exposed as
otherwise a well-meaning incrase of this value would
invalidate the test.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=14710

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
2021-06-02 03:56:36 +00:00

139 lines
4.1 KiB
Python

# -*- coding: utf-8 -*-
# Unix SMB/CIFS implementation.
# Copyright © Andrew Bartlett <abartlet@samba.org> 2021
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
"""Test of Network Data Representation (NDR) marshalling and unmarshalling."""
import samba
import samba.ndr as ndr
from samba.dcerpc import winbind, security, lsa
class NdrTestCase(samba.tests.TestCase):
def test_wbint_Principal(self):
x = winbind.wbint_Principal()
x.sid = security.dom_sid(security.SID_NT_SCHANNEL_AUTHENTICATION)
x.type = lsa.SID_NAME_USER
x.name = "fred"
b = ndr.ndr_pack(x)
y = ndr.ndr_unpack(winbind.wbint_Principal, b)
self.assertEqual(x.sid, y.sid)
self.assertEqual(x.type, y.type)
self.assertEqual(x.name, y.name)
def test_wbint_Principal_null_name(self):
x = winbind.wbint_Principal()
x.sid = security.dom_sid(security.SID_NT_SCHANNEL_AUTHENTICATION)
x.type = lsa.SID_NAME_USER
x.name = None
b = ndr.ndr_pack(x)
y = ndr.ndr_unpack(winbind.wbint_Principal, b)
self.assertEqual(x.sid, y.sid)
self.assertEqual(x.type, y.type)
self.assertEqual(x.name, y.name)
def test_wbint_Principals(self):
principals = []
for i in range(0, 10):
x = winbind.wbint_Principal()
x.sid = security.dom_sid(security.SID_NT_SCHANNEL_AUTHENTICATION)
x.type = lsa.SID_NAME_USER
x.name = None
principals.append(x)
wb_principals = winbind.wbint_Principals()
wb_principals.num_principals = 10
wb_principals.principals = principals
b = ndr.ndr_pack(wb_principals)
unpacked_principals = ndr.ndr_unpack(winbind.wbint_Principals,
b)
self.assertEqual(wb_principals.num_principals,
unpacked_principals.num_principals)
for i in range(0, 10):
x = principals[i]
y = unpacked_principals.principals[i]
self.assertEqual(x.sid, y.sid)
self.assertEqual(x.type, y.type)
self.assertEqual(x.name, y.name)
def test_wbint_10_Principals(self):
num = 10
(principals, unpacked_principals) = self._test_wbint_Principals(num)
for i in range(0, num):
x = principals[i]
y = unpacked_principals.principals[i]
self.assertEqual(x.sid, y.sid)
self.assertEqual(x.type, y.type)
self.assertEqual(x.name, y.name)
def test_wbint_max_token_Principals(self):
self._test_wbint_Principals(samba._glue.ndr_token_max_list_size()+1)
def _test_wbint_Principals(self, num):
principals = []
for i in range(0, num):
x = winbind.wbint_Principal()
x.sid = security.dom_sid(security.SID_NT_SCHANNEL_AUTHENTICATION + "-%d" % num)
x.type = lsa.SID_NAME_USER
x.name = "fred%d" % num
principals.append(x)
wb_principals = winbind.wbint_Principals()
wb_principals.num_principals = num
wb_principals.principals = principals
b = ndr.ndr_pack(wb_principals)
try:
unpacked_principals = ndr.ndr_unpack(winbind.wbint_Principals,
b)
except RuntimeError as e:
self.fail(e)
self.assertEqual(wb_principals.num_principals,
unpacked_principals.num_principals)
return (principals, unpacked_principals)