Files
CyberPanel/userManagment/homeDirectoryViews.py

255 lines
10 KiB
Python
Raw Normal View History

#!/usr/local/CyberCP/bin/python
import json
import os
import sys
from django.shortcuts import render
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from loginSystem.views import loadLoginPage
from loginSystem.models import Administrator
from plogical.acl import ACLManager
from plogical.httpProc import httpProc
from .homeDirectoryManager import HomeDirectoryManager
from .models import HomeDirectory, UserHomeMapping
from plogical.CyberCPLogFileWriter import CyberCPLogFileWriter as logging
def loadHomeDirectoryManagement(request):
"""Load home directory management interface"""
try:
userID = request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if currentACL['admin'] != 1:
return ACLManager.loadError()
# Get all home directories
home_directories = HomeDirectory.objects.all().order_by('name')
# Get statistics
stats = HomeDirectoryManager.getHomeDirectoryStats()
proc = httpProc(request, 'userManagment/homeDirectoryManagement.html', {
'home_directories': home_directories,
'stats': stats
}, 'admin')
return proc.render()
except Exception as e:
logging.CyberCPLogFileWriter.writeToFile(f"Error loading home directory management: {str(e)}")
return ACLManager.loadError()
def detectHomeDirectories(request):
"""Detect and add new home directories"""
try:
userID = request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if currentACL['admin'] != 1:
return JsonResponse({'status': 0, 'error_message': 'Unauthorized access'})
# Detect home directories
detected_dirs = HomeDirectoryManager.detectHomeDirectories()
added_count = 0
for dir_info in detected_dirs:
# Check if directory already exists in database
if not HomeDirectory.objects.filter(path=dir_info['path']).exists():
# Create new home directory entry
home_dir = HomeDirectory(
name=dir_info['name'],
path=dir_info['path'],
is_active=True,
is_default=(dir_info['path'] == '/home')
)
home_dir.save()
added_count += 1
return JsonResponse({
'status': 1,
'message': f'Detected and added {added_count} new home directories',
'added_count': added_count
})
except Exception as e:
logging.CyberCPLogFileWriter.writeToFile(f"Error detecting home directories: {str(e)}")
return JsonResponse({'status': 0, 'error_message': str(e)})
def updateHomeDirectory(request):
"""Update home directory settings"""
try:
userID = request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if currentACL['admin'] != 1:
return JsonResponse({'status': 0, 'error_message': 'Unauthorized access'})
data = json.loads(request.body)
home_dir_id = data.get('id')
is_active = data.get('is_active', True)
is_default = data.get('is_default', False)
max_users = data.get('max_users', 0)
description = data.get('description', '')
try:
home_dir = HomeDirectory.objects.get(id=home_dir_id)
# If setting as default, unset other defaults
if is_default:
HomeDirectory.objects.filter(is_default=True).update(is_default=False)
home_dir.is_active = is_active
home_dir.is_default = is_default
home_dir.max_users = max_users
home_dir.description = description
home_dir.save()
return JsonResponse({'status': 1, 'message': 'Home directory updated successfully'})
except HomeDirectory.DoesNotExist:
return JsonResponse({'status': 0, 'error_message': 'Home directory not found'})
except Exception as e:
logging.CyberCPLogFileWriter.writeToFile(f"Error updating home directory: {str(e)}")
return JsonResponse({'status': 0, 'error_message': str(e)})
def deleteHomeDirectory(request):
"""Delete home directory (only if no users assigned)"""
try:
userID = request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if currentACL['admin'] != 1:
return JsonResponse({'status': 0, 'error_message': 'Unauthorized access'})
data = json.loads(request.body)
home_dir_id = data.get('id')
try:
home_dir = HomeDirectory.objects.get(id=home_dir_id)
# Check if any users are assigned to this home directory
user_count = UserHomeMapping.objects.filter(home_directory=home_dir).count()
if user_count > 0:
return JsonResponse({
'status': 0,
'error_message': f'Cannot delete home directory. {user_count} users are assigned to it.'
})
# Don't allow deletion of /home (default)
if home_dir.path == '/home':
return JsonResponse({
'status': 0,
'error_message': 'Cannot delete the default /home directory'
})
home_dir.delete()
return JsonResponse({'status': 1, 'message': 'Home directory deleted successfully'})
except HomeDirectory.DoesNotExist:
return JsonResponse({'status': 0, 'error_message': 'Home directory not found'})
except Exception as e:
logging.CyberCPLogFileWriter.writeToFile(f"Error deleting home directory: {str(e)}")
return JsonResponse({'status': 0, 'error_message': str(e)})
def getHomeDirectoryStats(request):
"""Get home directory statistics"""
try:
userID = request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if currentACL['admin'] != 1:
return JsonResponse({'status': 0, 'error_message': 'Unauthorized access'})
stats = HomeDirectoryManager.getHomeDirectoryStats()
return JsonResponse({'status': 1, 'stats': stats})
except Exception as e:
logging.CyberCPLogFileWriter.writeToFile(f"Error getting home directory stats: {str(e)}")
return JsonResponse({'status': 0, 'error_message': str(e)})
def getUserHomeDirectories(request):
"""Get available home directories for user creation"""
try:
userID = request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if currentACL['admin'] != 1 and currentACL['createNewUser'] != 1:
return JsonResponse({'status': 0, 'error_message': 'Unauthorized access'})
# Get active home directories
home_dirs = HomeDirectory.objects.filter(is_active=True).order_by('name')
directories = []
for home_dir in home_dirs:
directories.append({
'id': home_dir.id,
'name': home_dir.name,
'path': home_dir.path,
'available_space': home_dir.get_available_space(),
'user_count': home_dir.get_user_count(),
'is_default': home_dir.is_default,
'description': home_dir.description
})
return JsonResponse({'status': 1, 'directories': directories})
except Exception as e:
logging.CyberCPLogFileWriter.writeToFile(f"Error getting user home directories: {str(e)}")
return JsonResponse({'status': 0, 'error_message': str(e)})
def migrateUser(request):
"""Migrate user to different home directory"""
try:
userID = request.session['userID']
currentACL = ACLManager.loadedACL(userID)
if currentACL['admin'] != 1:
return JsonResponse({'status': 0, 'error_message': 'Unauthorized access'})
data = json.loads(request.body)
username = data.get('username')
target_home_id = data.get('target_home_id')
try:
user = Administrator.objects.get(userName=username)
target_home = HomeDirectory.objects.get(id=target_home_id)
# Get current home directory
try:
current_mapping = UserHomeMapping.objects.get(user=user)
current_home = current_mapping.home_directory
except UserHomeMapping.DoesNotExist:
current_home = HomeDirectory.objects.filter(is_default=True).first()
if not current_home:
current_home = HomeDirectory.objects.first()
if not current_home:
return JsonResponse({'status': 0, 'error_message': 'No home directory found for user'})
# Perform migration
success, message = HomeDirectoryManager.migrateUser(
username,
current_home.path,
target_home.path
)
if success:
# Update user mapping
UserHomeMapping.objects.update_or_create(
user=user,
defaults={'home_directory': target_home}
)
return JsonResponse({'status': 1, 'message': message})
else:
return JsonResponse({'status': 0, 'error_message': message})
except Administrator.DoesNotExist:
return JsonResponse({'status': 0, 'error_message': 'User not found'})
except HomeDirectory.DoesNotExist:
return JsonResponse({'status': 0, 'error_message': 'Target home directory not found'})
except Exception as e:
logging.CyberCPLogFileWriter.writeToFile(f"Error migrating user: {str(e)}")
return JsonResponse({'status': 0, 'error_message': str(e)})