private static void ProcessMedia(HttpContext context, bool isUpload, Database scriptDb, string itemParam, bool unpackZip, bool skipExisting) { var request = context.Request; if (isUpload) { if (ZipUtils.IsZipContent(request.InputStream) && unpackZip) { PowerShellLog.Debug("The uploaded asset will be extracted to Media Library."); using (var packageReader = new Sitecore.Zip.ZipReader(request.InputStream)) { itemParam = Path.GetDirectoryName(itemParam.TrimEnd('\\', '/')); foreach (var zipEntry in packageReader.Entries) { if (!zipEntry.IsDirectory && zipEntry.Size > 0) { ProcessMediaUpload(zipEntry.GetStream(), scriptDb, $"{itemParam}/{zipEntry.Name}", skipExisting); } } } } else if (request.Files.AllKeys.Length > 0) { foreach (string fileName in request.Files.Keys) { var file = request.Files[fileName]; if (file != null) { ProcessMediaUpload(file.InputStream, scriptDb, $"{itemParam}/{file.FileName}", skipExisting); } } } else { ProcessMediaUpload(request.InputStream, scriptDb, itemParam, skipExisting); } } else { ProcessMediaDownload(context, scriptDb, itemParam); } }
public void ProcessRequest(HttpContext context) { var request = HttpContext.Current.Request; var userName = request.Params.Get("user"); var password = request.Params.Get("password"); var itemParam = request.Params.Get("script"); var pathParam = request.Params.Get("path"); var originParam = request.Params.Get("scriptDb"); var apiVersion = request.Params.Get("apiVersion"); var serviceMappingKey = request.HttpMethod + "/" + apiVersion; var isUpload = request.HttpMethod.Is("POST") && request.InputStream.Length > 0; var unpackZip = request.Params.Get("skipunpack").IsNot("true"); var skipExisting = request.Params.Get("skipexisting").Is("true"); var scDB = request.Params.Get("sc_database"); var serviceName = apiVersionToServiceMapping.ContainsKey(serviceMappingKey) ? apiVersionToServiceMapping[serviceMappingKey] : string.Empty; // verify that the service is enabled if (!CheckServiceEnabled(apiVersion, request.HttpMethod)) { PowerShellLog.Error($"Attempt to call the {apiVersion} service failed as it is not enabled."); return; } // verify that the user is authorized to access the end point var authUserName = string.IsNullOrEmpty(userName) ? Context.User.Name : userName; var identity = new AccountIdentity(authUserName); if (!ServiceAuthorizationManager.IsUserAuthorized(serviceName, identity.Name)) { HttpContext.Current.Response.StatusCode = 401; PowerShellLog.Error( $"Attempt to call the '{serviceMappingKey}' service failed as user '{userName}' was not authorized."); return; } lock (loginLock) { // login user if specified explicitly if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password)) { AuthenticationManager.Login(identity.Name, password, false); } } var isAuthenticated = Context.IsLoggedIn; // in some cases we need to set the database as it's still set to web after authentication if (!scDB.IsNullOrEmpty()) { Context.Database = Database.GetDatabase(scDB); } var useContextDatabase = apiVersion.Is("file") || apiVersion.Is("handle") || !isAuthenticated || string.IsNullOrEmpty(originParam) || originParam.Is("current"); var scriptDb = useContextDatabase ? Context.Database : Database.GetDatabase(originParam); var dbName = scriptDb?.Name; if (!CheckServiceAuthentication(apiVersion, isAuthenticated)) { PowerShellLog.Error( $"Attempt to call the {serviceMappingKey} service failed as - user not logged in, authentication failed or no credentials provided."); return; } if (scriptDb == null && !apiVersion.Is("file") && !apiVersion.Is("handle")) { PowerShellLog.Error( $"The '{serviceMappingKey}' service requires a database but none was found in parameters or Context."); return; } PowerShellLog.Info($"'{serviceMappingKey}' called by user: '******'"); PowerShellLog.Debug($"'{request.Url}'"); Item scriptItem; switch (apiVersion) { case "1": scriptItem = scriptDb.GetItem(itemParam) ?? scriptDb.GetItem(ApplicationSettings.ScriptLibraryPath + itemParam); break; case "media": if (isUpload) { if (ZipUtils.IsZipContent(request.InputStream) && unpackZip) { PowerShellLog.Debug("The uploaded asset will be extracted to Media Library."); using (var packageReader = new Sitecore.Zip.ZipReader(request.InputStream)) { itemParam = Path.GetDirectoryName(itemParam.TrimEnd('\\', '/')); foreach (var zipEntry in packageReader.Entries) { if (!zipEntry.IsDirectory && zipEntry.Size > 0) { ProcessMediaUpload(zipEntry.GetStream(), scriptDb, $"{itemParam}/{zipEntry.Name}", skipExisting); } } } } else if (request.Files?.AllKeys?.Length > 0) { foreach (string fileName in request.Files.Keys) { var file = request.Files[fileName]; ProcessMediaUpload(file.InputStream, scriptDb, $"{itemParam}/{file.FileName}", skipExisting); } } else { ProcessMediaUpload(request.InputStream, scriptDb, itemParam, skipExisting); } } else { ProcessMediaDownload(scriptDb, itemParam); } return; case "file": if (isUpload) { ProcessFileUpload(request.InputStream, originParam, pathParam); } else { ProcessFileDownload(originParam, pathParam); } return; case "handle": ProcessHandle(originParam); return; case "2": UpdateCache(dbName); if (!apiScripts.ContainsKey(dbName)) { HttpContext.Current.Response.StatusCode = 404; return; } var dbScripts = apiScripts[dbName]; if (!dbScripts.ContainsKey(itemParam)) { HttpContext.Current.Response.StatusCode = 404; return; } scriptItem = scriptDb.GetItem(dbScripts[itemParam].Id); apiScripts = null; break; default: PowerShellLog.Error($"Requested API/Version ({serviceMappingKey}) is not supported."); return; } var streams = new Dictionary <string, Stream>(); if (request.Files?.AllKeys?.Length > 0) { foreach (string fileName in request.Files.AllKeys) { streams.Add(fileName, request.Files[fileName].InputStream); } } else if (request.InputStream != null) { streams.Add("stream", request.InputStream); } ProcessScript(context, scriptItem, streams); }
public void ProcessRequest(HttpContext context) { var request = HttpContext.Current.Request; var userName = request.Params.Get("user"); var password = request.Params.Get("password"); var itemParam = request.Params.Get("script"); var pathParam = request.Params.Get("path"); var originParam = request.Params.Get("scriptDb"); var apiVersion = request.Params.Get("apiVersion"); var serviceMappingKey = request.HttpMethod + "/" + apiVersion; var isUpload = request.HttpMethod.Is("POST") && request.InputStream.Length > 0; var unpackZip = request.Params.Get("skipunpack").IsNot("true"); var skipExisting = request.Params.Get("skipexisting").Is("true"); var serviceName = apiVersionToServiceMapping.ContainsKey(serviceMappingKey) ? apiVersionToServiceMapping[serviceMappingKey] : string.Empty; // verify that the service is enabled if (!CheckServiceEnabled(apiVersion, request.HttpMethod)) { PowerShellLog.Error($"Attempt to call the {apiVersion} service failed as it is not enabled."); return; } // verify that the user is authorized to access the end point var authUserName = string.IsNullOrEmpty(userName) ? Context.User.Name : userName; if (!ServiceAuthorizationManager.IsUserAuthorized(serviceName, authUserName, false)) { HttpContext.Current.Response.StatusCode = 401; PowerShellLog.Error($"Attempt to call the '{apiVersion}' service failed as user '{userName}' was not authorized."); return; } // login user if specified explicitly if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password)) { var account = new AccountIdentity(userName); AuthenticationManager.Login(account.Name, password, false); } var isAuthenticated = Context.IsLoggedIn; var useContextDatabase = apiVersion.Is("file") || apiVersion.Is("handle") || !isAuthenticated || string.IsNullOrEmpty(originParam) || originParam.Is("current"); var scriptDb = useContextDatabase ? Context.Database : Database.GetDatabase(originParam); var dbName = scriptDb.Name; if (!CheckServiceAuthentication(apiVersion, isAuthenticated)) { PowerShellLog.Error($"Attempt to call the {apiVersion} service failed as - user not logged in, authentication failed or no credentials provided."); return; } if (isUpload) { switch (apiVersion) { case "media": if (ZipUtils.IsZipContent(request.InputStream) && unpackZip) { PowerShellLog.Debug("The uploaded asset will be extracted to Media Library."); using (var packageReader = new Sitecore.Zip.ZipReader(request.InputStream)) { foreach (var zipEntry in packageReader.Entries) { if (!zipEntry.IsDirectory) { ProcessMediaUpload(zipEntry.GetStream(), scriptDb, itemParam, zipEntry.Name, skipExisting); } } } } else { ProcessMediaUpload(request.InputStream, scriptDb, itemParam, null, skipExisting); } break; case "file": ProcessFileUpload(request.InputStream, originParam, pathParam); break; default: PowerShellLog.Error($"Requested API/Version ({apiVersion}) is not supported."); break; } return; } Item scriptItem; switch (apiVersion) { case "1": scriptItem = scriptDb.GetItem(itemParam) ?? scriptDb.GetItem(ApplicationSettings.ScriptLibraryPath + itemParam); break; case "media": ProcessMediaDownload(scriptDb, itemParam); return; case "file": ProcessFileDownload(originParam, pathParam); return; case "handle": ProcessHandle(originParam); return; default: UpdateCache(dbName); if (!apiScripts.ContainsKey(dbName)) { HttpContext.Current.Response.StatusCode = 404; return; } var dbScripts = apiScripts[scriptDb.Name]; if (!dbScripts.ContainsKey(itemParam)) { HttpContext.Current.Response.StatusCode = 404; return; } scriptItem = scriptDb.GetItem(dbScripts[itemParam].Id); apiScripts = null; break; } ProcessScript(context, scriptItem); }
public void ProcessRequest(HttpContext context) { var request = HttpContext.Current.Request; var userName = request.Params.Get("user"); var password = request.Params.Get("password"); var itemParam = request.Params.Get("script"); var pathParam = request.Params.Get("path"); var originParam = request.Params.Get("scriptDb"); var apiVersion = request.Params.Get("apiVersion"); var isUpload = request.HttpMethod.Is("POST") && request.InputStream.Length > 0; var unpackZip = request.Params.Get("skipunpack").IsNot("true"); var skipExisting = request.Params.Get("skipexisting").Is("true"); if (!CheckServiceEnabled(apiVersion, request.HttpMethod)) { LogUtils.Debug($"The specified service {apiVersion} is not enabled.", this); return; } if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password)) { var account = new AccountIdentity(userName); AuthenticationManager.Login(account.Name, password, false); } var isAuthenticated = Context.IsLoggedIn; var useContextDatabase = apiVersion.Is("file") || apiVersion.Is("handle") || !isAuthenticated || string.IsNullOrEmpty(originParam) || originParam.Is("current"); var scriptDb = useContextDatabase ? Context.Database : Database.GetDatabase(originParam); var dbName = scriptDb.Name; if (!CheckServiceAuthentication(apiVersion, isAuthenticated)) { LogUtils.Debug($"The specified service {apiVersion} requires authentication.", this); return; } if (isUpload) { switch (apiVersion) { case "media": if (ZipUtils.IsZipContent(request.InputStream) && unpackZip) { LogUtils.Debug("The uploaded media item will be extracted to the media library.", this); using (var packageReader = new Sitecore.Zip.ZipReader(request.InputStream)) { foreach (var zipEntry in packageReader.Entries) { if (!zipEntry.IsDirectory) { ProcessMediaUpload(zipEntry.GetStream(), scriptDb, itemParam, zipEntry.Name, skipExisting); } } } } else { ProcessMediaUpload(request.InputStream, scriptDb, itemParam, null, skipExisting); } break; case "file": ProcessFileUpload(request.InputStream, originParam, pathParam); break; default: LogUtils.Debug($"The specified apiVersion {apiVersion} is not supported.", this); break; } return; } Item scriptItem; switch (apiVersion) { case "1": scriptItem = scriptDb.GetItem(itemParam) ?? scriptDb.GetItem(ApplicationSettings.ScriptLibraryPath + itemParam); break; case "media": ProcessMediaDownload(scriptDb, itemParam); return; case "file": ProcessFileDownload(originParam, pathParam); return; case "handle": ProcessHandle(originParam); return; default: UpdateCache(dbName); if (!apiScripts.ContainsKey(dbName)) { HttpContext.Current.Response.StatusCode = 404; return; } var dbScripts = apiScripts[scriptDb.Name]; if (!dbScripts.ContainsKey(itemParam)) { HttpContext.Current.Response.StatusCode = 404; return; } scriptItem = scriptDb.GetItem(dbScripts[itemParam].Id); apiScripts = null; break; } ProcessScript(context, scriptItem); }