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