~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to ivle/makeuser.py

  • Committer: William Grant
  • Date: 2009-04-28 07:08:56 UTC
  • Revision ID: grantw@unimelb.edu.au-20090428070856-75yc00g6ea24qfqz
Drop ivle.conf.{subjects,exercises}_base - they were unused.

Show diffs side-by-side

added added

removed removed

Lines of Context:
35
35
# Do not call os.system("chown www-data") - use Python lib
36
36
# and use the web server uid given in conf. (Several places).
37
37
 
38
 
import md5
 
38
import hashlib
39
39
import os
40
40
import stat
41
41
import shutil
79
79
    """
80
80
    users = store.find(ivle.database.User)
81
81
    groups = {}
82
 
    for u in users:
83
 
        role = str(u.role)
84
 
        if role not in groups:
85
 
            groups[role] = []
86
 
        groups[role].append(u.login)
 
82
    # TODO: Populate groups with per-offering tutors/lecturers/etc.
87
83
    f = open(ivle.conf.svn_conf + ".new", "w")
88
84
    f.write("# IVLE SVN Repositories Configuration\n")
89
85
    f.write("# Auto-generated on %s\n" % time.asctime())
128
124
    """Setup svn authentication for the given user.
129
125
       Uses the given DB store object. Does not commit to the db.
130
126
    """
131
 
    passwd = md5.new(uuid.uuid4().bytes).digest().encode('hex')
 
127
    passwd = hashlib.md5(uuid.uuid4().bytes).hexdigest()
132
128
    if os.path.exists(ivle.conf.svn_auth_ivle):
133
129
        create = ""
134
130
    else:
197
193
        raise Exception("Must run make_jail as root")
198
194
    
199
195
    # tempdir is for putting backup homes in
200
 
    tempdir = os.path.join(ivle.conf.jail_base, '__temp__')
 
196
    tempdir = os.path.join(ivle.conf.jail_src_base, '__temp__')
201
197
    if not os.path.exists(tempdir):
202
198
        os.makedirs(tempdir)
203
199
    elif not os.path.isdir(tempdir):
217
213
        warnings.simplefilter('ignore')
218
214
        homebackup = os.tempnam(tempdir)
219
215
        warnings.resetwarnings()
220
 
        # Note: shutil.move does not behave like "mv" - it does not put a file
221
 
        # into a directory if it already exists, just fails. Therefore it is
222
 
        # not susceptible to tmpnam symlink attack.
 
216
        # Back up the /home directory, delete the entire jail, recreate the
 
217
        # jail directory tree, then copy the /home back
 
218
        # NOTE that shutil.move changed in Python 2.6, it now moves a
 
219
        # directory INTO the target (like `mv`), which it didn't use to do.
 
220
        # This code works regardless.
223
221
        shutil.move(homedir, homebackup)
224
222
        shutil.rmtree(userdir)
225
 
        os.makedirs(homedir)
 
223
        os.makedirs(userdir)
226
224
        shutil.move(homebackup, homedir)
227
225
        # Change the ownership of all the files to the right unixid
228
226
        logging.debug("chown %s's home directory files to uid %d"
229
227
            %(user.login, user.unixid))
230
 
        os.chown(userhomedir, user.unixid, user.unixid)
231
 
        for root, dirs, files in os.walk(userhomedir):
232
 
            for fsobj in dirs + files:
233
 
                os.chown(os.path.join(root, fsobj), user.unixid, user.unixid)
 
228
        os.spawnvp(os.P_WAIT, 'chown', ['chown', '-R', '%d:%d' % (user.unixid,
 
229
                                        user.unixid), userhomedir])
234
230
    else:
235
231
        # No user jail exists
236
232
        # Set up the user's home directory
240
236
        # Chmod to rwxr-xr-x (755)
241
237
        os.chmod(userhomedir, 0755)
242
238
 
243
 
    make_conf_py(user.login, userdir, user.svn_pass)
 
239
    make_ivle_conf(user.login, userdir, user.svn_pass)
244
240
    make_etc_passwd(user.login, userdir, ivle.conf.jail_system, user.unixid)
245
241
 
246
242
    return userhomedir
247
243
 
248
 
def make_conf_py(username, user_jail_dir, svn_pass):
 
244
def make_ivle_conf(username, user_jail_dir, svn_pass):
249
245
    """
250
246
    Creates (overwriting any existing file, and creating directories) a
251
 
    file ${python_site_packages}/ivle/conf/conf.py in a given user's jail.
 
247
    file /etc/ivle/ivle.conf in a given user's jail.
252
248
    username: Username.
253
249
    user_jail_dir: User's jail dir, ie. ivle.conf.jail_base + username
254
250
    svn_pass: User's SVN password.
255
251
    """
256
 
    conf_path = os.path.join(user_jail_dir,
257
 
            ivle.conf.python_site_packages[1:], "ivle/conf/conf.py")
 
252
    conf_path = os.path.join(user_jail_dir, "etc/ivle/ivle.conf")
258
253
    os.makedirs(os.path.dirname(conf_path))
259
254
 
260
255
    # In the "in-jail" version of conf, we don't need MOST of the details
261
256
    # (it would be a security risk to have them here).
262
 
    # So we just write root_dir, and jail_base is "/".
263
 
    # (jail_base being "/" means "jail-relative" paths are relative to "/"
264
 
    # when inside the jail.)
265
 
 
266
 
    # XXX: jail_base is wrong and shouldn't be here. Unfortunately, jail code
267
 
    #      uses ivle.studpath.url_to_{local,jailpaths}, both of which use
268
 
    #      jail_base. Note that they don't use the bits of the return value
269
 
    #      that depend on jail_base, so it can be any string.
270
 
    conf_file = open(conf_path, "w")
271
 
    conf_file.write("""# IVLE jail configuration
272
 
 
273
 
# In URL space, where in the site is IVLE located. (All URLs will be prefixed
274
 
# with this).
275
 
# eg. "/" or "/ivle".
276
 
root_dir = %(root_dir)r
277
 
 
278
 
# This value is not relevant inside the jail, but must remain for now. See
279
 
# the XXX in ivle.makeuser.make_conf_py.
280
 
jail_base = '/'
281
 
 
282
 
# The hostname for serving publicly accessible pages
283
 
public_host = %(public_host)r
284
 
 
285
 
# The URL under which the Subversion repositories are located.
286
 
svn_addr = %(svn_addr)r
287
 
 
288
 
# The login name for the owner of the jail
289
 
login = %(username)r
290
 
 
291
 
# The subversion-only password for the owner of the jail
292
 
svn_pass = %(svn_pass)r
293
 
""" % {'root_dir': ivle.conf.root_dir,
294
 
       'public_host': ivle.conf.public_host,
295
 
       'svn_addr': ivle.conf.svn_addr,
296
 
       'username': username,
297
 
       'svn_pass': svn_pass,
298
 
      })
299
 
    conf_file.close()
 
257
    # So we just write root_dir.
 
258
    conf_obj = ivle.config.Config(blank=True)
 
259
    conf_obj.filename = conf_path
 
260
    conf_obj['urls']['root'] = ivle.conf.root_dir
 
261
    conf_obj['urls']['public_host'] = ivle.conf.public_host
 
262
    conf_obj['urls']['svn_addr'] = ivle.conf.svn_addr
 
263
    conf_obj['user_info']['login'] = username
 
264
    conf_obj['user_info']['svn_pass'] = svn_pass
 
265
    conf_obj.write()
300
266
 
301
267
    # Make this file world-readable
302
268
    # (chmod 644 conf_path)