diff --git a/thirdpart/seaserv/__init__.py b/thirdpart/seaserv/__init__.py index e9198cf22b..d41afb5736 100644 --- a/thirdpart/seaserv/__init__.py +++ b/thirdpart/seaserv/__init__.py @@ -29,7 +29,7 @@ from service import create_org, get_orgs_by_user, get_org_by_url_prefix, \ from service import get_related_users_by_repo, get_related_users_by_org_repo from service import CCNET_CONF_PATH, CCNET_SERVER_ADDR, CCNET_SERVER_PORT, \ - MAX_UPLOAD_FILE_SIZE, HTTP_SERVER_ROOT + MAX_UPLOAD_FILE_SIZE, MAX_DOWNLOAD_DIR_SIZE, HTTP_SERVER_ROOT from htmldiff import HtmlDiff diff --git a/thirdpart/seaserv/service.py b/thirdpart/seaserv/service.py index 9417f64117..f250632084 100644 --- a/thirdpart/seaserv/service.py +++ b/thirdpart/seaserv/service.py @@ -120,6 +120,15 @@ if config.has_option('httpserver', 'max_upload_size'): except ValueError: pass +MAX_DOWNLOAD_DIR_SIZE = 100 * (2 ** 20) # Default max size of a downloadable dir +if config.has_option('httpserver', 'max_download_dir_size'): + try: + max_download_dir_size_mb = config.getint('httpserver', 'max_download_dir_size') + if max_download_dir_size_mb > 0: + MAX_DOWNLOAD_DIR_SIZE = max_download_dir_size_mb * (2 ** 20) + except ValueError: + pass + if CCNET_SERVER_ADDR: enable_https = config.getboolean('httpserver', 'https') if \ config.has_option('httpserver', 'https') else False diff --git a/views.py b/views.py index 2a9d6a0072..99ee701c02 100644 --- a/views.py +++ b/views.py @@ -47,7 +47,7 @@ from seaserv import ccnet_rpc, ccnet_threaded_rpc, get_repos, get_emailusers, \ get_related_users_by_repo, get_related_users_by_org_repo, HtmlDiff, \ get_session_info, get_group_repoids, get_repo_owner, get_file_id_by_path, \ get_repo_history_limit, set_repo_history_limit, MAX_UPLOAD_FILE_SIZE, \ - get_commit + get_commit, MAX_DOWNLOAD_DIR_SIZE from pysearpc import SearpcError from signals import repo_created, repo_deleted @@ -2927,6 +2927,16 @@ def repo_download_dir(request, repo_id): if allow_download: dir_id = seafserv_threaded_rpc.get_dirid_by_path (repo.head_cmmt_id, path.encode('utf-8')) + + try: + total_size = seafserv_threaded_rpc.get_dir_size(dir_id) + except Exception, e: + logger.error(str(e)) + return render_error(request, _(u'Internal Error')) + + if total_size > MAX_DOWNLOAD_DIR_SIZE: + return render_error(request, _(u'Unable to download directory "%s": size too large') % dirname) + token = seafserv_rpc.web_get_access_token(repo_id, dir_id, 'download-dir', @@ -2944,10 +2954,7 @@ def events(request): org_id = request.GET.get('org_id') events = get_org_user_events(org_id, username, start) else: - try: - events = get_user_events(username, start) - except Exception, e: - print e + events = get_user_events(username, start) events_more = False if len(events) == 11: