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

« back to all changes in this revision

Viewing changes to ivle/makeuser.py

  • Committer: William Grant
  • Date: 2009-02-25 02:59:48 UTC
  • Revision ID: grantw@unimelb.edu.au-20090225025948-7vrb3ehin4lxi2tj
ivle-enrol now allows updating of existing enrolments. It also sets the role.

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 hashlib
 
38
import md5
39
39
import os
40
40
import stat
41
41
import shutil
124
124
    """Setup svn authentication for the given user.
125
125
       Uses the given DB store object. Does not commit to the db.
126
126
    """
127
 
    passwd = hashlib.md5(uuid.uuid4().bytes).hexdigest()
 
127
    passwd = md5.new(uuid.uuid4().bytes).digest().encode('hex')
128
128
    if os.path.exists(ivle.conf.svn_auth_ivle):
129
129
        create = ""
130
130
    else:
193
193
        raise Exception("Must run make_jail as root")
194
194
    
195
195
    # tempdir is for putting backup homes in
196
 
    tempdir = os.path.join(ivle.conf.jail_src_base, '__temp__')
 
196
    tempdir = os.path.join(ivle.conf.jail_base, '__temp__')
197
197
    if not os.path.exists(tempdir):
198
198
        os.makedirs(tempdir)
199
199
    elif not os.path.isdir(tempdir):
213
213
        warnings.simplefilter('ignore')
214
214
        homebackup = os.tempnam(tempdir)
215
215
        warnings.resetwarnings()
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.
 
216
        # Note: shutil.move does not behave like "mv" - it does not put a file
 
217
        # into a directory if it already exists, just fails. Therefore it is
 
218
        # not susceptible to tmpnam symlink attack.
221
219
        shutil.move(homedir, homebackup)
222
220
        shutil.rmtree(userdir)
223
 
        os.makedirs(userdir)
 
221
        os.makedirs(homedir)
224
222
        shutil.move(homebackup, homedir)
225
223
        # Change the ownership of all the files to the right unixid
226
224
        logging.debug("chown %s's home directory files to uid %d"
227
225
            %(user.login, user.unixid))
228
 
        os.spawnvp(os.P_WAIT, 'chown', ['chown', '-R', '%d:%d' % (user.unixid,
229
 
                                        user.unixid), userhomedir])
 
226
        os.chown(userhomedir, user.unixid, user.unixid)
 
227
        for root, dirs, files in os.walk(userhomedir):
 
228
            for fsobj in dirs + files:
 
229
                os.chown(os.path.join(root, fsobj), user.unixid, user.unixid)
230
230
    else:
231
231
        # No user jail exists
232
232
        # Set up the user's home directory
236
236
        # Chmod to rwxr-xr-x (755)
237
237
        os.chmod(userhomedir, 0755)
238
238
 
239
 
    make_ivle_conf(user.login, userdir, user.svn_pass)
 
239
    make_conf_py(user.login, userdir, user.svn_pass)
240
240
    make_etc_passwd(user.login, userdir, ivle.conf.jail_system, user.unixid)
241
241
 
242
242
    return userhomedir
243
243
 
244
 
def make_ivle_conf(username, user_jail_dir, svn_pass):
 
244
def make_conf_py(username, user_jail_dir, svn_pass):
245
245
    """
246
246
    Creates (overwriting any existing file, and creating directories) a
247
 
    file /etc/ivle/ivle.conf in a given user's jail.
 
247
    file ${python_site_packages}/ivle/conf/conf.py in a given user's jail.
248
248
    username: Username.
249
249
    user_jail_dir: User's jail dir, ie. ivle.conf.jail_base + username
250
250
    svn_pass: User's SVN password.
251
251
    """
252
 
    conf_path = os.path.join(user_jail_dir, "etc/ivle/ivle.conf")
 
252
    conf_path = os.path.join(user_jail_dir,
 
253
            ivle.conf.python_site_packages[1:], "ivle/conf/conf.py")
253
254
    os.makedirs(os.path.dirname(conf_path))
254
255
 
255
256
    # In the "in-jail" version of conf, we don't need MOST of the details
256
257
    # (it would be a security risk to have them here).
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()
 
258
    # So we just write root_dir, and jail_base is "/".
 
259
    # (jail_base being "/" means "jail-relative" paths are relative to "/"
 
260
    # when inside the jail.)
 
261
 
 
262
    # XXX: jail_base is wrong and shouldn't be here. Unfortunately, jail code
 
263
    #      uses ivle.studpath.url_to_{local,jailpaths}, both of which use
 
264
    #      jail_base. Note that they don't use the bits of the return value
 
265
    #      that depend on jail_base, so it can be any string.
 
266
    conf_file = open(conf_path, "w")
 
267
    conf_file.write("""# IVLE jail configuration
 
268
 
 
269
# In URL space, where in the site is IVLE located. (All URLs will be prefixed
 
270
# with this).
 
271
# eg. "/" or "/ivle".
 
272
root_dir = %(root_dir)r
 
273
 
 
274
# This value is not relevant inside the jail, but must remain for now. See
 
275
# the XXX in ivle.makeuser.make_conf_py.
 
276
jail_base = '/'
 
277
 
 
278
# The hostname for serving publicly accessible pages
 
279
public_host = %(public_host)r
 
280
 
 
281
# The URL under which the Subversion repositories are located.
 
282
svn_addr = %(svn_addr)r
 
283
 
 
284
# The login name for the owner of the jail
 
285
login = %(username)r
 
286
 
 
287
# The subversion-only password for the owner of the jail
 
288
svn_pass = %(svn_pass)r
 
289
""" % {'root_dir': ivle.conf.root_dir,
 
290
       'public_host': ivle.conf.public_host,
 
291
       'svn_addr': ivle.conf.svn_addr,
 
292
       'username': username,
 
293
       'svn_pass': svn_pass,
 
294
      })
 
295
    conf_file.close()
266
296
 
267
297
    # Make this file world-readable
268
298
    # (chmod 644 conf_path)