diff --git a/server/proxy/pf_capture.c b/server/proxy/pf_capture.c index b52b42f8f..b9b99e416 100644 --- a/server/proxy/pf_capture.c +++ b/server/proxy/pf_capture.c @@ -19,6 +19,10 @@ #include #include +#include +#include +#include +#include #include "pf_capture.h" @@ -30,6 +34,82 @@ static BOOL pf_capture_create_dir_if_not_exists(const char* path) return CreateDirectoryA(path, NULL); } +static BOOL pf_capture_create_user_captures_dir(const char* base_dir, const char* username) +{ + int rc; + size_t size; + char* buf = NULL; + BOOL ret = FALSE; + + /* create sub-directory in base captures directory for current username, if it doesn't already exists. */ + rc = _snprintf(NULL, 0, "%s/%s", base_dir, username); + if (rc < 0) + return FALSE; + + size = (size_t) rc; + + buf = malloc(size + 1); + if (!buf) + return FALSE; + + rc = sprintf(buf, "%s/%s", base_dir, username); + if (rc < 0 || (size_t) rc != size) + goto out; + + if (!pf_capture_create_dir_if_not_exists(buf)) + goto out; + + ret = TRUE; + +out: + free(buf); + return ret; +} + +static BOOL pf_capture_create_current_session_captures_dir(pClientContext* pc) +{ + proxyConfig* config = pc->pdata->config; + rdpSettings* settings = pc->context.settings; + const char* fmt = "%s/%s/%s_%02u-%02u-%"PRIu16"_%02u-%02u-%02u-%03u"; + int rc; + size_t size; + SYSTEMTIME localTime; + + GetLocalTime(&localTime); + + /* create sub-directory in current user's captures directory, for the specific session. */ + rc = _snprintf(NULL, 0, fmt, config->CapturesDirectory, settings->Username, + settings->ServerHostname, localTime.wDay, localTime.wMonth, localTime.wYear, + localTime.wHour, localTime.wMinute, localTime.wSecond, localTime.wMilliseconds); + + if (rc < 0) + return FALSE; + + size = (size_t) rc; + + /* `pc->frames_dir` will be used by proxy client for saving frames to storage. */ + pc->frames_dir = malloc(size + 1); + if (!pc->frames_dir) + return FALSE; + + rc = sprintf(pc->frames_dir, fmt, config->CapturesDirectory, settings->Username, + settings->ServerHostname, localTime.wDay, localTime.wMonth, localTime.wYear, + localTime.wHour, localTime.wMinute, localTime.wSecond, localTime.wMilliseconds); + + if (rc < 0 || (size_t) rc != size) + goto error; + + if (!pf_capture_create_dir_if_not_exists(pc->frames_dir)) + goto error; + + return TRUE; + +error: + free(pc->frames_dir); + return FALSE; +} + + /* creates a directory to store captured session frames. * * @context: current session. @@ -44,34 +124,45 @@ BOOL pf_capture_create_session_directory(pClientContext* pc) { proxyConfig* config = pc->pdata->config; rdpSettings* settings = pc->context.settings; - SYSTEMTIME localTime; - char tmp[MAX_PATH]; - const char* fmt = "%s/%s/%s_%02u-%02u-%"PRIu16"_%02u-%02u-%02u-%03u"; - _snprintf(tmp, sizeof(tmp), "%s/%s", config->CapturesDirectory, settings->Username); - if (!pf_capture_create_dir_if_not_exists(tmp)) + if (!pf_capture_create_user_captures_dir(config->CapturesDirectory, settings->Username)) return FALSE; - pc->frames_dir = malloc(MAX_PATH); - if (!pc->frames_dir) + if (!pf_capture_create_current_session_captures_dir(pc)) return FALSE; - GetLocalTime(&localTime); - sprintf_s(pc->frames_dir, MAX_PATH, fmt, config->CapturesDirectory, settings->Username, - settings->ServerHostname, localTime.wDay, localTime.wMonth, localTime.wYear, - localTime.wHour, localTime.wMinute, localTime.wSecond, localTime.wMilliseconds); - - return pf_capture_create_dir_if_not_exists(pc->frames_dir); + return TRUE; } /* saves a captured frame in a BMP format. */ BOOL pf_capture_save_frame(pClientContext* pc, const BYTE* frame) { rdpSettings* settings = pc->context.settings; + int rc; const char* fmt = "%s/%"PRIu64".bmp"; - char file_path[MAX_PATH]; + char* file_path = NULL; + size_t size; - sprintf_s(file_path, sizeof(file_path), fmt, pc->frames_dir, pc->frames_count++); - return winpr_bitmap_write(file_path, frame, settings->DesktopWidth, settings->DesktopHeight, + if (!pc->frames_dir) + return FALSE; + + rc = _snprintf(NULL, 0, fmt, pc->frames_dir, pc->frames_count++); + if (rc < 0) + return FALSE; + + size = (size_t) rc; + file_path = malloc(size + 1); + if (!file_path) + return FALSE; + + rc = sprintf(file_path, fmt, pc->frames_dir, pc->frames_count++); + if (rc < 0 || (size_t) rc != size) + goto out; + + rc = winpr_bitmap_write(file_path, frame, settings->DesktopWidth, settings->DesktopHeight, settings->ColorDepth); + +out: + free(file_path); + return rc; } diff --git a/server/proxy/pf_capture.h b/server/proxy/pf_capture.h index 92aaf1c28..93a601015 100644 --- a/server/proxy/pf_capture.h +++ b/server/proxy/pf_capture.h @@ -20,11 +20,6 @@ #ifndef FREERDP_SERVER_PROXY_CAPTURE_H #define FREERDP_SERVER_PROXY_CAPTURE_H -#include -#include -#include -#include - #include "pf_context.h" BOOL pf_capture_create_session_directory(pClientContext* context);