#!/bin/bash

### TEXT STRINGS

## English
DIAGTITLE_en="Access Mode"
INSUFPERM_en="You do not have sufficient permissions to change the access mode of «%s»"
ALREADYSHARED_en="«%s» is already being shared read/write\nwith group «%s»"
ALREADYSHAREDRDO_en="«%s» is already being shared read-only\nwith group «%s»"
ALREADYUNSHARED_en="«%s» is not currently being shared"
WANTTOSHARE_en="«%s» is not currently shared.\nWould you like to share it?"
NOWSHARED_en="«%s» is now shared read/write to everyone\nin the «%s» group"
NOWSHAREDRDO_en="«%s» is now shared read-only to everyone\nin the «%s» group"
WANTTOUNSHARE_en="«%s» is currently being shared.\nWould you like to unshare it?"
NOWUNSHARED_en="«%s» is now unshared"
SELECTGROUP_en="Select a new group (current group is «%s»)"
GROUPCHANGED_en="«%s» has been assigned to group «%s»"
NOTOWNER_en="The permissions of «%s» can only be changed by user «%s»\nYou are logged in as «%s»"
UNABLETOCHANGE_en="Sorry, I was unable to change the access mode"
GROUPCHANGEFAIL_en="Unable to assign «%s» to a different group"
NOMULTSELECT_en="Multiple selection not supported"

GROUPINFO_en="File:\t%s\nOwner:\t%s\nAccess type: %s to members of group «%s»\n\n%s"
ACCTYPE_en[10]="read-only"
ACCTYPE_en[01]="write-only"
ACCTYPE_en[11]="read-write"
ACCTYPE_en[00]="none"

## Catalan
DIAGTITLE_ca="Permissos d'accés"
INSUFPERM_ca="No teniu prou privilegis per canviar els permissos d'accès de «%s»"
ALREADYSHARED_ca="«%s» ja s'està compartint en lectura i escriptura\namb el grup «%s»"
ALREADYSHAREDRDO_ca="«%s» ja s'està compartint només de lectura\namb el grup «%s»"
ALREADYUNSHARED_ca="«%s» no s'està compartint"
WANTTOSHARE_ca="«%s» no s'està compartint en aquest moment.\nVoleu compartir-lo?"
NOWSHARED_ca="«%s» s'ha compartit per lectura i escriptura\namb tots els membres del grup «%s»"
NOWSHAREDRDO_ca="«%s» s'ha compartit només per lectura\namb tots els membres del grup «%s»"
WANTTOUNSHARE_ca="«%s» actualment s'està compartint.\nVoleu deixar de compartir-lo?"
NOWUNSHARED_ca="«%s» ja no és compartit"
SELECTGROUP_ca="Trieu un altre grup (grup actual «%s»)"
GROUPCHANGED_ca="«%s» assignat al grup «%s»"
NOTOWNER_ca=" «%s» només pot ser modificat per l'usuari «%s»\nEl vostre nom d'usuari és «%s»"
UNABLETOCHANGE_ca="Ho sento, però per algun motiu no ha estat possible canviar els permissos d'accès"
GROUPCHANGEFAIL_ca="No ha estat possible assignar «%s» a un grup diferent"
NOMULTSELECT_ca="Aquesta acció no és possible amb multiples elements seleccionats"

GROUPINFO_ca="Arxiu:\t%s\nPropietari:\t%s\nTipus d'accés: %s als members del grup «%s»\n\n%s"
ACCTYPE_ca[10]="només lectura"
ACCTYPE_ca[01]="només escriptura"
ACCTYPE_ca[11]="lectura i escriptura"
ACCTYPE_ca[00]="cap mena d'accés"

## Default assignments
DIAGTITLE=$DIAGTITLE_en
INSUFPERM=$INSUFPERM_en
ALREADYSHARED=$ALREADYSHARED_en
ALREADYUNSHARED=$ALREADYUNSHARED_en
WANTTOSHARE=$WANTTOSHARE_en
NOWSHARED=$NOWSHARED_en
NOWSHAREDRDO=$NOWSHAREDRDO_en
WANTTOUNSHARE=$WANTTOUNSHARE_en
NOWUNSHARED=$NOWUNSHARED_en
SELECTGROUP=$SELECTGROUP_en
GROUPCHANGED=$GROUPCHANGED_en
NOTOWNER=$NOTOWNER_en
UNABLETOCHANGE=$UNABLETOCHANGE_en
GROUPCHANGEFAIL=$GROUPCHANGEFAIL_en
NOMULTSELECT=$NOMULTSELECT_en
GROUPINFO=$GROUPINFO_en
ACCTYPE[10]=${ACCTYPE_en[10]}
ACCTYPE[01]=${ACCTYPE_en[01]}
ACCTYPE[11]=${ACCTYPE_en[11]}
ACCTYPE[00]=${ACCTYPE_en[00]}

