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

« back to all changes in this revision

Viewing changes to lib/common/makeuser.py

  • Committer: dcoles
  • Date: 2008-05-09 07:43:37 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:753
Upload: Patch submitted by 'wagrant' to fix file upload of dos formated files 
and prevent corruption of upload files.

wagrant wrote:
> Last night I set up IVLE in my Gutsy schroot, and debugged it further.
> Looking deeper at the code, I noted it was a different error from the one I
> thought it was (an incorrect header, rather than lack of a Content-Type).
> This made the cause and fix obvious.
>
> http://qeuni.net/ivle_bug_1942845.diff fixes it for me in all the
> situations I can think of. It checks for the length of the header section
> obtained by splitting on a double LF then double CRLF, and takes the
> smaller one as the headers. In the old code, any output with a double CRLF
> in the body would have anything before the first CRLF treated as headers,
> which is wrong. Double LFs weren't affected because LFs are used by default
> to terminate the real headers.
>
> I apparently can't attach things (argh! I hate the SourceForge bug
> tracker).


Show diffs side-by-side

added added

removed removed

Lines of Context:
31
31
 
32
32
# TODO: When creating a new home directory, chown it to its owner
33
33
 
34
 
# TODO: In chown_to_webserver:
35
 
# Do not call os.system("chown www-data") - use Python lib
36
 
# and use the web server uid given in conf. (Several places).
37
 
 
38
34
import md5
39
35
import os
40
36
import stat
42
38
import time
43
39
import uuid
44
40
import warnings
45
 
import filecmp
 
41
 
46
42
import conf
47
43
import db
48
44
 
49
 
def chown_to_webserver(filename):
50
 
    """
51
 
    Chowns a file so the web server user owns it.
52
 
    (This is useful in setting up Subversion conf files).
53
 
    Assumes root.
54
 
    """
55
 
    try:
56
 
        os.system("chown -R www-data:www-data %s" % filename)
57
 
    except:
58
 
        pass
59
 
 
60
45
def make_svn_repo(login, throw_on_error=True):
61
46
    """Create a repository for the given user.
62
47
    """
69
54
        print repr(exc)
70
55
        if throw_on_error:
71
56
            raise
72
 
 
73
 
    chown_to_webserver(path)
 
57
    try:
 
58
        os.system("chown -R www-data:www-data %s" % path)
 
59
    except Exception:
 
60
        pass
74
61
 
75
62
def rebuild_svn_config():
76
63
    """Build the complete SVN configuration file.
101
88
        f.write("\n")
102
89
    f.close()
103
90
    os.rename(conf.svn_conf + ".new", conf.svn_conf)
104
 
    chown_to_webserver(conf.svn_conf)
105
91
 
106
92
def make_svn_config(login, throw_on_error=True):
107
93
    """Add an entry to the apache-svn config file for the given user.
115
101
    #f.write("@admin = rw\n")
116
102
    f.write("\n")
117
103
    f.close()
118
 
    chown_to_webserver(conf.svn_conf)
119
104
 
120
105
def make_svn_auth(login, throw_on_error=True):
121
106
    """Setup svn authentication for the given user.
135
120
    if res != 0 and throw_on_error:
136
121
        raise Exception("Unable to create ivle-auth for %s" % login)
137
122
 
138
 
    # Make sure the file is owned by the web server
139
 
    if create == "c":
140
 
        chown_to_webserver(conf.svn_auth_ivle)
141
 
 
142
123
    return passwd
143
124
 
144
 
def generate_manifest(basedir, targetdir, parent=''):
145
 
    """ From a basedir and a targetdir work out which files are missing or out 
146
 
    of date and need to be added/updated and which files are redundant and need 
147
 
    to be removed.
148
 
    
149
 
    parent: This is used for the recursive call to track the relative paths 
150
 
    that we have decended.
151
 
    """
152
 
    
153
 
    cmp = filecmp.dircmp(basedir, targetdir)
154
 
 
155
 
    # Add all new files and files that have changed
156
 
    to_add = [os.path.join(parent,x) for x in (cmp.left_only + cmp.diff_files)]
157
 
 
158
 
    # Remove files that are redundant
159
 
    to_remove = [os.path.join(parent,x) for x in cmp.right_only]
160
 
    
161
 
    # Recurse
162
 
    for d in cmp.common_dirs:
163
 
        newbasedir = os.path.join(basedir, d)
164
 
        newtargetdir = os.path.join(targetdir, d)
165
 
        newparent = os.path.join(parent, d)
166
 
        (sadd,sremove) = generate_manifest(newbasedir, newtargetdir, newparent)
167
 
        to_add += sadd
168
 
        to_remove += sremove
169
 
 
170
 
    return (to_add, to_remove)
171
 
 
172
 
 
173
 
def make_jail(username, uid, force=True, manifest=None):
 
125
def make_jail(username, uid, force=True):
174
126
    """Creates a new user's jail space, in the jail directory as configured in
