12 private const MAX_ROLE_SEARCH_DEPTH = 5;
18 $this->context = $context;
22 $perms = $this->getInstallUserPermissions();
23 return ( $perms && $perms->rolsuper ) || $perms->rolcreaterole;
27 $perms = $this->getInstallUserPermissions();
28 return $perms && $perms->rolsuper;
42 if ( !$status->isOK() ) {
45 $conn = $status->getDB();
46 $installerId = $conn->selectField(
'pg_catalog.pg_roles',
'oid',
47 [
'rolname' => $this->context->getOption(
'InstallUser' ) ], __METHOD__ );
48 $webId = $conn->selectField(
'pg_catalog.pg_roles',
'oid',
51 return self::isRoleMember( $conn, $installerId, $webId, self::MAX_ROLE_SEARCH_DEPTH );
55 private function getInstallUserPermissions() {
57 if ( !$status->isOK() ) {
60 $conn = $status->getDB();
61 $superuser = $this->context->getOption(
'InstallUser' );
63 $row = $conn->selectRow(
'pg_catalog.pg_roles',
'*',
64 [
'rolname' => $superuser ], __METHOD__ );
77 private function isRoleMember( $conn, $targetMember, $group, $maxDepth ) {
78 if ( $targetMember === $group ) {
83 $res = $conn->select(
'pg_catalog.pg_auth_members', [
'member' ],
84 [
'roleid' => $group ], __METHOD__ );
85 foreach ( $res as $row ) {
86 if ( $row->member == $targetMember ) {
93 $this->isRoleMember( $conn, $targetMember, $row->member, $maxDepth - 1 )