/*-
 * Copyright 2020 UPLEX - Nils Goroll Systemoptimierung
 * All rights reserved.
 *
 * Author: Nils Goroll <nils.goroll@uplex.de>
 *
 * SPDX-License-Identifier: BSD-2-Clause
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * definition of privileges to use for the different Vinyl Jail (VJ)
 * levels
 */
#define E VJS_MASK(VJS_EFFECTIVE)	// as-is
#define I VJS_MASK(VJS_INHERITABLE)	// as-is
#define P VJS_MASK(VJS_PERMITTED)	// joined with effective
#define L VJS_MASK(VJS_LIMIT)		// joined with of all the above

/* ------------------------------------------------------------
 * MASTER
 * - only EFFECTIVE & INHERITABLE are per JAIL state
 * - other priv sets are shared across all MASTER_* JAIL states
 *
 * MASTER implicit rules (vjs_master_rules())
 * - INHERITABLE and PERMITTED from SUBPROC* joined into PERMITTED
 * - implicit rules from above
 */
PRIV(MASTER_LOW,	E	, "file_write")	// XXX vcl_boot
PRIV(MASTER_LOW,	E	, "file_read")	// XXX library open
PRIV(MASTER_LOW,	E	, "net_access")

PRIV(MASTER_SYSTEM,	E|I	, PRIV_PROC_EXEC)
PRIV(MASTER_SYSTEM,	E|I	, PRIV_PROC_FORK)
PRIV(MASTER_SYSTEM,	E|I	, "file_read")
PRIV(MASTER_SYSTEM,	E|I	, "file_write")

PRIV(MASTER_FILE,	E	, "file_read")
PRIV(MASTER_FILE,	E	, "file_write")

PRIV(MASTER_STORAGE,	E	, "file_read")
PRIV(MASTER_STORAGE,	E	, "file_write")

PRIV(MASTER_PRIVPORT,	E	, "file_write")		// bind(AF_UNIX)
PRIV(MASTER_PRIVPORT,	E	, PRIV_FILE_CHOWN)	// user=
PRIV(MASTER_PRIVPORT,	E	, PRIV_FILE_OWNER)	// mode=
PRIV(MASTER_PRIVPORT,	E	, "net_access")
PRIV(MASTER_PRIVPORT,	E	, PRIV_NET_PRIVADDR)

PRIV(MASTER_KILL,	E	, PRIV_PROC_OWNER)

/* ------------------------------------------------------------
 * SUBPROC
 */
PRIV(SUBPROC_VCC,	E	, PRIV_PROC_SETID)	// waived after setuid
PRIV(SUBPROC_VCC,	E	, "file_read")
PRIV(SUBPROC_VCC,	E	, "file_write")

PRIV(SUBPROC_CC,	E	, PRIV_PROC_SETID)	// waived after setuid
PRIV(SUBPROC_CC,	E|I	, PRIV_PROC_EXEC)
PRIV(SUBPROC_CC,	E|I	, PRIV_PROC_FORK)
PRIV(SUBPROC_CC,	E|I	, "file_read")
PRIV(SUBPROC_CC,	E|I	, "file_write")

PRIV(SUBPROC_VCLLOAD,	E	, PRIV_PROC_SETID)	// waived after setuid
PRIV(SUBPROC_VCLLOAD,	E	, "file_read")

PRIV(SUBPROC_WORKER,	E	, PRIV_PROC_SETID)	// waived after setuid
PRIV(SUBPROC_WORKER,	E	, "net_access")
PRIV(SUBPROC_WORKER,	E	, "file_read")
PRIV(SUBPROC_WORKER,	E	, "file_write")
PRIV(SUBPROC_WORKER,	P	, PRIV_PROC_INFO)	// vmod_unix

#undef E
#undef I
#undef P
#undef L
#undef PRIV
