#!/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 <