def on_user_delete(user, victim): mode = user.merged_permissions()['accounts']['actions']['mode'] username = victim.username groups = Groups.objects.filter(username=username) groups.delete() try: ftp_user = Users.objects.get(username=username) except: log(1, "proftpd_app - event:on_user_delete", "No user with username '%s' has been found" % username) return 1 homedir = ftp_user.homedir # Gonna make changes to the config proftpd = Proftpd(user) config = proftpd.config # Deleting the user from permission instances in the config permissions = victim.merged_permissions() if "ftp_client" in permissions["proftpd"]: users = Users.objects.exclude(username='******') homedirs = [] [homedirs.append(user.homedir) for user in users] config.remove(["<Directory>", homedirs, "<Limit>", "*"], "AllowUser", [username]) # Deleting <Directory> instance from config path = proftpd.path() for p in path.ftp_dir_generator("/"+username, childs_only=True): config.drop(["<Directory>"], [p]) if p in FTP_DB: del FTP_DB[FTP_DB[p]] # Deleting the user's instances from DB permissions for dir in FTP_DB: dir_perm = dict(FTP_DB[dir]) if "user" in dir_perm and username in dir_perm["user"]: del dir_perm["user"][username] FTP_DB[dir] = dir_perm FTP_DB.save() # Deleting the directory itself try: shutil.rmtree(homedir) except: log(3, "proftpd_app - event:on_user_delete", "Failed to delete user's directory") if ftp_user: ftp_user.delete() # Reconfiguring... if not proftpd.update_config(): log(3, "proftpd_app - event:on_user_delete", "Failed to delete 'Directory' instance from the configuration file") return 1
def ftp_client(request, mode): path = urllib.url2pathname(request.POST.get("dir", request.GET.get("dir", "/"))) action = request.POST.get("action", request.GET.get("action", "show")) flag = request.POST.get("flag", request.GET.get("flag", None)) proftpd = Proftpd(request.user) ftp_client = proftpd.path(path) if not ftp_client.path_is_valid(): return HttpResponseBadRequest() """ The user is making a request which need a form to be filled in. """ if request.method == "GET": action = request.GET.get("action", "show") if action == "mkdir": return render_to_response("proftpd/window_mkdir.django.html") elif action == "upload": return render_to_response("proftpd/window_upload.django.html") elif action == "change_permission": if request.user.is_superuser: users = Users.objects.all() groups = unique(Groups.objects.all().values_list("groupname", flat=True)) else: users = ftp_client.ftp_user.peers() groups = ftp_client.ftp_user.groups() permissions = ftp_client.permissions() print permissions["all"] return render_to_response("proftpd/window_perm_change.django.html", {"selected_groups": permissions["group"], "selected_users": permissions["user"], "default": permissions["all"][""], "users": users, "groups": groups}) else: return render_to_response("proftpd/ftp_client.django.html", {"content": ftp_client.dir()}, context_instance=RequestContext(request)) else:# request == "POST" if action == "show": template = get_template("proftpd/browser.django.html") context = Context({"content": ftp_client.dir()}) return HttpResponse(template.render(context), mimetype="text/html") elif action == "info": template = get_template("proftpd/info_browser.django.html") context = Context({"info": ftp_client.info()}) return HttpResponse(template.render(context), mimetype="text/html") elif action == "change_permission": # Getting the permissions given according to the following scheme: # {"default": perm1, "user": {user1: perm2, user2: perm3}, "group": # {group1: perm4}} permissions = request.POST.get("permissions", None) if permissions: try: data = json.loads(permissions) except: # Damn... returng an error return HttpResponse(json.dumps({"ok": 0, "msg": _("Error occurred while serializing permissions")}), mimetype="application/json") # Setting he new permissions ftp_client.set_permissions(data) # Updating the config if not proftpd.update_config(): return HttpResponse(json.dumps({"ok": 0, "msg": _("Error occurred while saving the new configuration")}), mimetype="application/json") if ftp_client.is_dir: msg = _("The directory's permissions have been changed") else: msg = _("The file's permissions have been changed") return HttpResponse(json.dumps({"ok": 1, "msg": msg}), mimetype="application/json") elif action == "delete": if flag == "info": if ftp_client.is_file: msg = _('Are you sure you want to delete the file "%(name)s"?' % {"name": ftp_client.name}) else: msg = _('Are you sure you want to delete the directory "%(name)s"? The contents of the directory will also be deleted.' % {"name": ftp_client.name}) return HttpResponse(json.dumps({"confirm": msg}), mimetype="application/json") else: return HttpResponse(json.dumps(ftp_client.delete()), mimetype="application/json") elif action == "mkdir": name = request.POST.get("name", "New Folder") return HttpResponse(json.dumps(ftp_client.mkdir(name)), mimetype="application/json") elif action == "upload": response = ftp_client.upload(request.FILES['file'], \ request.META['REMOTE_ADDR']) return HttpResponse(response, mimetype='text/html') elif action == "download": if ftp_client.has_perm("READ", ftp_client.path) and ftp_client.is_file: return HttpResponse(json.dumps({"ok": 1, "redir": FTP_FILES_URL % ftp_client.download(request.META['REMOTE_ADDR'])}), mimetype="application/json") else: return HttpResponse(json.dumps({"ok": 0, "msg": _("Access denied")}), mimetype="application/json") else: log(3, "proftpd_app - ftp_client", "Strange action '%s'" % action) return HttpResponseBadRequest()