#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Originally based on ./sam.py
from __future__ import print_function
import optparse
import sys
import os
import base64
import random
import re
sys.path.insert(0, "bin/python")
import samba
from samba.tests.subunitrun import SubunitOptions, TestProgram
import samba.getopt as options
from samba.auth import system_session
import ldb
from samba.samdb import SamDB
from samba.compat import get_bytes
from samba.compat import get_string
import time
parser = optparse.OptionParser("vlv.py [options] <host>")
sambaopts = options.SambaOptions(parser)
parser.add_option_group(sambaopts)
parser.add_option_group(options.VersionOptions(parser))
# use command line creds if available
credopts = options.CredentialsOptions(parser)
parser.add_option_group(credopts)
subunitopts = SubunitOptions(parser)
parser.add_option_group(subunitopts)
parser.add_option('--elements', type='int', default=20,
help="use this many elements in the tests")
parser.add_option('--delete-in-setup', action='store_true',
help="cleanup in next setup rather than teardown")
parser.add_option('--skip-attr-regex',
help="ignore attributes matching this regex")
opts, args = parser.parse_args()
if len(args) < 1:
parser.print_usage()
sys.exit(1)
host = args[0]
lp = sambaopts.get_loadparm()
creds = credopts.get_credentials(lp)
N_ELEMENTS = opts.elements
class VlvTestException(Exception):
pass
def encode_vlv_control(critical=1,
before=0, after=0,
offset=None,
gte=None,
n=0, cookie=None):
s = "vlv:%d:%d:%d:" % (critical, before, after)
if offset is not None:
m = "%d:%d" % (offset, n)
elif b':' in gte or b'\x00' in gte:
gte = get_string(base64.b64encode(gte))
m = "base64>=%s" % gte
else:
m = ">=%s" % get_string(gte)
if cookie is None:
return s + m
return s + m + ':' + cookie
def get_cookie(controls, expected_n=None):
"""Get the cookie, STILL base64 encoded, or raise ValueError."""
for c in list(controls):
cstr = str(c)
if cstr.startswith('vlv_resp'):
head, n, _, cookie = cstr.rsplit(':', 3)
if expected_n is not None and int(n) != expected_n:
raise ValueError("Expected %s items, server said %s" %
(expected_n, n))
return cookie
raise ValueError("there is no VLV response")
class TestsWithUserOU(samba.tests.TestCase):
def create_user(self, i, n, prefix='vlvtest', suffix='', attrs=None):
name = "%s%d%s" % (prefix, i, suffix)
user = {
'cn': name,
"objectclass": "user",
'givenName': "abcdefghijklmnopqrstuvwxyz"[i % 26],
"roomNumber": "%sbc" % (n - i),
"carLicense": "后来经",
"employeeNumber": "%s%sx" % (abs(i * (99 - i)), '\n' * (i & 255)),
"accountExpires": "%s" % (10 ** 9 + 1000000 * i),
"msTSExpireDate4": "19%02d0101010000.0Z" % (i % 100),
"flags": str(i * (n - i)),
|