summaryrefslogtreecommitdiff
path: root/user-init
blob: 9f3cc4c0148c040274a2c1827d14e2bbc4be2a04 (plain)
  1. #!/bin/sh
  2. set -e
  3. # reset flags
  4. apache_reload_needed=""
  5. runmode="normal"
  6. mac=".mac"
  7. pc=".pc"
  8. xchange=".xchange"
  9. if [ -e /etc/adduser.conf ]; then
  10. . /etc/adduser.conf
  11. else
  12. echo "/etc/adduser.conf missing. Exiting..."
  13. exit 1
  14. fi
  15. [ -f /etc/local/users.conf ] && . /etc/local/users.conf
  16. if [ -e /etc/local/volumes ]; then
  17. . /etc/local/volumes
  18. else
  19. # exit silently if this system lacks required hints
  20. exit 0
  21. fi
  22. XDIRREAL="$XDIR/users/root"
  23. if [ $XCHANGE ]; then
  24. if [ ! -d "$XDIR" ]; then
  25. echo "XDIR doesn't exist. Ignoring XCHANGE!"
  26. XCHANGE=""
  27. fi
  28. fi
  29. if [ $# -gt 0 ]; then
  30. USERS=$*
  31. else
  32. # USERS=`getent passwd | awk -F: '{print $1}'`
  33. echo "uid required!"
  34. exit 1
  35. fi
  36. [ $NETATALK_HOME ] && mac=$NETATALK_HOME
  37. [ $SAMBA_HOME ] && pc=$SAMBA_HOME
  38. [ $XCHANGE_HOME ] && xchange=$XCHANGE_HOME
  39. echo "Setting up additional folders and permissions..."
  40. for user in $USERS; do
  41. uid=`getent passwd $user | awk -F: '{print $3}' | head -1`
  42. HOME=`getent passwd $user | awk -F: '{print $6}' | head -1`
  43. if [ -z "$HOME" ]; then
  44. echo "User $user doesn't exist. Ignoring..."
  45. continue
  46. fi
  47. # Ignore non-human accounts silently
  48. [ "$uid" -ge "$FIRST_UID" -a "$uid" -le "$LAST_UID" ] || continue
  49. [ -d $HOME ] || continue
  50. # [ -L $HOME ] && continue
  51. echo -n $user
  52. # if [ -x /etc/local/quota.sh ]; then
  53. # /etc/local/quota.sh $user
  54. # fi
  55. [ $QUOTASOFT ] || QUOTASOFT="0"
  56. [ $QUOTAHARD ] || QUOTAHARD="0"
  57. for QUOTAHOME in $QUOTAHOMES; do
  58. if [ $NEW_QUOTA ]; then
  59. setquota $user $QUOTASOFT $QUOTAHARD 0 0 $QUOTAHOME
  60. else
  61. setquota $user $QUOTAHOME $QUOTASOFT $QUOTAHARD 0 0
  62. fi
  63. done
  64. mkdir -p $HOME/mail
  65. if [ "$USE_MBOX" ]; then
  66. touch $HOME/mail/mbox
  67. elif [ -f $HOME/mail/mbox -a ! -s $HOME/mail/mbox ]; then
  68. rm -f $HOME/mail/mbox
  69. fi
  70. if [ $NETATALK ]; then
  71. mkdir -p $HOME/$mac
  72. fi
  73. if [ $SAMBA ]; then
  74. mkdir -p $HOME/$pc
  75. fi
  76. if [ $XCHANGE ]; then
  77. mkdir -p $XDIRREAL/$user
  78. fi
  79. if [ $PUBLIC ]; then
  80. mkdir -p $HOME/public_html
  81. fi
  82. chown $user: $HOME
  83. chmod u=rwX,go=rX $HOME
  84. # Mail handling
  85. chown -R $user: $HOME/mail
  86. chmod -R u=rw,go=,u+X $HOME/mail
  87. if [ -f $HOME/.mailboxlist ]; then
  88. chown $user: $HOME/.mailboxlist
  89. chmod 0640 $HOME/.mailboxlist
  90. fi
  91. if [ -f $HOME/.forward ]; then
  92. chown $user: $HOME/.forward
  93. chmod 0640 $HOME/.forward
  94. fi
  95. if [ -f /var/mail/$user ]; then
  96. chown $user:mail /var/mail/$user
  97. chmod ug=rw,o= /var/mail/$user
  98. elif [ -f /var/spool/mail/$user ]; then
  99. chown $user:mail /var/spool/mail/$user
  100. chmod ug=rw,o= /var/spool/mail/$user
  101. fi
  102. # Mac dir permissions
  103. if [ -d $HOME/$mac ]; then
  104. chown -R $user: $HOME/$mac
  105. chmod -R u=rw,g=r,o=,ug+X $HOME/$mac
  106. rm -rf $HOME/$mac/Network\ Trash\ Folder
  107. mkdir $HOME/$mac/Network\ Trash\ Folder
  108. chown nobody: $HOME/$mac/Network\ Trash\ Folder
  109. chmod a= $HOME/$mac/Network\ Trash\ Folder
  110. fi
  111. # PC dir permissions
  112. if [ -d $HOME/$pc ]; then
  113. chown -R $user: $HOME/$pc
  114. chmod -R u=rw,g=r,o=,ug+X $HOME/$pc
  115. fi
  116. # Exchange dir permissions
  117. if [ -d $XDIRREAL/$user ]; then
  118. chown -R $user:users $XDIRREAL/$user
  119. chmod -R g=r,g+X $XDIRREAL/$user
  120. if [ -e "x$HOME/$xchange" ]; then
  121. if [ -L "x$HOME/$xchange" ]; then
  122. ln -sf $XDIRREAL/$user $HOME/$xchange
  123. else
  124. echo "ERROR: $HOME/$xchange exists already. Leaving it as is..."
  125. fi
  126. else
  127. ln -s $XDIRREAL/$user $HOME/$xchange
  128. fi
  129. fi
  130. # Public dir permissions
  131. if [ -d $HOME/public_html ]; then
  132. chown -R $user: $HOME/public_html
  133. chmod -R u+rX,go=r,go+X $HOME/public_html
  134. if [ $NETATALK ]; then
  135. rm -rf $HOME/public_html/Network\ Trash\ Folder
  136. mkdir $HOME/public_html/Network\ Trash\ Folder
  137. chown nobody: $HOME/public_html/Network\ Trash\ Folder
  138. chmod a= $HOME/public_html/Network\ Trash\ Folder
  139. fi
  140. fi
  141. # Share permissions
  142. for dir in `find $HOME -mindepth 1 -maxdepth 1 -type d | egrep "^$HOME/shares_win"`; do
  143. chgrp -R $user $dir
  144. chmod -R u=rw,g=rw,o=,ug+X,g+s $dir
  145. done
  146. for dir in `find $HOME -mindepth 1 -maxdepth 1 -type d | egrep "^$HOME/shares_mac"`; do
  147. chgrp -R $user $dir
  148. chmod -R u=rw,g=rw,o=,ug+X,g+s $dir
  149. rm -rf $dir/Network\ Trash\ Folder
  150. mkdir $dir/Network\ Trash\ Folder
  151. chown nobody: $dir/Network\ Trash\ Folder
  152. chmod a= $dir/Network\ Trash\ Folder
  153. done
  154. # Ftp shares permissions
  155. for dir in `find $HOME -mindepth 1 -maxdepth 1 -type d | egrep "^$HOME/ftp_$USER$"`; do
  156. chgrp -R $user $dir
  157. chmod -R ug=rw,o=r,a+X,g+s $dir
  158. rm -rf $dir/Network\ Trash\ Folder
  159. mkdir $dir/Network\ Trash\ Folder
  160. chown nobody: $dir/Network\ Trash\ Folder
  161. chmod a= $dir/Network\ Trash\ Folder
  162. done
  163. for dir in `find $HOME -mindepth 1 -maxdepth 1 -type d | egrep "^$HOME/ftp_${USER}_ro$"`; do
  164. chown -R $user: $dir
  165. chmod -R u=rw,go=r,a+X $dir
  166. rm -rf $dir/Network\ Trash\ Folder
  167. mkdir $dir/Network\ Trash\ Folder
  168. chown nobody: $dir/Network\ Trash\ Folder
  169. chmod a= $dir/Network\ Trash\ Folder
  170. done
  171. # Web shares permissions
  172. for dir in `find $HOME -mindepth 1 -maxdepth 1 -type d | egrep "^$HOME/web_"`; do
  173. chown -R $user: $dir
  174. # chmod -R u=rw,go=r,a+X $webdir
  175. #TODO: Only cgi scripts (.cgi and .pl) should be executable
  176. chmod -R u+rw,go+r,a+X $dir
  177. # leftover from ancient times with another policy
  178. if [ $NETATALK ]; then
  179. rm -rf $dir/Network\ Trash\ Folder
  180. fi
  181. done
  182. # Web shares permissions
  183. for dir in `find $HOME -mindepth 1 -maxdepth 1 -type d | egrep "^$HOME/websites"`; do
  184. chown root: $dir
  185. chmod a=r,u+w,a+X $dir
  186. done
  187. for dir in `find $HOME -mindepth 2 -maxdepth 2 -type d | egrep "^$HOME/websites/"`; do
  188. chown -R $user: $dir
  189. # chmod -R u=rw,go=r,a+X $webdir
  190. #TODO: Only cgi scripts (.cgi and .pl) should be executable
  191. chmod -R u+rw,go+r,a+X $dir
  192. # leftover from ancient times with another policy
  193. if [ $NETATALK ]; then
  194. rm -rf $dir/Network\ Trash\ Folder
  195. fi
  196. done
  197. for dir in `find $HOME -mindepth 1 -maxdepth 1 -type d | egrep "^$HOME/webscripts"`; do
  198. chown root: $dir
  199. chmod a=r,u+w,a+X $dir
  200. done
  201. for dir in `find $HOME -mindepth 2 -maxdepth 2 -type d | egrep "^$HOME/webscripts/"`; do
  202. chown -R $user: $dir
  203. # chmod -R u=rw,go=r,a+X $webdir
  204. #TODO: Only cgi scripts (.cgi and .pl) should be executable
  205. chmod -R u+rw,go+r,a+X $dir
  206. done
  207. for dir in `find $HOME -mindepth 1 -maxdepth 1 -type d | egrep "^$HOME/webdata"`; do
  208. chown $user: $dir
  209. chmod a=r,u+w,a+X $dir
  210. done
  211. for dir in `find $HOME -mindepth 2 -maxdepth 2 -type d | egrep "^$HOME/webdata/"`; do
  212. chown -R $user: $dir
  213. chmod -R u=rw,go=,u+X $dir
  214. done
  215. for dir in `find $HOME -mindepth 1 -maxdepth 1 -type d | egrep "^$HOME/webphpsites"`; do
  216. chown root: $dir
  217. chmod u=rw,go=r,a+X $dir
  218. done
  219. for dir in `find $HOME -mindepth 2 -maxdepth 2 -type d | egrep "^$HOME/webphpsites/"`; do
  220. chown -R $user:www-data $dir
  221. # chmod -R ug=rw,o=r,a+X $dir
  222. chmod -R ug=rw,o=,ug+X $dir
  223. done
  224. for dir in `find $HOME -mindepth 1 -maxdepth 1 -type d | egrep "^$HOME/webphpdata"`; do
  225. chown root: $dir
  226. chmod a=r,u+w,a+X $dir
  227. done
  228. for dir in `find $HOME -mindepth 2 -maxdepth 2 -type d | egrep "^$HOME/webphpdata/"`; do
  229. chown -R $user:www-data $dir
  230. chmod -R ug=rw,o=,ug+X $dir
  231. done
  232. # Dummy user restrictions
  233. if [ -n "$DUMMYSHAREDIR" -a -n "$DUMMYSHAREOWNER" -a -n "$DUMMYSHARENAME" ]; then
  234. [ -e $DUMMYSHAREDIR/$user ] \
  235. || mkdir $DUMMYSHAREDIR/$user
  236. chown $DUMMYSHAREOWNER: $DUMMYSHAREDIR/$user
  237. chmod u=rw,go=r,a+X $DUMMYSHAREDIR/$user
  238. if [ -e $HOME/$DUMMYSHARENAME ]; then
  239. if [ -L $HOME/$DUMMYSHARENAME ]; then
  240. ln -sf $DUMMYSHAREDIR/$user $HOME/$DUMMYSHARENAME
  241. chown $user: $HOME/$DUMMYSHARENAME
  242. else
  243. echo "ERROR: $HOME/$DUMMYSHAREDIR exists already. Leaving it as is..."
  244. fi
  245. else
  246. ln -s $DUMMYSHAREDIR/$user $HOME/$DUMMYSHARENAME
  247. chown $user: $HOME/$DUMMYSHARENAME
  248. fi
  249. if [ -n "$DUMMYAPACHECFG" -a -n "$DUMMYAPACHESHAREDIR" ]; then
  250. if [ -f /etc/apache/include.d/$DUMMYAPACHECFG -a -x /etc/init.d/apache ]; then
  251. if [ -e /etc/apache/include.d/$DUMMYAPACHECFG-$user ]; then
  252. echo "/etc/apache/include.d/$DUMMYAPACHECFG-$user exists already. Ignoring..."
  253. else
  254. echo "# Created automatically by adduser.local
  255. <Location /$DUMMYAPACHESHAREDIR/$user>
  256. <Limit GET POST>
  257. require user $user
  258. </Limit>
  259. </Location>" \
  260. > /etc/apache/include.d/$DUMMYAPACHECFG-$user
  261. apache_reload_needed="1"
  262. fi
  263. fi
  264. fi
  265. fi
  266. echo "."
  267. done
  268. if [ $XCHANGE ]; then
  269. for USER in $(ls $XDIRREAL); do
  270. id $user >/dev/null 2>&1 || rm -rf $XDIRREAL/$user
  271. done
  272. fi
  273. if [ "$apache_reload_needed" ]; then
  274. apache_do_reload=""
  275. case runmode in
  276. interactive)
  277. echo -n "Apache config changed. Reload Apache now (Y/n)? "
  278. read apache_reload
  279. case $apache_reload in
  280. y|Y|"")
  281. apache_do_reload="1"
  282. ;;
  283. esac
  284. ;;
  285. force)
  286. apache_do_reload="1"
  287. ;;
  288. *)
  289. echo "Apache config has changed. Remember to reload Apache...!"
  290. ;;
  291. esac
  292. if "$apache_do_reload" ]; then
  293. /etc/init.d/apache force-reload
  294. fi
  295. fi