summaryrefslogtreecommitdiff
path: root/source4/scripting/python/samba/samba3/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'source4/scripting/python/samba/samba3/__init__.py')
-rw-r--r--source4/scripting/python/samba/samba3/__init__.py408
1 files changed, 0 insertions, 408 deletions
diff --git a/source4/scripting/python/samba/samba3/__init__.py b/source4/scripting/python/samba/samba3/__init__.py
deleted file mode 100644
index acccff4e29..0000000000
--- a/source4/scripting/python/samba/samba3/__init__.py
+++ /dev/null
@@ -1,408 +0,0 @@
-# Unix SMB/CIFS implementation.
-# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007
-#
-# 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/>.
-#
-
-"""Support for reading Samba 3 data files."""
-
-__docformat__ = "restructuredText"
-
-REGISTRY_VALUE_PREFIX = "SAMBA_REGVAL"
-REGISTRY_DB_VERSION = 1
-
-import os
-import struct
-import tdb
-
-import passdb
-import param as s3param
-
-
-def fetch_uint32(tdb, key):
- try:
- data = tdb[key]
- except KeyError:
- return None
- assert len(data) == 4
- return struct.unpack("<L", data)[0]
-
-
-def fetch_int32(tdb, key):
- try:
- data = tdb[key]
- except KeyError:
- return None
- assert len(data) == 4
- return struct.unpack("<l", data)[0]
-
-
-class TdbDatabase(object):
- """Simple Samba 3 TDB database reader."""
- def __init__(self, file):
- """Open a file.
-
- :param file: Path of the file to open.
- """
- self.tdb = tdb.Tdb(file, flags=os.O_RDONLY)
- self._check_version()
-
- def _check_version(self):
- pass
-
- def close(self):
- """Close resources associated with this object."""
- self.tdb.close()
-
-
-class Registry(TdbDatabase):
- """Simple read-only support for reading the Samba3 registry.
-
- :note: This object uses the same syntax for registry key paths as
- Samba 3. This particular format uses forward slashes for key path
- separators and abbreviations for the predefined key names.
- e.g.: HKLM/Software/Bar.
- """
- def __len__(self):
- """Return the number of keys."""
- return len(self.keys())
-
- def keys(self):
- """Return list with all the keys."""
- return [k.rstrip("\x00") for k in self.tdb.iterkeys() if not k.startswith(REGISTRY_VALUE_PREFIX)]
-
- def subkeys(self, key):
- """Retrieve the subkeys for the specified key.
-
- :param key: Key path.
- :return: list with key names
- """
- data = self.tdb.get("%s\x00" % key)
- if data is None:
- return []
- (num, ) = struct.unpack("<L", data[0:4])
- keys = data[4:].split("\0")
- assert keys[-1] == ""
- keys.pop()
- assert len(keys) == num
- return keys
-
- def values(self, key):
- """Return a dictionary with the values set for a specific key.
-
- :param key: Key to retrieve values for.
- :return: Dictionary with value names as key, tuple with type and
- data as value."""
- data = self.tdb.get("%s/%s\x00" % (REGISTRY_VALUE_PREFIX, key))
- if data is None:
- return {}
- ret = {}
- (num, ) = struct.unpack("<L", data[0:4])
- data = data[4:]
- for i in range(num):
- # Value name
- (name, data) = data.split("\0", 1)
-
- (type, ) = struct.unpack("<L", data[0:4])
- data = data[4:]
- (value_len, ) = struct.unpack("<L", data[0:4])
- data = data[4:]
-
- ret[name] = (type, data[:value_len])
- data = data[value_len:]
-
- return ret
-
-
-# High water mark keys
-IDMAP_HWM_GROUP = "GROUP HWM\0"
-IDMAP_HWM_USER = "USER HWM\0"
-
-IDMAP_GROUP_PREFIX = "GID "
-IDMAP_USER_PREFIX = "UID "
-
-# idmap version determines auto-conversion
-IDMAP_VERSION_V2 = 2
-
-class IdmapDatabase(TdbDatabase):
- """Samba 3 ID map database reader."""
-
- def _check_version(self):
- assert fetch_int32(self.tdb, "IDMAP_VERSION\0") == IDMAP_VERSION_V2
-
- def ids(self):
- """Retrieve a list of all ids in this database."""
- for k in self.tdb.iterkeys():
- if k.startswith(IDMAP_USER_PREFIX):
- yield k.rstrip("\0").split(" ")
- if k.startswith(IDMAP_GROUP_PREFIX):
- yield k.rstrip("\0").split(" ")
-
- def uids(self):
- """Retrieve a list of all uids in this database."""
- for k in self.tdb.iterkeys():
- if k.startswith(IDMAP_USER_PREFIX):
- yield int(k[len(IDMAP_USER_PREFIX):].rstrip("\0"))
-
- def gids(self):
- """Retrieve a list of all gids in this database."""
- for k in self.tdb.iterkeys():
- if k.startswith(IDMAP_GROUP_PREFIX):
- yield int(k[len(IDMAP_GROUP_PREFIX):].rstrip("\0"))
-
- def get_sid(self, xid, id_type):
- """Retrive SID associated with a particular id and type.
-
- :param xid: UID or GID to retrive SID for.
- :param id_type: Type of id specified - 'UID' or 'GID'
- """
- data = self.tdb.get("%s %s\0" % (id_type, str(xid)))
- if data is None:
- return data
- return data.rstrip("\0")
-
- def get_user_sid(self, uid):
- """Retrieve the SID associated with a particular uid.
-
- :param uid: UID to retrieve SID for.
- :return: A SID or None if no mapping was found.
- """
- data = self.tdb.get("%s%d\0" % (IDMAP_USER_PREFIX, uid))
- if data is None:
- return data
- return data.rstrip("\0")
-
- def get_group_sid(self, gid):
- data = self.tdb.get("%s%d\0" % (IDMAP_GROUP_PREFIX, gid))
- if data is None:
- return data
- return data.rstrip("\0")
-
- def get_user_hwm(self):
- """Obtain the user high-water mark."""
- return fetch_uint32(self.tdb, IDMAP_HWM_USER)
-
- def get_group_hwm(self):
- """Obtain the group high-water mark."""
- return fetch_uint32(self.tdb, IDMAP_HWM_GROUP)
-
-
-class SecretsDatabase(TdbDatabase):
- """Samba 3 Secrets database reader."""
-
- def get_auth_password(self):
- return self.tdb.get("SECRETS/AUTH_PASSWORD")
-
- def get_auth_domain(self):
- return self.tdb.get("SECRETS/AUTH_DOMAIN")
-
- def get_auth_user(self):
- return self.tdb.get("SECRETS/AUTH_USER")
-
- def get_domain_guid(self, host):
- return self.tdb.get("SECRETS/DOMGUID/%s" % host)
-
- def ldap_dns(self):
- for k in self.tdb.iterkeys():
- if k.startswith("SECRETS/LDAP_BIND_PW/"):
- yield k[len("SECRETS/LDAP_BIND_PW/"):].rstrip("\0")
-
- def domains(self):
- """Iterate over domains in this database.
-
- :return: Iterator over the names of domains in this database.
- """
- for k in self.tdb.iterkeys():
- if k.startswith("SECRETS/SID/"):
- yield k[len("SECRETS/SID/"):].rstrip("\0")
-
- def get_ldap_bind_pw(self, host):
- return self.tdb.get("SECRETS/LDAP_BIND_PW/%s" % host)
-
- def get_afs_keyfile(self, host):
- return self.tdb.get("SECRETS/AFS_KEYFILE/%s" % host)
-
- def get_machine_sec_channel_type(self, host):
- return fetch_uint32(self.tdb, "SECRETS/MACHINE_SEC_CHANNEL_TYPE/%s" % host)
-
- def get_machine_last_change_time(self, host):
- return fetch_uint32(self.tdb, "SECRETS/MACHINE_LAST_CHANGE_TIME/%s" % host)
-
- def get_machine_password(self, host):
- return self.tdb.get("SECRETS/MACHINE_PASSWORD/%s" % host)
-
- def get_machine_acc(self, host):
- return self.tdb.get("SECRETS/$MACHINE.ACC/%s" % host)
-
- def get_domtrust_acc(self, host):
- return self.tdb.get("SECRETS/$DOMTRUST.ACC/%s" % host)
-
- def trusted_domains(self):
- for k in self.tdb.iterkeys():
- if k.startswith("SECRETS/$DOMTRUST.ACC/"):
- yield k[len("SECRETS/$DOMTRUST.ACC/"):].rstrip("\0")
-
- def get_random_seed(self):
- return self.tdb.get("INFO/random_seed")
-
- def get_sid(self, host):
- return self.tdb.get("SECRETS/SID/%s" % host.upper())
-
-
-SHARE_DATABASE_VERSION_V1 = 1
-SHARE_DATABASE_VERSION_V2 = 2
-
-
-class ShareInfoDatabase(TdbDatabase):
- """Samba 3 Share Info database reader."""
-
- def _check_version(self):
- assert fetch_int32(self.tdb, "INFO/version\0") in (SHARE_DATABASE_VERSION_V1, SHARE_DATABASE_VERSION_V2)
-
- def get_secdesc(self, name):
- """Obtain the security descriptor on a particular share.
-
- :param name: Name of the share
- """
- secdesc = self.tdb.get("SECDESC/%s" % name)
- # FIXME: Run ndr_pull_security_descriptor
- return secdesc
-
-
-class Shares(object):
- """Container for share objects."""
- def __init__(self, lp, shareinfo):
- self.lp = lp
- self.shareinfo = shareinfo
-
- def __len__(self):
- """Number of shares."""
- return len(self.lp) - 1
-
- def __iter__(self):
- """Iterate over the share names."""
- return self.lp.__iter__()
-
-
-def shellsplit(text):
- """Very simple shell-like line splitting.
-
- :param text: Text to split.
- :return: List with parts of the line as strings.
- """
- ret = list()
- inquotes = False
- current = ""
- for c in text:
- if c == "\"":
- inquotes = not inquotes
- elif c in ("\t", "\n", " ") and not inquotes:
- if current != "":
- ret.append(current)
- current = ""
- else:
- current += c
- if current != "":
- ret.append(current)
- return ret
-
-
-class WinsDatabase(object):
- """Samba 3 WINS database reader."""
- def __init__(self, file):
- self.entries = {}
- f = open(file, 'r')
- assert f.readline().rstrip("\n") == "VERSION 1 0"
- for l in f.readlines():
- if l[0] == "#": # skip comments
- continue
- entries = shellsplit(l.rstrip("\n"))
- name = entries[0]
- ttl = int(entries[1])
- i = 2
- ips = []
- while "." in entries[i]:
- ips.append(entries[i])
- i+=1
- nb_flags = int(entries[i][:-1], 16)
- assert not name in self.entries, "Name %s exists twice" % name
- self.entries[name] = (ttl, ips, nb_flags)
- f.close()
-
- def __getitem__(self, name):
- return self.entries[name]
-
- def __len__(self):
- return len(self.entries)
-
- def __iter__(self):
- return iter(self.entries)
-
- def items(self):
- """Return the entries in this WINS database."""
- return self.entries.items()
-
- def close(self): # for consistency
- pass
-
-
-class Samba3(object):
- """Samba 3 configuration and state data reader."""
-
- def __init__(self, smbconfpath, s3_lp_ctx=None):
- """Open the configuration and data for a Samba 3 installation.
-
- :param smbconfpath: Path to the smb.conf file.
- :param s3_lp_ctx: Samba3 Loadparm context
- """
- self.smbconfpath = smbconfpath
- if s3_lp_ctx:
- self.lp = s3_lp_ctx
- else:
- self.lp = s3param.get_context()
- self.lp.load(smbconfpath)
-
- def statedir_path(self, path):
- if path[0] == "/" or path[0] == ".":
- return path
- return os.path.join(self.lp.get("state directory"), path)
-
- def privatedir_path(self, path):
- if path[0] == "/" or path[0] == ".":
- return path
- return os.path.join(self.lp.get("private dir"), path)
-
- def get_conf(self):
- return self.lp
-
- def get_sam_db(self):
- return passdb.PDB(self.lp.get('passdb backend'))
-
- def get_registry(self):
- return Registry(self.statedir_path("registry.tdb"))
-
- def get_secrets_db(self):
- return SecretsDatabase(self.privatedir_path("secrets.tdb"))
-
- def get_shareinfo_db(self):
- return ShareInfoDatabase(self.statedir_path("share_info.tdb"))
-
- def get_idmap_db(self):
- return IdmapDatabase(self.statedir_path("winbindd_idmap.tdb"))
-
- def get_wins_db(self):
- return WinsDatabase(self.statedir_path("wins.dat"))
-
- def get_shares(self):
- return Shares(self.get_conf(), self.get_shareinfo_db())