case "$LANG" in
    en*)
        DIAGTITLE=$DIAGTITLE_en
        INSUFPERM=$INSUFPERM_en
        ALREADYSHARED=$ALREADYSHARED_en
        ALREADYSHAREDRDO=$ALREADYSHAREDRDO_en
        ALREADYUNSHARED=$ALREADYUNSHARED_en
        WANTTOSHARE=$WANTTOSHARE_en
        NOWSHARED=$NOWSHARED_en
        NOWSHAREDRDO=$NOWSHAREDRDO_en
        WANTTOUNSHARE=$WANTTOUNSHARE_en
        NOWUNSHARED=$NOWUNSHARED_en
        SELECTGROUP=$SELECTGROUP_en
        GROUPCHANGED=$GROUPCHANGED_en
        NOTOWNER=$NOTOWNER_en
        UNABLETOCHANGE=$UNABLETOCHANGE_en
        GROUPCHANGEFAIL=$GROUPCHANGEFAIL_en
        NOMULTSELECT=$NOMULTSELECT_en
        GROUPINFO=$GROUPINFO_en
        ACCTYPE[10]=${ACCTYPE_en[10]}
        ACCTYPE[01]=${ACCTYPE_en[01]}
        ACCTYPE[11]=${ACCTYPE_en[11]}
        ACCTYPE[00]=${ACCTYPE_en[00]}
    ;;
    ca*)
        DIAGTITLE=$DIAGTITLE_ca
        INSUFPERM=$INSUFPERM_ca
        ALREADYSHARED=$ALREADYSHARED_ca
        ALREADYSHARED=$ALREADYSHARED_ca
        ALREADYUNSHARED=$ALREADYUNSHARED_ca
        WANTTOSHARE=$WANTTOSHARE_ca
        NOWSHARED=$NOWSHARED_ca
        NOWSHAREDRDO=$NOWSHAREDRDO_ca
        WANTTOUNSHARE=$WANTTOUNSHARE_ca
        NOWUNSHARED=$NOWUNSHARED_ca
        SELECTGROUP=$SELECTGROUP_ca
        GROUPCHANGED=$GROUPCHANGED_ca
        NOTOWNER=$NOTOWNER_ca
        UNABLETOCHANGE=$UNABLETOCHANGE_ca
        GROUPCHANGEFAIL=$GROUPCHANGEFAIL_ca
        NOMULTSELECT=$NOMULTSELECT_ca
        GROUPINFO=$GROUPINFO_ca
        ACCTYPE[10]=${ACCTYPE_ca[10]}
        ACCTYPE[01]=${ACCTYPE_ca[01]}
        ACCTYPE[11]=${ACCTYPE_ca[11]}
        ACCTYPE[00]=${ACCTYPE_ca[00]}
    ;;
esac

### FUNCTION DEFINITIONS

function get_group_members ()
{
    GRP_NAME="$1"
    [ -z "$GRP_NAME" ] && return

    GRP_LINE="$(grep "^$GRP_NAME:" /etc/group)"
    [ -z "$GRP_LINE" ] && return 
    GRP_ID=$(echo $GRP_LINE |cut -d: -f3)
    USR_HANDLES=$(grep -e "^.*:.*:.*:$GRP_ID:" /etc/passwd |cut -d: -f1)
    USR_HANDLES=$( ( echo $USR_HANDLES; echo $GRP_LINE |cut -d: -f4 ) |tr ', ' '\n' |sort -u )
    n=0
    for usr in $USR_HANDLES; do
        echo "$usr:$(grep "^$usr" /etc/passwd |cut -d: -f5)"
    done
}

### PROGRAM CODE

