#!/bin/sh

#
# Copyright (C) 2012 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# Perform login tasks for shill.  This script is called by the "login"
# init script.

# Shill expects to find a user profile in /run/shill/user_profiles.
# There are 3 possible places a user profile could exist.  We should
# use them in the following priority order:
#
#  - "New style" cryptohome store -- we create a link to it in
#    /run/shill/user_profiles so if shill restarts while the
#    user is logged in, shill can regain access to the profile.
#  - User profile in ~chronos/shill -- if the above does not
#    exist, we validate this profile and move it to the cryptohome.
#    We then create a link to it using the step above.
#  - Old flimflam profile in ~chronos/flimflam -- If the above
#    does not exist, we move this to ~chronos/shill as an
#    intermediate step then use the steps above to validate,
#    and copy to the cryptohome profile.

set -e
# The login init script calls this script with the login name of the
# user whose profile is being loaded.
user=$1
script_name=$(basename $0)

profile_user=chronos
profile_name="~${profile_user}/shill"
shill_state_root=/run/shill
profile_link_root="${shill_state_root}/user_profiles"
profile_link_dir="$profile_link_root/$profile_user"
log_link_dir="${shill_state_root}/log"
username_hash=""

# We should not load multiple network profiles.  If a profile link
# directory already exists, we should go no further.
if [ -e "$profile_link_dir" ] ; then
  logger -t "$script_name" "User already logged in; doing nothing."
  exit 0
fi

if [ -n "$user" ] ; then
  profile_base=$(cryptohome-path system $user)
  if [ ! -d "$profile_base" ] ; then
    logger -t "$script_name" \
      "User cryptohome dir $profile_base does not exist"
    exit 1
  fi
  username_hash=$(basename $profile_base)

  # Make references to the older connection manager profiles that lived
  # in the user-owned home directory.
  user_base=$(cryptohome-path user $user)
  if [ -d "$user_base" ] ; then
    flimflam_profile_dir="$user_base/flimflam"
    flimflam_profile="$flimflam_profile_dir/flimflam.profile"
    old_profile_dir="$user_base/shill"
    old_profile="$old_profile_dir/shill.profile"
  fi
else
  # If no user is given, create a temporary profile directory which will
  # be erased on logout.
  profile_base="${shill_state_root}/guest_user_profile"
  rm -rf "$profile_base"
  flimflam_profile=""
  old_profile=""
fi

profile_dir="$profile_base/shill"
profile="$profile_dir/shill.profile"
log_dir="$profile_base/shill_logs"

if [ ! -d "$profile_dir" ]; then
  if ! mkdir -p --mode=700 $profile_dir ; then
    logger -t "$script_name" \
      "Failed to create shill user profile directory $profile_dir"
    exit 1
  fi
fi

# We need to ensure this dir (and files within it) are owned by shill:shill,
# regardless of whether we are creating it on this login or it already existed
# before now. By default, the 'chown -R' command does not follow symlinks, so
# there is no way shill can put a symlink in this dir as means of tricking the
# system into making other files owned by 'shill'. Also, this being the "shill
# user profile directory", it is fine to give shill ownership of all of its
# contents. Although 'chown -R' doesn't follow symlinks, it does affect bind
# mounts, so this code is only safe as long as shill runs without
# CAP_SYS_ADMIN. Ideally we should have some kind of test to make sure shill
# capabilities are never widened to include CAP_SYS_ADMIN -- filed
# crbug.com/869170 to track this issue in the general sense for CrOS system
# services.
if ! chown -R shill:shill "$profile_dir" ; then
  logger -t "$script_name" \
    "Failed to chown shill user profile directory $profile_dir"
  exit 1
fi

if ! mkdir -p --mode 0700 "$profile_link_root"; then
  logger -t "$script_name" \
    "Unable to create shill user profile link directory"
else
  if ! chown shill:shill "$profile_link_root"; then
    logger -t "$script_name" "Unable to chown shill user profile link directory"
  fi
fi

ln -s "$profile_dir" "$profile_link_dir" ||
  logger -t "$script_name" \
    "Failed to create shill user cryptohome link $profile_link_dir"

if ! mkdir -p --mode 0700 "$log_dir"; then
  logger -t "$script_name" \
    "Unable to create shill log directory"
else
  if ! chown shill:shill "$log_dir"; then
    logger -t "$script_name" "Unable to chown shill log directory"
  fi
fi

if [ ! -h "$log_link_dir" ]; then
  ln -s "$log_dir" "$log_link_dir" ||
    logger -t "$script_name" \
      "Failed to create shill logs link $log_link_dir"
fi

if [ ! -f "$profile" ]; then
  if [ -f "$flimflam_profile" ]; then
    if [ -f "$old_profile" ]; then
      logger -t "$script_name" "Removing outdated flimflam user profile"
      rm -f "$flimflam_profile"
      rmdir --ignore-fail-on-non-empty "$flimflam_profile_dir"
    else
      old_profile="$flimflam_profile"
      old_profile_dir="$flimflam_profile_dir"
    fi
  fi

  if [ -f "$old_profile" ] ; then
    test_profile="$profile_dir/shill.profile.test"
    mv "$old_profile" "$test_profile" ||
      logger -t "$script_name" "Failed to test-move old shill profile"
    rmdir --ignore-fail-on-non-empty "$old_profile_dir"

    # Inspect profile to make sure it makes sense as a shill profile,
    # and is properly owned.  Do so while it's in a directory whose
    # contents are unlikely to be modified underneath us.
    if [ -h "$test_profile" ] ; then
      logger -t "$script_name" "Old shill profile is a symlink"
    elif [ ! -f "$test_profile" ] ; then
      logger -t "$script_name" "Old shill profile is not a regular file"
    elif [ ! -O "$test_profile" ] ; then
      logger -t "$script_name" "Old shill profile was not properly owned"
    else
      logger -t "$script_name" "Moving old shill profile from $old_profile"
      mv "$test_profile" "$profile" ||
        logger -t "$script_name" "Failed to copy old shill profile"
    fi
    rm -rf "$test_profile"
  fi
  if [ -e "$old_profile" ] ; then
    # Old profile exists but does not resolve to a regular file!?
    logger -t "$script_name" "Old shill profile is not a file or was not moved"
    rm -rf "$old_profile"
    rmdir --ignore-fail-on-non-empty "$old_profile_dir"
  fi

  if [ ! -f "$profile" ]; then
    # If profile still does not exist, ask shill to create one.
    dbus-send --system --dest=org.chromium.flimflam --print-reply / \
      org.chromium.flimflam.Manager.CreateProfile string:$profile_name ||
        logger -t "$script_name" "Failed to create $profile_name profile"
  fi
fi

# Push user's network profile
dbus-send --system --dest=org.chromium.flimflam --print-reply / \
  org.chromium.flimflam.Manager.InsertUserProfile \
      string:$profile_name string:$username_hash ||
    logger -t "$script_name" "Failed to push $profile_name profile"
