#!/bin/bash
#
# $Id$

export ORIGINAL=$1
shift

export GPGOPTS="--use-agent"


if [ -z "$ORIGINAL" ] ; then
  echo "FATAL: No file specified to edit."
  exit 1
fi

if [ ! -f "$ORIGINAL" ] ; then 
  echo "FATAL: No such file: $ORIGINAL"
  exit 2
fi

export RECIPIENTS="$*"
if [ -z "$RECIPIENTS" ] ; then
  echo "FATAL: No recipients specified as $2 ..."
  exit 3
fi

if ! /etc/init.d/siredit-fs status >/dev/null 2>/dev/null ; then
  echo "FATAL: siredit-fs not running, please sudo /etc/init.d/siredit-fs start"
  exit 4
fi

export ORINAME=$(basename "$ORIGINAL")
#echo "DEBUG: ORINAME=$ORINAME"

export ORIDIR=$(dirname "$ORIGINAL")
if [ -z "$ORIDIR" ] ; then
  ORIDIR=$(pwd)
fi
#echo "DEBUG: ORINAME=$ORINAME"

export RAMDIR="/tmp/siredit.ramfs/$$"
export RAMDIR="/tmp/siredit.ramfs/$$"
#echo "DEBUG: RAMDIR=$RAMDIR"

if [ ! -d /tmp/siredit.ramfs ] ; then
  echo "FATAL: No ramdir $RAMDIR"
  exit 11
fi

mkdir -pv $RAMDIR
if [ ! "$?" = "0" ] ; then
  echo "FATAL: Unable to create $RAMDIR"
  exit 12
fi
chmod go-rwx $RAMDIR

export RAMFILE="$RAMDIR/$ORINAME"
#echo "DEBUG: RAMFILE=$RAMFILE"

cp -uva $ORIGINAL $RAMFILE 
if [ ! "$?" = "0" ] ; then
  echo "FATAL: Unable to copy $ORIGINAL to $RAMFILE"
  exit 13
fi

export EDITNAME=$ORINAME
#echo "DEBUG: EDITNAME=$EDITNAME"

export GPGNAME=$(echo "$ORINAME" |egrep "\.gpg$" 2>/dev/null)
if [ -n "$GPGNAME" ] ; then
  EDITNAME=$(echo "$ORINAME" |sed -e 's/\.gpg$//')
  #echo "DEBUG: gpg'd EDITNAME=$EDITNAME"
  echo gpg $GPGOPTS --decrypt --output $RAMDIR/$EDITNAME $RAMDIR/$ORINAME
  gpg $GPGOPTS --decrypt --output $RAMDIR/$EDITNAME $RAMDIR/$ORINAME
  if [ ! "$?" = "0" ] ; then
    echo "FATAL: Unable to decrypt $RAMDIR/$ORINAME"
    rm -rfv $RAMDIR
    exit 14 
  fi
else
  GPGNAME="${ORINAME}.gpg"
fi

if [ -n "$GPGNAME" ] ; then
  # http://www.gnupg.org/faq/GnuPG-FAQ.html#how-can-i-get-list-of-key-ids-used-to-encrypt-a-message
  #export KEYLIST=$(gpg --decrypt --list-only --status-fd 1 2>/dev/null $RAMDIR/$ORINAME |awk '/^\[GNUPG:\] ENC_TO / { print $3 }')
  export ROPTS=""
  export DEFAULTKEY=""
  if [ -f ~/.gnupg/gpg.conf ] ; then
    DEFAULTKEY=$(cat ~/.gnupg/gpg.conf |egrep "^default-key " |cut -f2 -d ' ')
    if [ -n "$DEFAULTKEY" ] ; then
      ROPTS="$ROPTS -r $DEFAULTKEY"
      #echo "DEBUG: after adding own key, ROPTS=$ROPTS"
    else
      echo "WARNING: Unable to re-encryt for Yourself (no default-key line)."
      echo "Please fill ~/.gnupg/gpg.conf with a default-key line."
    fi
  else
    echo "WARNING: Unable to re-encryt for Yourself (no ~/.gnupg/gpg.conf)."
    echo "Please fill ~/.gnupg/gpg.conf with a default-key line."
  fi
  ENCTOLIST=$(gpg --decrypt --list-only --status-fd 1 2>/dev/null $ORIGINAL |grep ENC_TO |awk '{print $3}')
  #RECIPIENTS=$(gpg --list-keys $ENCTOLIST |egrep "<.*@.*>" |cut -f2 -d '<' |cut -f1 -d '>')
  #echo "DEBUG: after adding eventual own key, ROPTS=$ROPTS"
  for RECEPIENT in $RECIPIENTS 
  do
    ROPTS="$ROPTS -r $RECEPIENT"
    #echo "DEBUG: growing ROPTS=$ROPTS"
  done
  #echo "DEBUG: final ROPTS=$ROPTS"
  cp -av $RAMDIR/$ORINAME $RAMDIR/$ORINAME.orig
  rm -fv $RAMDIR/$GPGNAME
  echo gpg $GPGOPTS $ROPTS --output $RAMDIR/$GPGNAME --encrypt $RAMDIR/$EDITNAME
  gpg $GPGOPTS $ROPTS --output $RAMDIR/$GPGNAME --encrypt $RAMDIR/$EDITNAME
  if [ ! "$?" = "0" ] ; then
    echo "FATAL: Unable to re-encrypt $RAMDIR/$EDITNAME"
    #echo rm -rfv $RAMDIR
    rm -rfv $RAMDIR
    exit 31 
  fi
fi

echo cp -uva $RAMDIR/$GPGNAME $ORIDIR/$GPGNAME
cp -uva $RAMDIR/$GPGNAME $ORIDIR/$GPGNAME
if [ ! "$?" = "0" ] ; then
  echo "FATAL: Unable to copy $RAMDIR/$GPGNAME to $ORIDIR/$GPGNAME"
  #echo rm -rfv $RAMDIR
  rm -rfv $RAMDIR
  exit 32
fi
if [ ! "$GPGNAME" = "$ORINAME" ] ; then
  #echo rm -fv $ORIDIR/$ORINAME
  rm -fv $ORIDIR/$ORINAME
fi

rm -rfv $RAMDIR


