Imported Debian patch 4.7.2-3
This commit is contained in:
committed by
Mario Fetka
parent
27edeba051
commit
8bc559c5a1
@@ -8,10 +8,8 @@ This base platform module exports platform dependant constants.
|
||||
import sys
|
||||
|
||||
|
||||
class BaseConstantsNamespace:
|
||||
class BaseConstantsNamespace(object):
|
||||
IS_64BITS = sys.maxsize > 2 ** 32
|
||||
DEFAULT_ADMIN_SHELL = '/bin/bash'
|
||||
DEFAULT_SHELL = '/bin/sh'
|
||||
DS_USER = 'dirsrv'
|
||||
DS_GROUP = 'dirsrv'
|
||||
HTTPD_USER = "apache"
|
||||
@@ -43,31 +41,6 @@ class BaseConstantsNamespace:
|
||||
'httpd_run_ipa': 'on',
|
||||
'httpd_dbus_sssd': 'on',
|
||||
}
|
||||
# Unlike above, there are multiple use cases for SMB sharing
|
||||
# SELINUX_BOOLEAN_SMBSERVICE is a dictionary of dictionaries
|
||||
# to define set of booleans for each use case
|
||||
SELINUX_BOOLEAN_SMBSERVICE = {
|
||||
'share_home_dirs': {
|
||||
'samba_enable_home_dirs': 'on',
|
||||
},
|
||||
'reshare_nfs_with_samba': {
|
||||
'samba_share_nfs': 'on',
|
||||
},
|
||||
}
|
||||
SELINUX_MCS_MAX = 1023
|
||||
SELINUX_MCS_REGEX = r"^c(\d+)([.,-]c(\d+))*$"
|
||||
SELINUX_MLS_MAX = 15
|
||||
SELINUX_MLS_REGEX = r"^s(\d+)(-s(\d+))?$"
|
||||
SELINUX_USER_REGEX = r"^[a-zA-Z][a-zA-Z_\.]*$"
|
||||
SELINUX_USERMAP_DEFAULT = "unconfined_u:s0-s0:c0.c1023"
|
||||
SELINUX_USERMAP_ORDER = (
|
||||
"guest_u:s0"
|
||||
"$xguest_u:s0"
|
||||
"$user_u:s0"
|
||||
"$staff_u:s0-s0:c0.c1023"
|
||||
"$sysadm_u:s0-s0:c0.c1023"
|
||||
"$unconfined_u:s0-s0:c0.c1023"
|
||||
)
|
||||
SSSD_USER = "sssd"
|
||||
# WSGI module override, only used on Fedora
|
||||
MOD_WSGI_PYTHON2 = None
|
||||
|
||||
@@ -21,20 +21,20 @@
|
||||
This base platform module exports default filesystem paths.
|
||||
'''
|
||||
|
||||
import os
|
||||
|
||||
|
||||
class BasePathNamespace:
|
||||
class BasePathNamespace(object):
|
||||
BASH = "/bin/bash"
|
||||
BIN_HOSTNAMECTL = "/bin/hostnamectl"
|
||||
ECHO = "/bin/echo"
|
||||
FIPS_MODE_SETUP = "/usr/bin/fips-mode-setup"
|
||||
GZIP = "/bin/gzip"
|
||||
GZIP = "/usr/bin/gzip"
|
||||
LS = "/bin/ls"
|
||||
SH = "/bin/sh"
|
||||
SYSTEMCTL = "/bin/systemctl"
|
||||
SYSTEMD_DETECT_VIRT = "/usr/bin/systemd-detect-virt"
|
||||
SYSTEMD_TMPFILES = "/usr/bin/systemd-tmpfiles"
|
||||
TAR = "/bin/tar"
|
||||
AUTOFS_LDAP_AUTH_CONF = "/etc/autofs_ldap_auth.conf"
|
||||
ETC_DIRSRV = "/etc/dirsrv"
|
||||
DS_KEYTAB = "/etc/dirsrv/ds.keytab"
|
||||
ETC_DIRSRV_SLAPD_INSTANCE_TEMPLATE = "/etc/dirsrv/slapd-%s"
|
||||
ETC_FEDORA_RELEASE = "/etc/fedora-release"
|
||||
GROUP = "/etc/group"
|
||||
ETC_HOSTNAME = "/etc/hostname"
|
||||
@@ -76,23 +76,15 @@ class BasePathNamespace:
|
||||
COMMON_KRB5_CONF_DIR = "/etc/krb5.conf.d/"
|
||||
KRB5_CONF = "/etc/krb5.conf"
|
||||
KRB5_FREEIPA = COMMON_KRB5_CONF_DIR + "freeipa"
|
||||
KRB5_FREEIPA_SERVER = COMMON_KRB5_CONF_DIR + "freeipa-server"
|
||||
KRB5_KEYTAB = "/etc/krb5.keytab"
|
||||
LDAP_CONF = "/etc/ldap.conf"
|
||||
LIBNSS_LDAP_CONF = "/etc/libnss-ldap.conf"
|
||||
NAMED_CONF = "/etc/named.conf"
|
||||
NAMED_CONF_BAK = "/etc/named.conf.ipa-backup"
|
||||
NAMED_CUSTOM_CONF = "/etc/named/ipa-ext.conf"
|
||||
NAMED_CUSTOM_OPTIONS_CONF = "/etc/named/ipa-options-ext.conf"
|
||||
NAMED_CONF_SRC = '/usr/share/ipa/bind.named.conf.template'
|
||||
NAMED_CUSTOM_CONF_SRC = '/usr/share/ipa/bind.ipa-ext.conf.template'
|
||||
NAMED_CUSTOM_OPTIONS_CONF_SRC = (
|
||||
'/usr/share/ipa/bind.ipa-options-ext.conf.template'
|
||||
)
|
||||
NAMED_VAR_DIR = "/var/named"
|
||||
NAMED_KEYTAB = "/etc/named.keytab"
|
||||
NAMED_RFC1912_ZONES = "/etc/named.rfc1912.zones"
|
||||
NAMED_ROOT_KEY = "/etc/named.root.key"
|
||||
NAMED_BINDKEYS_FILE = "/etc/named.iscdlv.key"
|
||||
NAMED_MANAGED_KEYS_DIR = "/var/named/dynamic"
|
||||
NAMED_CRYPTO_POLICY_FILE = None
|
||||
NSLCD_CONF = "/etc/nslcd.conf"
|
||||
@@ -108,19 +100,13 @@ class BasePathNamespace:
|
||||
OPENLDAP_LDAP_CONF = "/etc/openldap/ldap.conf"
|
||||
PAM_LDAP_CONF = "/etc/pam_ldap.conf"
|
||||
PASSWD = "/etc/passwd"
|
||||
# Trusted CA certificates used to be written out to this file. In newer
|
||||
# versions of FreeIPA, it has been replaced by IPA_P11_KIT.
|
||||
SYSTEMWIDE_IPA_CA_CRT = "/etc/pki/ca-trust/source/anchors/ipa-ca.crt"
|
||||
IPA_P11_KIT = "/etc/pki/ca-trust/source/ipa.p11-kit"
|
||||
CA_CERTIFICATES_BUNDLE_PEM = None
|
||||
CA_CERTIFICATES_DIR = None
|
||||
NSS_DB_DIR = "/etc/pki/nssdb"
|
||||
PKI_CONFIGURATION = "/etc/pki"
|
||||
PKI_TOMCAT = "/etc/pki/pki-tomcat"
|
||||
PKI_TOMCAT_ALIAS_DIR = "/etc/pki/pki-tomcat/alias"
|
||||
PKI_TOMCAT_ALIAS_PWDFILE_TXT = "/etc/pki/pki-tomcat/alias/pwdfile.txt"
|
||||
PKI_TOMCAT_PASSWORD_CONF = "/etc/pki/pki-tomcat/password.conf"
|
||||
PKI_TOMCAT_SERVER_XML = "/etc/pki/pki-tomcat/server.xml"
|
||||
ETC_REDHAT_RELEASE = "/etc/redhat-release"
|
||||
RESOLV_CONF = "/etc/resolv.conf"
|
||||
SAMBA_KEYTAB = "/etc/samba/samba.keytab"
|
||||
@@ -129,8 +115,6 @@ class BasePathNamespace:
|
||||
SSH_CONFIG_DIR = "/etc/ssh"
|
||||
SSH_CONFIG = "/etc/ssh/ssh_config"
|
||||
SSHD_CONFIG = "/etc/ssh/sshd_config"
|
||||
SSHD_IPA_CONFIG = "/etc/ssh/sshd_config.d/04-ipa.conf"
|
||||
SSHD_IPA_CONFIG_TEMPLATE = "/usr/share/ipa/client/sshd_ipa.conf.template"
|
||||
SSSD_CONF = "/etc/sssd/sssd.conf"
|
||||
SSSD_CONF_BKP = "/etc/sssd/sssd.conf.bkp"
|
||||
SSSD_CONF_DELETED = "/etc/sssd/sssd.conf.deleted"
|
||||
@@ -158,8 +142,6 @@ class BasePathNamespace:
|
||||
SYSTEMD_IPA_SERVICE = "/etc/systemd/system/multi-user.target.wants/ipa.service"
|
||||
SYSTEMD_SSSD_SERVICE = "/etc/systemd/system/multi-user.target.wants/sssd.service"
|
||||
SYSTEMD_PKI_TOMCAT_SERVICE = "/etc/systemd/system/pki-tomcatd.target.wants/pki-tomcatd@pki-tomcat.service"
|
||||
SYSTEMD_PKI_TOMCAT_IPA_CONF = \
|
||||
"/etc/systemd/system/pki-tomcatd@pki-tomcat.service.d/ipa.conf"
|
||||
ETC_TMPFILESD_DIRSRV = "/etc/tmpfiles.d/dirsrv-%s.conf"
|
||||
DNSSEC_TRUSTED_KEY = "/etc/trusted-key.key"
|
||||
HOME_DIR = "/home"
|
||||
@@ -187,7 +169,6 @@ class BasePathNamespace:
|
||||
FIREFOX = "/usr/bin/firefox"
|
||||
GETCERT = "/usr/bin/getcert"
|
||||
GPG2 = "/usr/bin/gpg2"
|
||||
GPG_CONF = "/usr/bin/gpgconf"
|
||||
GPG_CONNECT_AGENT = "/usr/bin/gpg-connect-agent"
|
||||
GPG_AGENT = "/usr/bin/gpg-agent"
|
||||
IPA_GETCERT = "/usr/bin/ipa-getcert"
|
||||
@@ -195,7 +176,6 @@ class BasePathNamespace:
|
||||
KDESTROY = "/usr/bin/kdestroy"
|
||||
KINIT = "/usr/bin/kinit"
|
||||
KLIST = "/usr/bin/klist"
|
||||
KTUTIL = "/usr/bin/ktutil"
|
||||
BIN_KVNO = "/usr/bin/kvno"
|
||||
LDAPMODIFY = "/usr/bin/ldapmodify"
|
||||
LDAPPASSWD = "/usr/bin/ldappasswd"
|
||||
@@ -205,8 +185,6 @@ class BasePathNamespace:
|
||||
NSUPDATE = "/usr/bin/nsupdate"
|
||||
ODS_KSMUTIL = "/usr/bin/ods-ksmutil"
|
||||
ODS_SIGNER = "/usr/sbin/ods-signer"
|
||||
ODS_ENFORCER = "/usr/sbin/ods-enforcer"
|
||||
ODS_ENFORCER_DB_SETUP = "/usr/sbin/ods-enforcer-db-setup"
|
||||
OPENSSL = "/usr/bin/openssl"
|
||||
PK12UTIL = "/usr/bin/pk12util"
|
||||
SOFTHSM2_UTIL = "/usr/bin/softhsm2-util"
|
||||
@@ -219,28 +197,26 @@ class BasePathNamespace:
|
||||
BIND_LDAP_SO = "/usr/lib/bind/ldap.so"
|
||||
BIND_LDAP_DNS_IPA_WORKDIR = "/var/named/dyndb-ldap/ipa/"
|
||||
BIND_LDAP_DNS_ZONE_WORKDIR = "/var/named/dyndb-ldap/ipa/master/"
|
||||
USR_LIB_DIRSRV = "/usr/lib/dirsrv"
|
||||
LIB_FIREFOX = "/usr/lib/firefox"
|
||||
LIBSOFTHSM2_SO = "/usr/lib/pkcs11/libsofthsm2.so"
|
||||
PAM_KRB5_SO = "/usr/lib/security/pam_krb5.so"
|
||||
LIB_SYSTEMD_SYSTEMD_DIR = "/usr/lib/systemd/system/"
|
||||
BIND_LDAP_SO_64 = "/usr/lib64/bind/ldap.so"
|
||||
USR_LIB_DIRSRV_64 = "/usr/lib64/dirsrv"
|
||||
LIB64_FIREFOX = "/usr/lib64/firefox"
|
||||
LIBSOFTHSM2_SO_64 = "/usr/lib64/pkcs11/libsofthsm2.so"
|
||||
PAM_KRB5_SO_64 = "/usr/lib64/security/pam_krb5.so"
|
||||
LIBEXEC_CERTMONGER_DIR = "/usr/libexec/certmonger"
|
||||
DOGTAG_IPA_CA_RENEW_AGENT_SUBMIT = "/usr/libexec/certmonger/dogtag-ipa-ca-renew-agent-submit"
|
||||
DOGTAG_IPA_RENEW_AGENT_SUBMIT = "/usr/libexec/certmonger/dogtag-ipa-renew-agent-submit"
|
||||
CERTMONGER_DOGTAG_SUBMIT = "/usr/libexec/certmonger/dogtag-submit"
|
||||
IPA_SERVER_GUARD = "/usr/libexec/certmonger/ipa-server-guard"
|
||||
GENERATE_RNDC_KEY = "/usr/libexec/generate-rndc-key.sh"
|
||||
LIBEXEC_IPA_DIR = "/usr/libexec/ipa"
|
||||
IPA_DNSKEYSYNCD_REPLICA = "/usr/libexec/ipa/ipa-dnskeysync-replica"
|
||||
IPA_DNSKEYSYNCD = "/usr/libexec/ipa/ipa-dnskeysyncd"
|
||||
IPA_HTTPD_KDCPROXY = "/usr/libexec/ipa/ipa-httpd-kdcproxy"
|
||||
IPA_ODS_EXPORTER = "/usr/libexec/ipa/ipa-ods-exporter"
|
||||
IPA_PKI_RETRIEVE_KEY = "/usr/libexec/ipa/ipa-pki-retrieve-key"
|
||||
IPA_HTTPD_PASSWD_READER = "/usr/libexec/ipa/ipa-httpd-pwdreader"
|
||||
IPA_PKI_WAIT_RUNNING = "/usr/libexec/ipa/ipa-pki-wait-running"
|
||||
DNSSEC_KEYFROMLABEL = "/usr/sbin/dnssec-keyfromlabel-pkcs11"
|
||||
GETSEBOOL = "/usr/sbin/getsebool"
|
||||
GROUPADD = "/usr/sbin/groupadd"
|
||||
@@ -260,14 +236,14 @@ class BasePathNamespace:
|
||||
PKIDESTROY = "/usr/sbin/pkidestroy"
|
||||
PKISPAWN = "/usr/sbin/pkispawn"
|
||||
PKI = "/usr/bin/pki"
|
||||
REMOVE_DS_PL = "/usr/sbin/remove-ds.pl"
|
||||
RESTORECON = "/usr/sbin/restorecon"
|
||||
SELINUXENABLED = "/usr/sbin/selinuxenabled"
|
||||
SETSEBOOL = "/usr/sbin/setsebool"
|
||||
SETUP_DS_PL = "/usr/sbin/setup-ds.pl"
|
||||
SMBD = "/usr/sbin/smbd"
|
||||
USERADD = "/usr/sbin/useradd"
|
||||
FONTS_DIR = "/usr/share/fonts"
|
||||
FONTS_OPENSANS_DIR = "/usr/share/fonts/open-sans"
|
||||
FONTS_FONTAWESOME_DIR = "/usr/share/fonts/fontawesome"
|
||||
USR_SHARE_IPA_DIR = "/usr/share/ipa/"
|
||||
USR_SHARE_IPA_CLIENT_DIR = "/usr/share/ipa/client"
|
||||
CA_TOPOLOGY_ULDIF = "/usr/share/ipa/ca-topology.uldif"
|
||||
@@ -283,6 +259,7 @@ class BasePathNamespace:
|
||||
IPA_JS_PLUGINS_DIR = "/usr/share/ipa/ui/js/plugins"
|
||||
UPDATES_DIR = "/usr/share/ipa/updates/"
|
||||
DICT_WORDS = "/usr/share/dict/words"
|
||||
CACHE_IPA_SESSIONS = "/var/cache/ipa/sessions"
|
||||
VAR_KERBEROS_KRB5KDC_DIR = "/var/kerberos/krb5kdc/"
|
||||
VAR_KRB5KDC_K5_REALM = "/var/kerberos/krb5kdc/.k5."
|
||||
CACERT_PEM = "/var/kerberos/krb5kdc/cacert.pem"
|
||||
@@ -299,6 +276,11 @@ class BasePathNamespace:
|
||||
CERTMONGER_REQUESTS_DIR = "/var/lib/certmonger/requests/"
|
||||
VAR_LIB_DIRSRV = "/var/lib/dirsrv"
|
||||
DIRSRV_BOOT_LDIF = "/var/lib/dirsrv/boot.ldif"
|
||||
VAR_LIB_DIRSRV_INSTANCE_SCRIPTS_TEMPLATE = "/var/lib/dirsrv/scripts-%s"
|
||||
VAR_LIB_SLAPD_INSTANCE_DIR_TEMPLATE = "/var/lib/dirsrv/slapd-%s"
|
||||
SLAPD_INSTANCE_BACKUP_DIR_TEMPLATE = "/var/lib/dirsrv/slapd-%s/bak/%s"
|
||||
SLAPD_INSTANCE_DB_DIR_TEMPLATE = "/var/lib/dirsrv/slapd-%s/db/%s"
|
||||
SLAPD_INSTANCE_LDIF_DIR_TEMPLATE = "/var/lib/dirsrv/slapd-%s/ldif"
|
||||
VAR_LIB_IPA = "/var/lib/ipa"
|
||||
IPA_CLIENT_SYSRESTORE = "/var/lib/ipa-client/sysrestore"
|
||||
SYSRESTORE_INDEX = "/var/lib/ipa-client/sysrestore/sysrestore.index"
|
||||
@@ -326,21 +308,22 @@ class BasePathNamespace:
|
||||
"/var/lib/pki/pki-tomcat/ca/profiles/ca/caSignedLogCert.cfg")
|
||||
KRA_CS_CFG_PATH = "/var/lib/pki/pki-tomcat/conf/kra/CS.cfg"
|
||||
KRACERT_P12 = "/root/kracert.p12"
|
||||
SAMBA_DIR = "/var/lib/samba"
|
||||
SAMBA_DIR = "/var/lib/samba/"
|
||||
SSSD_DB = "/var/lib/sss/db"
|
||||
SSSD_MC_GROUP = "/var/lib/sss/mc/group"
|
||||
SSSD_MC_PASSWD = "/var/lib/sss/mc/passwd"
|
||||
SSSD_PUBCONF_DIR = "/var/lib/sss/pubconf"
|
||||
SSSD_PUBCONF_KNOWN_HOSTS = "/var/lib/sss/pubconf/known_hosts"
|
||||
SSSD_PUBCONF_KRB5_INCLUDE_D_DIR = "/var/lib/sss/pubconf/krb5.include.d/"
|
||||
VAR_LOG_AUDIT = "/var/log/audit/audit.log"
|
||||
DIRSRV_LOCK_DIR = "/var/lock/dirsrv"
|
||||
VAR_LOG_DIRSRV_INSTANCE_TEMPLATE = "/var/log/dirsrv/slapd-%s"
|
||||
SLAPD_INSTANCE_ACCESS_LOG_TEMPLATE = "/var/log/dirsrv/slapd-%s/access"
|
||||
SLAPD_INSTANCE_ERROR_LOG_TEMPLATE = "/var/log/dirsrv/slapd-%s/errors"
|
||||
VAR_LOG_HTTPD_DIR = "/var/log/httpd"
|
||||
VAR_LOG_HTTPD_ERROR = "/var/log/httpd/error_log"
|
||||
IPABACKUP_LOG = "/var/log/ipabackup.log"
|
||||
IPACLIENT_INSTALL_LOG = "/var/log/ipaclient-install.log"
|
||||
IPACLIENT_UNINSTALL_LOG = "/var/log/ipaclient-uninstall.log"
|
||||
IPACLIENTSAMBA_INSTALL_LOG = "/var/log/ipaclientsamba-install.log"
|
||||
IPACLIENTSAMBA_UNINSTALL_LOG = "/var/log/ipaclientsamba-uninstall.log"
|
||||
IPAREPLICA_CA_INSTALL_LOG = "/var/log/ipareplica-ca-install.log"
|
||||
IPAREPLICA_CONNCHECK_LOG = "/var/log/ipareplica-conncheck.log"
|
||||
IPAREPLICA_INSTALL_LOG = "/var/log/ipareplica-install.log"
|
||||
@@ -349,13 +332,10 @@ class BasePathNamespace:
|
||||
IPASERVER_KRA_INSTALL_LOG = "/var/log/ipaserver-kra-install.log"
|
||||
IPASERVER_UNINSTALL_LOG = "/var/log/ipaserver-uninstall.log"
|
||||
IPAUPGRADE_LOG = "/var/log/ipaupgrade.log"
|
||||
IPATRUSTENABLEAGENT_LOG = "/var/log/ipatrust-enable-agent.log"
|
||||
IPAEPN_LOG = "/var/log/ipaepn.log"
|
||||
KADMIND_LOG = "/var/log/kadmind.log"
|
||||
KRB5KDC_LOG = "/var/log/krb5kdc.log"
|
||||
MESSAGES = "/var/log/messages"
|
||||
VAR_LOG_PKI_DIR = "/var/log/pki/"
|
||||
BIN_TOMCAT = "/usr/sbin/tomcat"
|
||||
TOMCAT_TOPLEVEL_DIR = "/var/log/pki/pki-tomcat"
|
||||
TOMCAT_CA_DIR = "/var/log/pki/pki-tomcat/ca"
|
||||
TOMCAT_CA_ARCHIVE_DIR = "/var/log/pki/pki-tomcat/ca/archive"
|
||||
@@ -369,28 +349,30 @@ class BasePathNamespace:
|
||||
VAR_OPENDNSSEC_DIR = "/var/opendnssec"
|
||||
OPENDNSSEC_KASP_DB = "/var/opendnssec/kasp.db"
|
||||
IPA_ODS_EXPORTER_CCACHE = "/var/opendnssec/tmp/ipa-ods-exporter.ccache"
|
||||
VAR_RUN_DIRSRV_DIR = "/run/dirsrv"
|
||||
VAR_RUN_DIRSRV_DIR = "/var/run/dirsrv"
|
||||
IPA_CCACHES = "/run/ipa/ccaches"
|
||||
HTTP_CCACHE = "/var/lib/ipa/gssproxy/http.ccache"
|
||||
CA_BUNDLE_PEM = "/var/lib/ipa-client/pki/ca-bundle.pem"
|
||||
KDC_CA_BUNDLE_PEM = "/var/lib/ipa-client/pki/kdc-ca-bundle.pem"
|
||||
IPA_RENEWAL_LOCK = "/run/ipa/renewal.lock"
|
||||
SVC_LIST_FILE = "/run/ipa/services.list"
|
||||
KRB5CC_SAMBA = "/run/samba/krb5cc_samba"
|
||||
SLAPD_INSTANCE_SOCKET_TEMPLATE = "/run/slapd-%s.socket"
|
||||
IPA_RENEWAL_LOCK = "/var/run/ipa/renewal.lock"
|
||||
SVC_LIST_FILE = "/var/run/ipa/services.list"
|
||||
KRB5CC_SAMBA = "/var/run/samba/krb5cc_samba"
|
||||
SLAPD_INSTANCE_SOCKET_TEMPLATE = "/var/run/slapd-%s.socket"
|
||||
ALL_SLAPD_INSTANCE_SOCKETS = "/var/run/slapd-*.socket"
|
||||
ADMIN_CERT_PATH = '/root/.dogtag/pki-tomcat/ca_admin.cert'
|
||||
ENTROPY_AVAIL = '/proc/sys/kernel/random/entropy_avail'
|
||||
LDIF2DB = '/usr/sbin/ldif2db'
|
||||
DB2LDIF = '/usr/sbin/db2ldif'
|
||||
BAK2DB = '/usr/sbin/bak2db'
|
||||
DB2BAK = '/usr/sbin/db2bak'
|
||||
KDCPROXY_CONFIG = '/etc/ipa/kdcproxy/kdcproxy.conf'
|
||||
CERTMONGER = '/usr/sbin/certmonger'
|
||||
NETWORK_MANAGER_CONFIG_DIR = '/etc/NetworkManager/conf.d'
|
||||
NETWORK_MANAGER_IPA_CONF = '/etc/NetworkManager/conf.d/zzz-ipa.conf'
|
||||
SYSTEMD_RESOLVED_IPA_CONF = '/etc/systemd/resolved.conf.d/zzz-ipa.conf'
|
||||
IPA_CUSTODIA_CONF_DIR = '/etc/ipa/custodia'
|
||||
IPA_CUSTODIA_CONF = '/etc/ipa/custodia/custodia.conf'
|
||||
IPA_CUSTODIA_KEYS = '/etc/ipa/custodia/server.keys'
|
||||
IPA_CUSTODIA_SOCKET = '/run/httpd/ipa-custodia.sock'
|
||||
IPA_CUSTODIA_AUDIT_LOG = '/var/log/ipa-custodia.audit.log'
|
||||
IPA_CUSTODIA_HANDLER = "/usr/libexec/ipa/custodia"
|
||||
IPA_GETKEYTAB = '/usr/sbin/ipa-getkeytab'
|
||||
EXTERNAL_SCHEMA_DIR = '/usr/share/ipa/schema.d'
|
||||
GSSPROXY_CONF = '/etc/gssproxy/10-ipa.conf'
|
||||
@@ -400,64 +382,12 @@ class BasePathNamespace:
|
||||
AUTHCONFIG = None
|
||||
AUTHSELECT = None
|
||||
SYSCONF_NETWORK = None
|
||||
ETC_PKCS11_MODULES_DIR = "/etc/pkcs11/modules"
|
||||
# 389 DS related commands.
|
||||
DSCREATE = '/usr/sbin/dscreate'
|
||||
DSCTL = '/usr/sbin/dsctl'
|
||||
DSCONF = '/usr/sbin/dsconf'
|
||||
# DS related constants
|
||||
ETC_DIRSRV = "/etc/dirsrv"
|
||||
DS_KEYTAB = "/etc/dirsrv/ds.keytab"
|
||||
ETC_DIRSRV_SLAPD_INSTANCE_TEMPLATE = "/etc/dirsrv/slapd-%s"
|
||||
USR_LIB_DIRSRV = "/usr/lib/dirsrv"
|
||||
USR_LIB_DIRSRV_64 = "/usr/lib64/dirsrv"
|
||||
VAR_LIB_DIRSRV_INSTANCE_SCRIPTS_TEMPLATE = "/var/lib/dirsrv/scripts-%s"
|
||||
VAR_LIB_SLAPD_INSTANCE_DIR_TEMPLATE = "/var/lib/dirsrv/slapd-%s"
|
||||
SLAPD_INSTANCE_BACKUP_DIR_TEMPLATE = "/var/lib/dirsrv/slapd-%s/bak/%s"
|
||||
SLAPD_INSTANCE_DB_DIR_TEMPLATE = "/var/lib/dirsrv/slapd-%s/db/%s"
|
||||
SLAPD_INSTANCE_LDIF_DIR_TEMPLATE = "/var/lib/dirsrv/slapd-%s/ldif"
|
||||
DIRSRV_LOCK_DIR = "/run/lock/dirsrv"
|
||||
ALL_SLAPD_INSTANCE_SOCKETS = "/run/slapd-*.socket"
|
||||
VAR_LOG_DIRSRV_INSTANCE_TEMPLATE = "/var/log/dirsrv/slapd-%s"
|
||||
VAR_LOG_DIRSRV = "/var/log/dirsrv/"
|
||||
SLAPD_INSTANCE_ACCESS_LOG_TEMPLATE = "/var/log/dirsrv/slapd-%s/access"
|
||||
SLAPD_INSTANCE_ERROR_LOG_TEMPLATE = "/var/log/dirsrv/slapd-%s/errors"
|
||||
SLAPD_INSTANCE_AUDIT_LOG_TEMPLATE = "/var/log/dirsrv/slapd-%s/audit"
|
||||
SLAPD_INSTANCE_SYSTEMD_IPA_ENV_TEMPLATE = \
|
||||
"/etc/systemd/system/dirsrv@%s.service.d/ipa-env.conf"
|
||||
IPA_SERVER_UPGRADE = '/usr/sbin/ipa-server-upgrade'
|
||||
KEYCTL = '/bin/keyctl'
|
||||
KEYCTL = '/usr/bin/keyctl'
|
||||
GETENT = '/usr/bin/getent'
|
||||
SSHD = '/usr/sbin/sshd'
|
||||
SSSCTL = '/usr/sbin/sssctl'
|
||||
LIBARCH = "64"
|
||||
TDBTOOL = '/usr/bin/tdbtool'
|
||||
SECRETS_TDB = '/var/lib/samba/private/secrets.tdb'
|
||||
|
||||
def check_paths(self):
|
||||
"""Check paths for missing files
|
||||
|
||||
python3 -c 'from ipaplatform.paths import paths; paths.check_paths()'
|
||||
"""
|
||||
executables = (
|
||||
"/bin", "/sbin", "/usr/bin", "/usr/sbin",
|
||||
self.LIBEXEC_IPA_DIR, self.LIBEXEC_CERTMONGER_DIR
|
||||
)
|
||||
for name in sorted(dir(self)):
|
||||
if not name[0].isupper():
|
||||
continue
|
||||
|
||||
value = getattr(self, name)
|
||||
if not value or not isinstance(value, str):
|
||||
# skip empty values
|
||||
continue
|
||||
if "%" in value or "{" in value:
|
||||
# skip templates
|
||||
continue
|
||||
|
||||
if value.startswith(executables) and value not in executables:
|
||||
if not os.path.isfile(value):
|
||||
print("Missing executable {}={}".format(name, value))
|
||||
|
||||
|
||||
paths = BasePathNamespace()
|
||||
|
||||
@@ -35,7 +35,6 @@ import six
|
||||
|
||||
from ipapython import ipautil
|
||||
from ipaplatform.paths import paths
|
||||
from ipaplatform.tasks import tasks
|
||||
|
||||
# pylint: disable=no-name-in-module, import-error
|
||||
if six.PY3:
|
||||
@@ -50,16 +49,11 @@ logger = logging.getLogger(__name__)
|
||||
# *some* naming, set them as in Red Hat distributions. Actual implementation
|
||||
# should make them available through knownservices.<name> and take care of
|
||||
# re-mapping internally, if needed
|
||||
wellknownservices = [
|
||||
'certmonger', 'dirsrv', 'httpd', 'ipa', 'krb5kdc',
|
||||
'dbus', 'nslcd', 'nscd', 'ntpd', 'portmap',
|
||||
'rpcbind', 'kadmin', 'sshd', 'autofs', 'rpcgssd',
|
||||
'rpcidmapd', 'pki_tomcatd', 'chronyd', 'domainname',
|
||||
'named', 'ods_enforcerd', 'ods_signerd', 'gssproxy',
|
||||
'nfs-utils', 'sssd', 'NetworkManager', 'ipa-custodia',
|
||||
'ipa-dnskeysyncd', 'ipa-otpd', 'ipa-ods-exporter',
|
||||
'systemd-resolved',
|
||||
]
|
||||
wellknownservices = ['certmonger', 'dirsrv', 'httpd', 'ipa', 'krb5kdc',
|
||||
'dbus', 'nslcd', 'nscd', 'ntpd', 'portmap',
|
||||
'rpcbind', 'kadmin', 'sshd', 'autofs', 'rpcgssd',
|
||||
'rpcidmapd', 'pki_tomcatd', 'chronyd', 'domainname',
|
||||
'named', 'ods_enforcerd', 'ods_signerd', 'gssproxy']
|
||||
|
||||
# The common ports for these services. This is used to wait for the
|
||||
# service to become available.
|
||||
@@ -102,7 +96,7 @@ class KnownServices(Mapping):
|
||||
raise AttributeError(name)
|
||||
|
||||
|
||||
class PlatformService:
|
||||
class PlatformService(object):
|
||||
"""
|
||||
PlatformService abstracts out external process running on the system
|
||||
which is possible to administer (start, stop, check status, etc).
|
||||
@@ -174,9 +168,6 @@ class PlatformService:
|
||||
def restart(self, instance_name="", capture_output=True, wait=True):
|
||||
pass
|
||||
|
||||
def try_restart(self, instance_name="", capture_output=True, wait=True):
|
||||
pass
|
||||
|
||||
def is_running(self, instance_name="", wait=True):
|
||||
return False
|
||||
|
||||
@@ -342,10 +333,6 @@ class SystemdService(PlatformService):
|
||||
self._restart_base(instance_name, "restart",
|
||||
capture_output, wait)
|
||||
|
||||
def try_restart(self, instance_name="", capture_output=True, wait=True):
|
||||
self._restart_base(instance_name, "try-restart",
|
||||
capture_output, wait)
|
||||
|
||||
def is_running(self, instance_name="", wait=True):
|
||||
instance = self.service_instance(instance_name, 'is-active')
|
||||
|
||||
@@ -464,7 +451,7 @@ class SystemdService(PlatformService):
|
||||
# Link exists and it is broken, make new one
|
||||
os.unlink(srv_lnk)
|
||||
os.symlink(self.lib_path, srv_lnk)
|
||||
tasks.systemd_daemon_reload()
|
||||
ipautil.run([paths.SYSTEMCTL, "--system", "daemon-reload"])
|
||||
except Exception:
|
||||
pass
|
||||
else:
|
||||
@@ -487,7 +474,7 @@ class SystemdService(PlatformService):
|
||||
if os.path.isdir(srv_tgt):
|
||||
if os.path.islink(srv_lnk):
|
||||
os.unlink(srv_lnk)
|
||||
tasks.systemd_daemon_reload()
|
||||
ipautil.run([paths.SYSTEMCTL, "--system", "daemon-reload"])
|
||||
except Exception:
|
||||
pass
|
||||
else:
|
||||
|
||||
@@ -24,31 +24,17 @@ This module contains default platform-specific implementations of system tasks.
|
||||
|
||||
from __future__ import absolute_import
|
||||
|
||||
import os
|
||||
import logging
|
||||
import textwrap
|
||||
|
||||
from pkg_resources import parse_version
|
||||
|
||||
from ipaplatform.paths import paths
|
||||
from ipapython import ipautil
|
||||
from ipapython.ipachangeconf import IPAChangeConf
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
# TODO: Add other masters as FallbackDNS ?
|
||||
RESOLVE1_IPA_CONF = textwrap.dedent("""
|
||||
# auto-generated by IPA installer
|
||||
[Resolve]
|
||||
# use local BIND instance
|
||||
DNS=127.0.0.1
|
||||
# make local BIND default DNS server, add search suffixes
|
||||
Domains=~. {searchdomains}
|
||||
""")
|
||||
|
||||
|
||||
class BaseTaskNamespace:
|
||||
class BaseTaskNamespace(object):
|
||||
|
||||
def restore_context(self, filepath, force=False):
|
||||
"""Restore SELinux security context on the given filepath.
|
||||
@@ -84,23 +70,6 @@ class BaseTaskNamespace:
|
||||
Returns True if the operation succeeded, False otherwise.
|
||||
"""
|
||||
|
||||
try:
|
||||
if self.platform_insert_ca_certs(ca_certs):
|
||||
return self.reload_systemwide_ca_store()
|
||||
except Exception:
|
||||
logger.exception('Could not populate systemwide CA store')
|
||||
|
||||
return False
|
||||
|
||||
def platform_insert_ca_certs(self, ca_certs):
|
||||
"""
|
||||
Platform implementations override this method to implement
|
||||
population of the systemwide CA store.
|
||||
|
||||
Returns True if changes were made to the CA store, False otherwise.
|
||||
|
||||
Raises Exception if something went wrong.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
def remove_ca_certs_from_systemwide_ca_store(self):
|
||||
@@ -111,25 +80,6 @@ class BaseTaskNamespace:
|
||||
Returns True if the operation succeeded, False otherwise.
|
||||
"""
|
||||
|
||||
try:
|
||||
if self.platform_remove_ca_certs():
|
||||
return self.reload_systemwide_ca_store()
|
||||
except Exception:
|
||||
logger.exception(
|
||||
'Could not remove certificates from systemwide CA store'
|
||||
)
|
||||
|
||||
return False
|
||||
|
||||
def platform_remove_ca_certs(self):
|
||||
"""
|
||||
Platform implementations override this method to implement
|
||||
removal of certificates from the systemwide CA store.
|
||||
|
||||
Returns True if changes were made to the CA store, False otherwise.
|
||||
|
||||
Raises Exception if something went wrong.
|
||||
"""
|
||||
raise NotImplementedError()
|
||||
|
||||
def get_svc_list_file(self):
|
||||
@@ -139,24 +89,16 @@ class BaseTaskNamespace:
|
||||
|
||||
return paths.SVC_LIST_FILE
|
||||
|
||||
def is_selinux_enabled(self):
|
||||
"""Check if SELinux is available and enabled
|
||||
|
||||
:return: True if SELinux is available and enabled
|
||||
"""
|
||||
return False
|
||||
|
||||
def check_selinux_status(self):
|
||||
"""Checks if SELinux is available on the platform.
|
||||
|
||||
If it is, this task also makes sure that restorecon tool is available.
|
||||
"""
|
||||
Checks if SELinux is available on the platform. If it is, this task
|
||||
also makes sure that restorecon tool is available.
|
||||
|
||||
If SELinux is available, but restorcon tool is not installed, raises
|
||||
an RuntimeError, which suggest installing the package containing
|
||||
restorecon and rerunning the installation.
|
||||
|
||||
:return: True if SELinux is available and enabled
|
||||
"""
|
||||
|
||||
raise NotImplementedError()
|
||||
|
||||
def check_ipv6_stack_enabled(self):
|
||||
@@ -164,14 +106,6 @@ class BaseTaskNamespace:
|
||||
|
||||
raise NotImplementedError()
|
||||
|
||||
def detect_container(self):
|
||||
"""Check if running inside a container
|
||||
|
||||
:returns: container runtime or None
|
||||
:rtype: str, None
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def restore_hostname(self, fstore, statestore):
|
||||
"""
|
||||
Restores the original hostname as backed up in the
|
||||
@@ -221,12 +155,7 @@ class BaseTaskNamespace:
|
||||
"""
|
||||
Check if the flag --no-sssd is supported for client install.
|
||||
"""
|
||||
return True
|
||||
|
||||
def is_mkhomedir_supported(self):
|
||||
"""
|
||||
Check if the flag --mkhomedir is supported for client install.
|
||||
"""
|
||||
return True
|
||||
|
||||
def backup_auth_configuration(self, path):
|
||||
@@ -299,10 +228,6 @@ class BaseTaskNamespace:
|
||||
"""Configure WSGI for correct Python version"""
|
||||
raise NotImplementedError()
|
||||
|
||||
def configure_httpd_protocol(self):
|
||||
"""Configure TLS protocols in Apache"""
|
||||
raise NotImplementedError()
|
||||
|
||||
def is_fips_enabled(self):
|
||||
return False
|
||||
|
||||
@@ -318,225 +243,5 @@ class BaseTaskNamespace:
|
||||
def setup_httpd_logging(self):
|
||||
raise NotImplementedError()
|
||||
|
||||
def systemd_daemon_reload(self):
|
||||
"""Tell systemd to reload config files"""
|
||||
raise NotImplementedError
|
||||
|
||||
def configure_dns_resolver(self, nameservers, searchdomains, *,
|
||||
resolve1_enabled=False, fstore=None):
|
||||
"""Configure global DNS resolver (e.g. /etc/resolv.conf)
|
||||
|
||||
:param nameservers: list of IP addresses
|
||||
:param searchdomains: list of search domaons
|
||||
:param resolve1_enabled: is systemd-resolved enabled?
|
||||
:param fstore: optional file store for backup
|
||||
"""
|
||||
if resolve1_enabled:
|
||||
# break circular import
|
||||
from ipaplatform.services import knownservices
|
||||
|
||||
confd = os.path.dirname(paths.SYSTEMD_RESOLVED_IPA_CONF)
|
||||
os.makedirs(confd, exist_ok=True)
|
||||
|
||||
cfg = RESOLVE1_IPA_CONF.format(
|
||||
searchdomains=" ".join(searchdomains)
|
||||
)
|
||||
with open(paths.SYSTEMD_RESOLVED_IPA_CONF, "w") as f:
|
||||
os.fchmod(f.fileno(), 0o644)
|
||||
f.write(cfg)
|
||||
|
||||
knownservices["systemd-resolved"].reload_or_restart()
|
||||
|
||||
def unconfigure_dns_resolver(self, fstore=None):
|
||||
"""Unconfigure global DNS resolver (e.g. /etc/resolv.conf)
|
||||
|
||||
:param fstore: optional file store for restore
|
||||
"""
|
||||
if fstore is not None and fstore.has_file(paths.RESOLV_CONF):
|
||||
fstore.restore_file(paths.RESOLV_CONF)
|
||||
|
||||
if os.path.isfile(paths.SYSTEMD_RESOLVED_IPA_CONF):
|
||||
# break circular import
|
||||
from ipaplatform.services import knownservices
|
||||
|
||||
os.unlink(paths.SYSTEMD_RESOLVED_IPA_CONF)
|
||||
knownservices["systemd-resolved"].reload_or_restart()
|
||||
|
||||
def configure_pkcs11_modules(self, fstore):
|
||||
"""Disable p11-kit modules
|
||||
|
||||
The p11-kit configuration injects p11-kit-proxy into all NSS
|
||||
databases. Amongst other p11-kit loads SoftHSM2 PKCS#11 provider.
|
||||
This interferes with 389-DS, certmonger, Dogtag and other services.
|
||||
For example certmonger tries to open OpenDNSSEC's SoftHSM2 token,
|
||||
although it doesn't use it at all. It also breaks Dogtag HSM support
|
||||
testing with SoftHSM2.
|
||||
|
||||
IPA server does neither need nor use SoftHSM2 proxied by p11-kit.
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def restore_pkcs11_modules(self, fstore):
|
||||
"""Restore global p11-kit modules for NSS
|
||||
"""
|
||||
raise NotImplementedError
|
||||
|
||||
def get_pkcs11_modules(self):
|
||||
"""Return the list of module config files setup by IPA.
|
||||
"""
|
||||
return ()
|
||||
|
||||
def configure_nsswitch_database(self, fstore, database, services,
|
||||
preserve=True, append=True,
|
||||
default_value=()):
|
||||
"""
|
||||
Edits the specified nsswitch.conf database (e.g. passwd, group,
|
||||
sudoers) to use the specified service(s).
|
||||
|
||||
Arguments:
|
||||
fstore - FileStore to backup the nsswitch.conf
|
||||
database - database configuration that should be ammended,
|
||||
e.g. 'sudoers'
|
||||
service - list of services that should be added, e.g. ['sss']
|
||||
preserve - if True, the already configured services will be
|
||||
preserved
|
||||
|
||||
The next arguments modify the behaviour if preserve=True:
|
||||
append - if True, the services will be appended, if False,
|
||||
prepended
|
||||
default_value - list of services that are considered as default (if
|
||||
the database is not mentioned in nsswitch.conf),
|
||||
e.g. ['files']
|
||||
"""
|
||||
|
||||
# Backup the original version of nsswitch.conf, we're going to edit it
|
||||
# now
|
||||
if not fstore.has_file(paths.NSSWITCH_CONF):
|
||||
fstore.backup_file(paths.NSSWITCH_CONF)
|
||||
|
||||
conf = IPAChangeConf("IPA Installer")
|
||||
conf.setOptionAssignment(':')
|
||||
|
||||
if preserve:
|
||||
# Read the existing configuration
|
||||
with open(paths.NSSWITCH_CONF, 'r') as f:
|
||||
opts = conf.parse(f)
|
||||
raw_database_entry = conf.findOpts(opts, 'option', database)[1]
|
||||
|
||||
# Detect the list of already configured services
|
||||
if not raw_database_entry:
|
||||
# If there is no database entry, database is not present in
|
||||
# the nsswitch.conf. Set the list of services to the
|
||||
# default list, if passed.
|
||||
configured_services = list(default_value)
|
||||
else:
|
||||
configured_services = raw_database_entry[
|
||||
'value'].strip().split()
|
||||
|
||||
# Make sure no service is added if already mentioned in the list
|
||||
added_services = [s for s in services
|
||||
if s not in configured_services]
|
||||
|
||||
# Prepend / append the list of new services
|
||||
if append:
|
||||
new_value = ' ' + ' '.join(configured_services +
|
||||
added_services)
|
||||
else:
|
||||
new_value = ' ' + ' '.join(added_services +
|
||||
configured_services)
|
||||
|
||||
else:
|
||||
# Preserve not set, let's rewrite existing configuration
|
||||
new_value = ' ' + ' '.join(services)
|
||||
|
||||
# Set new services as sources for database
|
||||
opts = [
|
||||
conf.setOption(database, new_value),
|
||||
conf.emptyLine(),
|
||||
]
|
||||
|
||||
conf.changeConf(paths.NSSWITCH_CONF, opts)
|
||||
logger.info("Configured %s in %s", database, paths.NSSWITCH_CONF)
|
||||
|
||||
def enable_sssd_sudo(self, fstore):
|
||||
"""Configure nsswitch.conf to use sssd for sudo"""
|
||||
self.configure_nsswitch_database(
|
||||
fstore, 'sudoers', ['sss'],
|
||||
default_value=['files'])
|
||||
|
||||
def enable_ldap_automount(self, statestore):
|
||||
"""
|
||||
Point automount to ldap in nsswitch.conf.
|
||||
This function is for non-SSSD setups only.
|
||||
"""
|
||||
conf = IPAChangeConf("IPA Installer")
|
||||
conf.setOptionAssignment(':')
|
||||
|
||||
with open(paths.NSSWITCH_CONF, 'r') as f:
|
||||
current_opts = conf.parse(f)
|
||||
current_nss_value = conf.findOpts(
|
||||
current_opts, name='automount', type='option'
|
||||
)[1]
|
||||
if current_nss_value is None:
|
||||
# no automount database present
|
||||
current_nss_value = False # None cannot be backed up
|
||||
else:
|
||||
current_nss_value = current_nss_value['value']
|
||||
statestore.backup_state(
|
||||
'ipa-client-automount-nsswitch', 'previous-automount',
|
||||
current_nss_value
|
||||
)
|
||||
|
||||
nss_value = ' files ldap'
|
||||
opts = [
|
||||
{
|
||||
'name': 'automount',
|
||||
'type': 'option',
|
||||
'action': 'set',
|
||||
'value': nss_value,
|
||||
},
|
||||
{'name': 'empty', 'type': 'empty'},
|
||||
]
|
||||
conf.changeConf(paths.NSSWITCH_CONF, opts)
|
||||
|
||||
logger.info("Configured %s", paths.NSSWITCH_CONF)
|
||||
|
||||
def disable_ldap_automount(self, statestore):
|
||||
"""Disable automount using LDAP"""
|
||||
if statestore.get_state(
|
||||
'ipa-client-automount-nsswitch', 'previous-automount'
|
||||
) is False:
|
||||
# Previous nsswitch.conf had no automount database configured
|
||||
# so remove it.
|
||||
conf = IPAChangeConf("IPA automount installer")
|
||||
conf.setOptionAssignment(':')
|
||||
changes = [conf.rmOption('automount')]
|
||||
conf.changeConf(paths.NSSWITCH_CONF, changes)
|
||||
self.restore_context(paths.NSSWITCH_CONF)
|
||||
statestore.delete_state(
|
||||
'ipa-client-automount-nsswitch', 'previous-automount'
|
||||
)
|
||||
elif statestore.get_state(
|
||||
'ipa-client-automount-nsswitch', 'previous-automount'
|
||||
) is not None:
|
||||
nss_value = statestore.get_state(
|
||||
'ipa-client-automount-nsswitch', 'previous-automount'
|
||||
)
|
||||
opts = [
|
||||
{
|
||||
'name': 'automount',
|
||||
'type': 'option',
|
||||
'action': 'set',
|
||||
'value': nss_value,
|
||||
},
|
||||
{'name': 'empty', 'type': 'empty'},
|
||||
]
|
||||
conf = IPAChangeConf("IPA automount installer")
|
||||
conf.setOptionAssignment(':')
|
||||
conf.changeConf(paths.NSSWITCH_CONF, opts)
|
||||
self.restore_context(paths.NSSWITCH_CONF)
|
||||
statestore.delete_state(
|
||||
'ipa-client-automount-nsswitch', 'previous-automount'
|
||||
)
|
||||
|
||||
tasks = BaseTaskNamespace()
|
||||
|
||||
Reference in New Issue
Block a user