# If multiple arguments, give the user the chance
# to cancel remaining actions on error
[ $# -gt 2 ] &&
WARNDIAGTYPE=--warningcontinuecancel ||
WARNDIAGTYPE=--sorry

# ACTION is one 's' (share), 'u' (unshare), or 't' (toggle)
# anything else is an error and silent exit
ACTION="$1"

ARGV=("$@")
for((n=1;n<$#;n++)); do
    # TARGET is the target file/directory.
    TARGET="${ARGV[$n]}"

    echo "$ACTION" |grep -qe '^[surtcm]$' || exit
    [ -z "$TARGET" ] && exit

    # Get the file access data as an array
    # Idx 0: Access permissions
    # Idx 1: Inode links
    # Idx 2: Owner
    # Idx 3: Group
    FAD=( $(ls -ld "$TARGET" 2>/dev/null) )

    #Skip permissions check for idempotent actions
    [ "$ACTION" != "m" ] && {
        # Determine if we have write access, so we can
        # change permissions. Set WA=1 if we do.
        WA=0
            # Are we the owner?
        [ "${FAD[2]}" == "$USER" ] && {
            # Do we have u+w?
            echo $FAD |grep -q "^..w" >/dev/null 2>&1 && WA=1
        } || {
            # If we're not this is not really going to work
            kdialog --title "$DIAGTITLE" $WARNDIAGTYPE "$(printf "$NOTOWNER" "$(basename "$TARGET")" "${FAD[2]}" "$USER")" &&
                continue
            exit
        }

        # If we can't change perms, display and error and exit
        [ "$WA" -eq 0 ] && {
            kdialog $WARNDIAGTYPE "$(printf "$INSUFPERM" "$(basename "$TARGET")")" &&
                continue
            exit
        }
    }

    # Determine whether others currently have access
    # (note that we ignore "others" permissions throughout!)
    echo $FAD |grep -q "^....r" >/dev/null 2>&1 && SHAREDR=1 || SHAREDR=0
    echo $FAD |grep -q "^.....w" >/dev/null 2>&1 && SHAREDW=1 || SHAREDW=0
    SHAREDRW=$SHAREDR$SHAREDW

    # Determine whether this is a file or directory, for
    # message dialogue purposes
    #TYPE=$(echo $FAD |cut -c 1)
    # case "$TYPE" in
    #     d)
    #         TNAME="directory"
    #     ;;
    #     -)
    #     TNAME="file"
    #     ;;
    # esac

    case "$ACTION" in
        s) # Share read-write
            [ "$SHAREDRW" -ne 11 ] && {
                chmod g+rw "$TARGET" && {
                            kdialog --passivepopup "$(printf "$NOWSHARED" "$(basename "$TARGET")" "${FAD[3]}")" 10
                        } ||
                        kdialog --error "$UNABLETOCHANGE"
                exit
            } || {
                kdialog --passivepopup "$(printf "$ALREADYSHARED" "$(basename "$TARGET")" "${FAD[3]}")" 10 
            }
        ;;
        r) # Share read-only
            [ "$SHAREDRW" -ne 10 ] && {
                chmod g+r-w "$TARGET" && {
                            kdialog --passivepopup "$(printf "$NOWSHAREDRDO" "$(basename "$TARGET")" "${FAD[3]}")" 10
                        } ||
                        kdialog --error "$UNABLETOCHANGE"
                exit
            } || {
                kdialog --passivepopup "$(printf "$ALREADYSHAREDRDO" "$(basename "$TARGET")" "${FAD[3]}")" 10 
            }
        ;;
        u) # Unshare
            [ "$SHAREDRW" -ne 00 ] && {
                chmod g-rw "$TARGET" && {
                            kdialog --passivepopup "$(printf "$NOWUNSHARED" "$(basename "$TARGET")")" 10
                        } ||
                        kdialog --error "$UNABLETOCHANGE"
                exit
            } || {
                kdialog --passivepopup "$(printf "$ALREADYUNSHARED" "$(basename "$TARGET")")" 10 
            }
        ;;
        t) # Toggle
            [ "$SHAREDW" -eq 0 ] && {
                kdialog --title "$DIAGTITLE" --yesno "$(printf "$WANTTOSHARE" "$(basename "$TARGET")")" && {
                chmod g+rw "$TARGET" && {
                            kdialog --passivepopup "$(printf "$NOWSHARED" "$(basename "$TARGET")" "${FAD[3]}")" 10
                        } ||
                        kdialog --error "$UNABLETOCHANGE"
                }
                exit
            } || {
                kdialog --title "$DIAGTITLE" --yesno "$(printf "$WANTTOUNSHARE" "$(basename "$TARGET")")" && {
                chmod g-w "$TARGET" && {
                            kdialog --passivepopup "$(printf "$NOWUNSHARED" "$(basename "$TARGET")")" 10 
                        } ||
                    kdialog --error "$UNABLETOCHANGE"
                }
            }
        ;;
        c) # Change group
            # Ask for a new group only the first time in the loop
            [ -z "$NEWGROUP" ] &&
                NEWGROUP=$(kdialog --title "$DIAGTITLE"  --default "${FAD[3]}" --combobox "$(printf "$SELECTGROUP" "${FAD[3]}")" $(groups))
            [ -z "$NEWGROUP" ] && {
                break
            }
            chgrp "$NEWGROUP" "$TARGET" && {
                kdialog --passivepopup "$(printf "$GROUPCHANGED" "$(basename "$TARGET")" "$NEWGROUP")"
            } || {
                kdialog $WARNDIAGTYPE "$(printf "$GROUPCHANGEFAIL" "$(basename "$TARGET")")" &&
                    continue
                exit
            }
        ;;
        m) # Query group members
            [ $# -gt 2 ] && {
                kdialog --title "$DIAGTITLE" --error "$NOMULTSELECT"
                exit
            }
            kdialog --title "$DIAGTITLE" --textbox /dev/stdin <<EOF
$(printf "$GROUPINFO" "$TARGET" "${FAD[2]}" \
    "${ACCTYPE[$SHAREDRW]}" "${FAD[3]}" \
    "$(get_group_members ${FAD[3]} |sed 's/:/\t(/;s/$/)/')")
EOF

        ;;
    esac
done
