#!/bin/bash

if [ "$initlname" = "" ]; then
  if [ "$lname" = "" ]; then
    initlname=0
  else
    initlname=1
  fi
fi

if type wget >/dev/null 2>/dev/null; then
  WGET=wget
else
  WGET="athrun gnu wget"
fi

if [ "$lname" = "" ]; then
  if [ "$1" = "" ]; then
    echo
    echo "Would you like to sign up:"
    echo "1. Your personal Athena account"
    echo "2. A locker that you control (a club, a course, etc)"
    echo "If you do not understand this question, you should answer '1'."
    printf "Please enter either '1' or '2' (without quotes): "
    read whofor
    if [ "$whofor" = 1 ]; then
        lname="${ATHENA_USER:-$USER}"
    elif [ "$whofor" = 2 ]; then
        echo
        echo "OK.  A locker of your choice that you control will be signed up."
        echo "Please enter the name of the selected locker below."
        echo "(For the locker /mit/sipb, you would enter sipb)."
        printf "Locker name: "
        read lname
    else
        echo
        echo "ERROR:"
        echo "You must select either '1' or '2'."
        exit 1
    fi
    while true; do
        if attach "$lname"; then
            break
        fi
        echo "$lname is not a valid locker name."
        printf "Locker name: "
        read lname
    done
  else
    lname="$1"
  fi
fi
lroot="/mit/$lname" 

attach "$lname" 2>/dev/null

ans=`$WGET -q -O- "http://scripts.mit.edu/~signup/fsla.php/mit/$lname"`
if [ "$ans" != "0" ]; then
  echo
  echo "ERROR:"
  echo "The scripts servers cannot verify the permissions of the locker <$lname>."
  echo "This is probably because your locker is not publicly listable."
  echo "You can remedy this signup problem and make your locker publicly"
  echo "listable by running \"fs setacl /mit/$lname system:anyuser l\""
  echo "(that's a lowercase L at the end)."
  echo ""
  echo "NOTE: This will make it possible for the public (including anyone"
  echo "viewing http://web.mit.edu/$lname) to see the names of your files"
  echo "and the list of people who have access to them, though it will not"
  echo "cause the contents of your files to be publicly readable.  If you"
  echo "are unwilling to have your locker listable by the public, please"
  echo "contact scripts@mit.edu for information about other ways to work"
  echo "around the problem, or see http://scripts.mit.edu/faq/122 for more"
  echo "detailed information."
  exit 1
fi

principal=`klist -5 | sed -n 's/^Default principal: // p'`
ans=`$WGET -q -O- "http://scripts.mit.edu/~signup/admof.php/$lname/$principal"`
if [ "$ans" != "yes" ]; then
  afsuser=`echo "$principal" | sed 's/@ATHENA.MIT.EDU$//'`
  echo
  echo "ERROR:"
  echo "It appears as though you are not an administrator of the locker <$lname>."
  echo "Try running \"fs setacl /mit/$lname $afsuser all\" and starting over."
  echo "Contact scripts@mit.edu if you are unable to solve the problem."
  exit 1
fi

mkdir -p "/mit/$lname/.scripts-signup"

if [ ! -d "/mit/$lname/.scripts-signup" ]; then
  echo
  echo "ERROR:"
  echo "It appears as though you do not have write access to the locker <$lname>."
  echo "Contact scripts@mit.edu if you are unable to solve the problem."
  exit 1
fi

ans=`$WGET -q -O- "http://scripts.mit.edu/~signup/$lname"`
rmdir "/mit/$lname/.scripts-signup"

if [ "$ans" = "done" ]; then
  # nscd caches account nonexistence with a 5-second TTL.
  # (LDAP updates are more or less instant.)
  # Somehow, the server can wait up to 10 seconds...
  echo "Creating scripts.mit.edu account for $lname..."
  sleep 10
fi

if [ "$ans" != "done" ] && [ "$ans" != "username already taken" ]; then
  echo "ERROR:"
  echo "Signup reported the following error: \"$ans\"."
  echo "Contact scripts@mit.edu for assistance."
  exit 1
fi

success() {
  if [ "$initlname" -eq 0 ]; then
    echo
    echo "== SUCCESS =="
    echo "$lname is now signed up for $1."
    echo "$2"
    echo
  fi
}
