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

« back to all changes in this revision

Viewing changes to ivle/makeuser.py

Actually set user in userservice/activate_me.

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
79
79
    """
80
80
    users = store.find(ivle.database.User)
81
81
    groups = {}
82
 
    # TODO: Populate groups with per-offering tutors/lecturers/etc.
 
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)
83
87
    f = open(ivle.conf.svn_conf + ".new", "w")
84
88
    f.write("# IVLE SVN Repositories Configuration\n")
85
89
    f.write("# Auto-generated on %s\n" % time.asctime())
124
128
    """Setup svn authentication for the given user.
125
129
       Uses the given DB store object. Does not commit to the db.
126
130
    """
127
 
    passwd = hashlib.md5(uuid.uuid4().bytes).hexdigest()
 
131
    passwd = md5.new(uuid.uuid4().bytes).digest().encode('hex')
128
132
    if os.path.exists(ivle.conf.svn_auth_ivle):
129
133
        create = ""
130
134
    else:
193
197
        raise Exception("Must run make_jail as root")
194
198
    
195
199
    # tempdir is for putting backup homes in
196
 
    tempdir = os.path.join(ivle.conf.jail_src_base, '__temp__')
 
200
    tempdir = os.path.join(ivle.conf.jail_base, '__temp__')
197
201
    if not os.path.exists(tempdir):
198
202
        os.makedirs(tempdir)
199
203
    elif not os.path.isdir(tempdir):
213
217
        warnings.simplefilter('ignore')
214
218
        homebackup = os.tempnam(tempdir)
215
219
        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.
 
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.
221
223
        shutil.move(homedir, homebackup)
222
224
        shutil.rmtree(userdir)
223
 
        os.makedirs(userdir)
 
225
        os.makedirs(homedir)
224
226
        shutil.move(homebackup, homedir)
225
227
        # Change the ownership of all the files to the right unixid
226
228
        logging.debug("chown %s's home directory files to uid %d"
227
229
            %(user.login, user.unixid))
228
 
        os.spawnvp(os.P_WAIT, 'chown', ['chown', '-R', '%d:%d' % (user.unixid,
229
 
                                        user.unixid), userhomedir])
 
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)
230
234
    else:
231
235
        # No user jail exists
232
236
        # Set up the user's home directory
236
240
        # Chmod to rwxr-xr-x (755)
237
241
        os.chmod(userhomedir, 0755)
238
242
 
239
 
    make_ivle_conf(user.login, userdir, user.svn_pass)
 
243
    make_conf_py(user.login, userdir, ivle.conf.jail_system, user.svn_pass)
240
244
    make_etc_passwd(user.login, userdir, ivle.conf.jail_system, user.unixid)
241
245
 
242
246
    return userhomedir
243
247
 
244
 
def make_ivle_conf(username, user_jail_dir, svn_pass):
 
248
def make_conf_py(username, user_jail_dir, staging_dir, svn_pass):
245
249
    """
246
250
    Creates (overwriting any existing file, and creating directories) a
247
 
    file /etc/ivle/ivle.conf in a given user's jail.
 
251
    file ${python_site_packages}/ivle/conf/conf.py in a given user's jail.
248
252
    username: Username.
249
253
    user_jail_dir: User's jail dir, ie. ivle.conf.jail_base + username
250
 
    svn_pass: User's SVN password.
 
254
    staging_dir: The dir with the staging copy of the jail. (With the
 
255
        template conf.py file).
 
256
    svn_pass: As with make_jail. User's SVN password, but if not supplied,
 
257
        will look up in the DB.
251
258
    """
252
 
    conf_path = os.path.join(user_jail_dir, "etc/ivle/ivle.conf")
 
259
    template_conf_path = os.path.join(staging_dir,
 
260
            ivle.conf.python_site_packages[1:], "ivle/conf/conf.py")
 
261
    conf_path = os.path.join(user_jail_dir,
 
262
            ivle.conf.python_site_packages[1:], "ivle/conf/conf.py")
253
263
    os.makedirs(os.path.dirname(conf_path))
254
264
 
255
 
    # In the "in-jail" version of conf, we don't need MOST of the details
256
 
    # (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()
 
265
    # Read the contents of the template conf file
 
266
    try:
 
267
        template_conf_file = open(template_conf_path, "r")
 
268
        template_conf_data = template_conf_file.read()
 
269
        template_conf_file.close()
 
270
    except:
 
271
        # Couldn't open template conf.py for some reason
 
272
        # Just treat it as empty file
 
273
        template_conf_data = ("# Warning: Problem building config script.\n"
 
274
                              "# Could not find template conf.py file.\n")
 
275
 
 
276
    conf_file = open(conf_path, "w")
 
277
    conf_file.write(template_conf_data)
 
278
    conf_file.write("\n# The login name for the owner of the jail\n")
 
279
    conf_file.write("login = %s\n" % repr(username))
 
280
    conf_file.write("\n")
 
281
    conf_file.write("# The subversion-only password for the owner of "
 
282
        "the jail\n")
 
283
    conf_file.write("svn_pass = %s\n" % repr(svn_pass))
 
284
    conf_file.close()
266
285
 
267
286
    # Make this file world-readable
268
287
    # (chmod 644 conf_path)