summaryrefslogtreecommitdiff
path: root/user-init
blob: 59cac74b9c3240421bc5277e01fbb65487480748 (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 a=r,u+w,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. done
  221. for dir in `find $HOME -mindepth 1 -maxdepth 1 -type d | egrep "^$HOME/webphpdata"`; do
  222. chown root: $dir
  223. chmod a=r,u+w,a+X $dir
  224. done
  225. for dir in `find $HOME -mindepth 2 -maxdepth 2 -type d | egrep "^$HOME/webphpdata/"`; do
  226. chown -R $user:www-data $dir
  227. chmod -R ug=rw,o=,ug+X $dir
  228. done
  229. # Dummy user restrictions
  230. if [ -n "$DUMMYSHAREDIR" -a -n "$DUMMYSHAREOWNER" -a -n "$DUMMYSHARENAME" ]; then
  231. [ -e $DUMMYSHAREDIR/$user ] \
  232. || mkdir $DUMMYSHAREDIR/$user
  233. chown $DUMMYSHAREOWNER: $DUMMYSHAREDIR/$user
  234. chmod u=rw,go=r,a+X $DUMMYSHAREDIR/$user
  235. if [ -e $HOME/$DUMMYSHARENAME ]; then
  236. if [ -L $HOME/$DUMMYSHARENAME ]; then
  237. ln -sf $DUMMYSHAREDIR/$user $HOME/$DUMMYSHARENAME
  238. chown $user: $HOME/$DUMMYSHARENAME
  239. else
  240. echo "ERROR: $HOME/$DUMMYSHAREDIR exists already. Leaving it as is..."
  241. fi
  242. else
  243. ln -s $DUMMYSHAREDIR/$user $HOME/$DUMMYSHARENAME
  244. chown $user: $HOME/$DUMMYSHARENAME
  245. fi
  246. if [ -n "$DUMMYAPACHECFG" -a -n "$DUMMYAPACHESHAREDIR" ]; then
  247. if [ -f /etc/apache/include.d/$DUMMYAPACHECFG -a -x /etc/init.d/apache ]; then
  248. if [ -e /etc/apache/include.d/$DUMMYAPACHECFG-$user ]; then
  249. echo "/etc/apache/include.d/$DUMMYAPACHECFG-$user exists already. Ignoring..."
  250. else
  251. echo "# Created automatically by adduser.local
  252. <Location /$DUMMYAPACHESHAREDIR/$user>
  253. <Limit GET POST>
  254. require user $user
  255. </Limit>
  256. </Location>" \
  257. > /etc/apache/include.d/$DUMMYAPACHECFG-$user
  258. apache_reload_needed="1"
  259. fi
  260. fi
  261. fi
  262. fi
  263. echo "."
  264. done
  265. if [ $XCHANGE ]; then
  266. for USER in $(ls $XDIRREAL); do
  267. id $user >/dev/null 2>&1 || rm -rf $XDIRREAL/$user
  268. done
  269. fi
  270. if [ "$apache_reload_needed" ]; then
  271. apache_do_reload=""
  272. case runmode in
  273. interactive)
  274. echo -n "Apache config changed. Reload Apache now (Y/n)? "
  275. read apache_reload
  276. case $apache_reload in
  277. y|Y|"")
  278. apache_do_reload="1"
  279. ;;
  280. esac
  281. ;;
  282. force)
  283. apache_do_reload="1"
  284. ;;
  285. *)
  286. echo "Apache config has changed. Remember to reload Apache...!"
  287. ;;
  288. esac
  289. if "$apache_do_reload" ]; then
  290. /etc/init.d/apache force-reload
  291. fi
  292. fi