# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# $Header: $

#
# useradd.eclass
#
# Adds a mechanism for adding users/groups into alternate roots.
#
# This will likely go away.
#
# Authors:
# Google, inc. <chromium-os-dev@chromium.org>
#

HOMEPAGE="http://www.chromium.org/"

# Tests if the user already exists in the passwd file.
#
# $1 - Username (e.g. "messagebus")
user_exists() {
	grep -e "^$1\:" "${ROOT}/etc/passwd" > /dev/null 2>&1
}

# Tests if the group already exists in the group file.
#
# $1 - Groupname (e.g. "messagebus")
group_exists() {
	grep -e "^$1\:" "${ROOT}/etc/group" > /dev/null 2>&1
}

# Add entry to /etc/passwd
#
# $1 - Username (e.g. "messagebus")
# $2 - "*" to indicate not shadowed, "x" to indicate shadowed
# $3 - UID (e.g. 200)
# $4 - GID (e.g. 200)
# $5 - full name (e.g. "")
# $6 - home dir (e.g. "/home/foo" or "/var/run/dbus")
# $7 - shell (e.g. "/bin/sh" or "/bin/false")
add_user() {
	if user_exists "$1"; then
		elog "Skipping add_user of existing user: '$1'"
		return
	fi

	echo "${1}:${2}:${3}:${4}:${5}:${6}:${7}" >> "${ROOT}/etc/passwd"
}

# Remove entry from /etc/passwd
#
# $1 - Username
remove_user() {
	[ -e "${ROOT}/etc/passwd" ] && sed -i -e /^${1}:.\*$/d "${ROOT}/etc/passwd"
}

# Add entry to /etc/shadow
#
# $1 - Username
# $2 - Crypted password
add_shadow() {
	echo "${1}:${2}:14500:0:99999::::" >> "${ROOT}/etc/shadow"
}

# Remove entry from /etc/shadow
#
# $1 - Username
remove_shadow() {
	[ -e "${ROOT}/etc/shadow" ] && sed -i -e /^${1}:.\*$/d "${ROOT}/etc/shadow"
}

# Add entry to /etc/group
# $1 - Groupname (e.g. "messagebus")
# $2 - GID (e.g. 200)
add_group() {
	if group_exists "$1"; then
		elog "Skipping add_group of existing group: '$1'"
		return
	fi
	echo "${1}:x:${2}:" >> "${ROOT}/etc/group"
}

# Copies user entry from host passwd file if it already exists or else
# creates a new user using add_user.
#
# See add_user for argument list.
copy_or_add_user() {
	local username="$1"

	if user_exists "$1"; then
		elog "Skipping copy_or_add_user of existing user '$1'"
		return
	fi

	local entry=$(grep -e "^$1\:" /etc/passwd)
	if [ -n "$entry" ]; then
		elog "Copying existing passwd entry from root: '$entry'"
		echo "$entry" >> "${ROOT}/etc/passwd"
	else
		add_user "$@"
	fi
}

# Copies group entry from host group file if it already exists or else
# creates a new group using add_group.
#
# See add_group for argument list.
copy_or_add_group() {
	local groupname="$1"

	if group_exists "$1"; then
		elog "Skipping copy_or_add_group of existing group '$1'"
		return
	fi

	local entry=$(grep -e "^$1\:" /etc/group)
	if [ -n "$entry" ]; then
		elog "Copying existing group entry from root: '$entry'"
		echo "$entry" >> "${ROOT}/etc/group"
	else
		add_group "$@"
	fi
}