175
127
    conf.py.
176
128
 
177
 
    This expects there to be a "staging" directory within the jail root which
 
129
    This expects there to be a "template" directory within the jail root which
178
130
    contains all the files for a sample student jail. It creates the student's
179
131
    directory in the jail root, by making a hard-link copy of every file in the
180
 
    staging directory, recursively.
 
132
    template directory, recursively.
181
133
 
182
134
    Returns the path to the user's home directory.
183
135
 
190
142
 
191
143
    force: If false, exception if jail already exists for this user.
192
144
    If true (default), overwrites it, but preserves home directory.
193
 
 
194
 
    manifest: If provided this will be a tupple (to_add, to_remove) of files or 
195
 
    directories to add or remove from the jail.
196
145
    """
197
146
    # MUST run as root or some of this may fail
198
147
    if os.getuid() != 0:
199
148
        raise Exception("Must run make_jail as root")
200
149
    
201
 
    stagingdir = os.path.join(conf.jail_base, '__staging__')
202
 
    if not os.path.isdir(stagingdir):
203
 
        raise Exception("Staging jail directory does not exist: " +
204
 
            stagingdir)
 
150
    templatedir = os.path.join(conf.jail_base, 'template')
 
151
    if not os.path.isdir(templatedir):
 
152
        raise Exception("Template jail directory does not exist: " +
 
153
            templatedir)
205
154
    # tempdir is for putting backup homes in
206
 
    tempdir = os.path.join(conf.jail_base, '__temp__')
 
155
    tempdir = os.path.join(conf.jail_base, 'temp')
207
156
    if not os.path.exists(tempdir):
208
157
        os.makedirs(tempdir)
209
158
    elif not os.path.isdir(tempdir):
230
179
            # the backup will be un-made.
231
180
            # XXX This will still leave the user's jail in an unusable state,
232
181
            # but at least they won't lose their files.
233
 
            if manifest:
234
 
                (to_add, to_remove) = manifest
235
 
                # Remove redundant files and directories
236
 
                for d in to_remove:
237
 
                    dst = os.path.join(userdir, d)
238
 
                    src = os.path.join(stagingdir, d)
239
 
                    if os.path.isdir(dst):
240
 
                        shutil.rmtree(dst)
241
 
                    elif os.path.isfile(dst):
242
 
                        os.remove(dst)
243
 
                # Add new files
244
 
                for d in to_add:
245
 
                    dst = os.path.join(userdir, d)
246
 
                    src = os.path.join(stagingdir, d)
247
 
                    # Clear the previous file/dir
248
 
                    if os.path.isdir(dst):
249
 
                        shutil.rmtree(dst)
250
 
                    elif os.path.isfile(dst):
251
 
                        os.remove(dst)
252
 
                    # Link the file/dirs
253
 
                    if os.path.isdir(src):
254
 
                        linktree(src, dst)
255
 
                    elif os.path.isfile(src):
256
 
                        os.link(src, dst)
257
 
                    
258
 
            else:
259
 
                # No manifest, do a full rebuild
260
 
                shutil.rmtree(userdir)
261
 
                # Hard-link (copy aliasing) the entire tree over
262
 
                linktree(stagingdir, userdir)
 
182
            shutil.rmtree(userdir)
 
183
 
 
184
            # Hard-link (copy aliasing) the entire tree over
 
185
            linktree(templatedir, userdir)
263
186
        finally:
264
187
            # Set up the user's home directory (restore backup)
265
188
            # First make sure the directory is empty and its parent exists
275
198
    else:
276
199
        # No user jail exists
277
200
        # Hard-link (copy aliasing) the entire tree over
278
 
        linktree(stagingdir, userdir)
 
201
        linktree(templatedir, userdir)
279
202
 
280
203
        # Set up the user's home directory
281
204
        userhomedir = os.path.join(homedir, username)
350
273
        if res != 0 and throw_on_error:
351
274
            raise Exception("Unable to create local-auth for %s" % kwargs['login'])
352
275
 
353
 
    # Make sure the file is owned by the web server
354
 
    if create == "c":
355
 
        chown_to_webserver(conf.svn_auth_local)