Skip to content
← Back to Functions
Code

Admin Export Permission Gate

Checks whether an admin can export a given dataset and whether fields must be redacted.

Function signature

ogAuthorizeAdminExport(admin_role, export_type, requested_fields = array(), policy = array())

Categories

  • Security

Parameters

admin_roleCurrent admin role already resolved by the caller.export_typeApproved export type being requested.requested_fieldsField list requested for export authorization and redaction review.policyCaller-approved workflow policy for the ecommerce, admin, privacy, or export decision.

Return value

Public-safe status string returned by the function for explicit controller branching or logging.

  • success
  • message
  • data

Compatibility

Existing function name, slug, path, and call order preserved; advertised metadata corrected to the actual source behavior.

Minimum PHP version: 7.4

Security notes

Use caller-owned allowlists and context-specific escaping; validate admin actions, export fields, privacy plans, cache keys, templates, settings, routes, and ecommerce policies before production use.

Code

<?php

/*
 * Copyright (c) 2026 Jeffery L. Paris <jparis@phpog.com>.
 * Free for personal and internal use. Paid project use requires visible credit
 * to Jeffery L. Paris. Corporate use requires a paid license fee unless a
 * separate written license states otherwise.
 */

/**
 * Checks whether an admin can export a dataset and returns the allowed export fields.
 *
 * This function only authorizes and describes the export. It does not run a query,
 * stream a file, or expose data. Sensitive fields are redacted unless policy permits them.
 *
 * @param string $admin_role Current administrator role.
 * @param string $export_type Dataset/export key.
 * @param array $requested_fields Requested field names.
 * @param array $policy Export policy map.
 * @return array Export authorization result.
 */
function ogAuthorizeAdminExport($admin_role, $export_type, $requested_fields = array(), $policy = array()) {
	$result = array(
		'success' => false,
		'message' => '',
		'data' => array()
	);

	$admin_role = strtolower(trim((string)$admin_role));
	$export_type = strtolower(trim((string)$export_type));

	if (!is_array($requested_fields)) {
		$requested_fields = array();
	}

	if (!is_array($policy)) {
		$policy = array();
	}

	if (empty($admin_role)) {
		$result['message'] = 'Missing admin role.';
		return $result;
	}

	if (empty($export_type)) {
		$result['message'] = 'Missing export type.';
		return $result;
	}

	$role_exports = array();
	if (!empty($policy['role_exports']) && is_array($policy['role_exports'])) {
		$role_exports = $policy['role_exports'];
	}

	$export_fields = array();
	if (!empty($policy['export_fields']) && is_array($policy['export_fields'])) {
		$export_fields = $policy['export_fields'];
	}

	$sensitive_fields = array('password', 'password_hash', 'token', 'secret', 'api_key', 'session_id', 'csrf_token');
	if (!empty($policy['sensitive_fields']) && is_array($policy['sensitive_fields'])) {
		$sensitive_fields = $policy['sensitive_fields'];
	}

	$allow_sensitive = false;
	if (!empty($policy['allow_sensitive']) && $policy['allow_sensitive'] === true) {
		$allow_sensitive = true;
	}

	$allowed_export = false;
	if (!empty($role_exports[$admin_role]) && is_array($role_exports[$admin_role])) {
		if (in_array($export_type, $role_exports[$admin_role], true)) {
			$allowed_export = true;
		}
	}

	if (!$allowed_export) {
		$result['message'] = 'Export is not authorized for this admin role.';
		$result['data'] = array(
			'allowed' => false,
			'allowed_fields' => array(),
			'redacted_fields' => array()
		);
		return $result;
	}

	$available_fields = array();
	if (!empty($export_fields[$export_type]) && is_array($export_fields[$export_type])) {
		$available_fields = $export_fields[$export_type];
	}

	$allowed_fields = array();
	$redacted_fields = array();
	foreach ($requested_fields as $field) {
		$field = trim((string)$field);
		if (empty($field)) {
			continue;
		}
		if (!empty($available_fields) && !in_array($field, $available_fields, true)) {
			continue;
		}
		if (in_array($field, $sensitive_fields, true) && !$allow_sensitive) {
			$redacted_fields[] = $field;
			continue;
		}
		$allowed_fields[] = $field;
	}

	if (empty($requested_fields)) {
		foreach ($available_fields as $field) {
			$field = trim((string)$field);
			if (in_array($field, $sensitive_fields, true) && !$allow_sensitive) {
				$redacted_fields[] = $field;
				continue;
			}
			$allowed_fields[] = $field;
		}
	}

	$result['success'] = true;
	$result['message'] = 'Export authorization completed.';
	$result['data'] = array(
		'allowed' => true,
		'export_type' => $export_type,
		'allowed_fields' => array_values(array_unique($allowed_fields)),
		'redacted_fields' => array_values(array_unique($redacted_fields))
	);

	return $result;
}