Files
Orchard/src/Orchard.Web/Modules/Orchard.Media/Services/XmlRpcHandler.cs

89 lines
3.6 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.IO;
using System.Web.Mvc;
using System.Web.Routing;
using System.Xml.Linq;
using Orchard.Core.XmlRpc;
using Orchard.Core.XmlRpc.Models;
using Orchard.Localization;
using Orchard.Mvc.Extensions;
using Orchard.Security;
namespace Orchard.Media.Services {
public class XmlRpcHandler : IXmlRpcHandler {
private readonly IMembershipService _membershipService;
private readonly IAuthorizationService _authorizationService;
private readonly IMediaService _mediaService;
private readonly RouteCollection _routeCollection;
public XmlRpcHandler(
IMembershipService membershipService,
IAuthorizationService authorizationService,
IMediaService mediaService,
RouteCollection routeCollection) {
_membershipService = membershipService;
_authorizationService = authorizationService;
_mediaService = mediaService;
_routeCollection = routeCollection;
T = NullLocalizer.Instance;
}
public Localizer T { get; set; }
public void SetCapabilities(XElement options) {
const string manifestUri = "http://schemas.microsoft.com/wlw/manifest/weblog";
options.SetElementValue(XName.Get("supportsFileUpload", manifestUri), "Yes");
}
public void Process(XmlRpcContext context) {
var urlHelper = new UrlHelper(context.ControllerContext.RequestContext, _routeCollection);
if (context.Request.MethodName == "metaWeblog.newMediaObject") {
var result = MetaWeblogNewMediaObject(
Convert.ToString(context.Request.Params[1].Value),
Convert.ToString(context.Request.Params[2].Value),
(XRpcStruct)context.Request.Params[3].Value,
urlHelper);
context.Response = new XRpcMethodResponse().Add(result);
}
}
private XRpcStruct MetaWeblogNewMediaObject(
string userName,
string password,
XRpcStruct file,
UrlHelper url) {
List<LocalizedString> validationErrors;
var user = _membershipService.ValidateUser(userName, password, out validationErrors);
if (!_authorizationService.TryCheckAccess(Permissions.ManageMedia, user, null)) {
throw new OrchardCoreException(T("Access denied"));
}
var name = file.Optional<string>("name");
var bits = file.Optional<byte[]>("bits");
string directoryName = Path.GetDirectoryName(name);
if (string.IsNullOrWhiteSpace(directoryName)) { // Some clients only pass in a name path that does not contain a directory component.
directoryName = "media";
}
try {
// delete the file if it already exists, e.g. an updated image in a blog post
// it's safe to delete the file as each content item gets a specific folder
_mediaService.DeleteFile(directoryName, Path.GetFileName(name));
}
catch {
// current way to delete a file if it exists
}
string publicUrl = _mediaService.UploadMediaFile(directoryName, Path.GetFileName(name), bits, true);
return new XRpcStruct() // Some clients require all optional attributes to be declared Wordpress responds in this way as well.
.Set("file", publicUrl)
.Set("url", url.MakeAbsolute(publicUrl))
.Set("type", file.Optional<string>("type"));
}
}
Code cleanup and consistency (renaming to match patterns, moving namespaces, etc) --HG-- branch : dev rename : src/Orchard.Web/Core/Common/Controllers/BodyDriver.cs => src/Orchard.Web/Core/Common/Drivers/BodyDriver.cs rename : src/Orchard.Web/Core/Common/Controllers/RoutableDriver.cs => src/Orchard.Web/Core/Common/Drivers/RoutableDriver.cs rename : src/Orchard.Web/Core/Common/Models/BodyAspectHandler.cs => src/Orchard.Web/Core/Common/Handlers/BodyAspectHandler.cs rename : src/Orchard.Web/Core/Common/Models/CommonAspectHandler.cs => src/Orchard.Web/Core/Common/Handlers/CommonAspectHandler.cs rename : src/Orchard.Web/Core/Common/Models/RoutableAspectHandler.cs => src/Orchard.Web/Core/Common/Handlers/RoutableAspectHandler.cs rename : src/Orchard.Web/Core/Common/Records/BodyRecord.cs => src/Orchard.Web/Core/Common/Models/BodyRecord.cs rename : src/Orchard.Web/Core/Common/Records/CommonRecord.cs => src/Orchard.Web/Core/Common/Models/CommonRecord.cs rename : src/Orchard.Web/Core/Common/Records/CommonVersionRecord.cs => src/Orchard.Web/Core/Common/Models/CommonVersionRecord.cs rename : src/Orchard.Web/Core/Common/Records/RoutableRecord.cs => src/Orchard.Web/Core/Common/Models/RoutableRecord.cs rename : src/Orchard.Web/Core/Navigation/Records/MenuItemRecord.cs => src/Orchard.Web/Core/Navigation/Models/MenuItemRecord.cs rename : src/Orchard.Web/Core/Navigation/Records/MenuPartRecord.cs => src/Orchard.Web/Core/Navigation/Models/MenuPartRecord.cs rename : src/Orchard.Web/Core/Navigation/Services/MainMenu.cs => src/Orchard.Web/Core/Navigation/Services/MainMenuService.cs rename : src/Orchard.Web/Core/Scheduling/Records/ScheduledTaskRecord.cs => src/Orchard.Web/Core/Scheduling/Models/ScheduledTaskRecord.cs rename : src/Orchard.Web/Core/Settings/Controllers/SiteSettingsDriver.cs => src/Orchard.Web/Core/Settings/Drivers/SiteSettingsDriver.cs rename : src/Orchard.Web/Core/Settings/Models/SiteSettingsHandler.cs => src/Orchard.Web/Core/Settings/Handlers/SiteSettingsHandler.cs rename : src/Orchard.Web/Core/Settings/Records/SiteSettingsRecord.cs => src/Orchard.Web/Core/Settings/Models/SiteSettingsRecord.cs rename : src/Orchard.Web/Core/Themes/Models/ThemeSiteSettingsHandler.cs => src/Orchard.Web/Core/Themes/Handlers/ThemeSiteSettingsHandler.cs rename : src/Orchard.Web/Core/Themes/Records/ThemeRecord.cs => src/Orchard.Web/Core/Themes/Models/ThemeRecord.cs rename : src/Orchard.Web/Core/Themes/Records/ThemeSiteSettingsRecord.cs => src/Orchard.Web/Core/Themes/Models/ThemeSiteSettingsRecord.cs rename : src/Orchard.Web/Modules/Orchard.Blogs/Controllers/BlogDriver.cs => src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogDriver.cs rename : src/Orchard.Web/Modules/Orchard.Blogs/Controllers/BlogPostDriver.cs => src/Orchard.Web/Modules/Orchard.Blogs/Drivers/BlogPostDriver.cs rename : src/Orchard.Web/Modules/Orchard.Blogs/Models/BlogArchiveHandler.cs => src/Orchard.Web/Modules/Orchard.Blogs/Handlers/BlogArchiveHandler.cs rename : src/Orchard.Web/Modules/Orchard.Blogs/Models/BlogHandler.cs => src/Orchard.Web/Modules/Orchard.Blogs/Handlers/BlogHandler.cs rename : src/Orchard.Web/Modules/Orchard.Blogs/Models/BlogPostHandler.cs => src/Orchard.Web/Modules/Orchard.Blogs/Handlers/BlogPostHandler.cs rename : src/Orchard.Web/Modules/Orchard.Comments/Controllers/CommentDriver.cs => src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentDriver.cs rename : src/Orchard.Web/Modules/Orchard.Comments/Controllers/HasCommentsContainerDriver.cs => src/Orchard.Web/Modules/Orchard.Comments/Drivers/HasCommentsContainerDriver.cs rename : src/Orchard.Web/Modules/Orchard.Comments/Controllers/HasCommentsDriver.cs => src/Orchard.Web/Modules/Orchard.Comments/Drivers/HasCommentsDriver.cs rename : src/Orchard.Web/Modules/Orchard.Comments/Models/CommentHandler.cs => src/Orchard.Web/Modules/Orchard.Comments/Handlers/CommentHandler.cs rename : src/Orchard.Web/Modules/Orchard.Comments/Models/CommentSettingsHandler.cs => src/Orchard.Web/Modules/Orchard.Comments/Handlers/CommentSettingsHandler.cs rename : src/Orchard.Web/Modules/Orchard.Comments/Models/HasCommentsContainerHandler.cs => src/Orchard.Web/Modules/Orchard.Comments/Handlers/HasCommentsContainerHandler.cs rename : src/Orchard.Web/Modules/Orchard.Comments/Models/HasCommentsHandler.cs => src/Orchard.Web/Modules/Orchard.Comments/Handlers/HasCommentsHandler.cs rename : src/Orchard.Web/Modules/Orchard.DevTools/Models/DebugLinkHandler.cs => src/Orchard.Web/Modules/Orchard.DevTools/Handlers/DebugLinkHandler.cs rename : src/Orchard.Web/Modules/Orchard.Pages/Controllers/PageDriver.cs => src/Orchard.Web/Modules/Orchard.Pages/Drivers/PageDriver.cs rename : src/Orchard.Web/Modules/Orchard.Pages/Models/PageHandler.cs => src/Orchard.Web/Modules/Orchard.Pages/Handlers/PageHandler.cs rename : src/Orchard.Web/Modules/Orchard.Pages/Services/SlugConstraint.cs => src/Orchard.Web/Modules/Orchard.Pages/Routing/SlugConstraint.cs rename : src/Orchard.Web/Modules/Orchard.Pages/Services/SlugConstraintUpdator.cs => src/Orchard.Web/Modules/Orchard.Pages/Routing/SlugConstraintUpdator.cs rename : src/Orchard.Web/Modules/Orchard.Roles/Controllers/UserRolesDriver.cs => src/Orchard.Web/Modules/Orchard.Roles/Drivers/UserRolesDriver.cs rename : src/Orchard.Web/Modules/Orchard.Roles/Models/UserRolesHandler.cs => src/Orchard.Web/Modules/Orchard.Roles/Handlers/UserRolesHandler.cs rename : src/Orchard.Web/Modules/Orchard.Roles/Records/PermissionRecord.cs => src/Orchard.Web/Modules/Orchard.Roles/Models/PermissionRecord.cs rename : src/Orchard.Web/Modules/Orchard.Roles/Records/RoleRecord.cs => src/Orchard.Web/Modules/Orchard.Roles/Models/RoleRecord.cs rename : src/Orchard.Web/Modules/Orchard.Roles/Records/RolesPermissions.cs => src/Orchard.Web/Modules/Orchard.Roles/Models/RolesPermissionsRecord.cs rename : src/Orchard.Web/Modules/Orchard.Roles/Records/UserRolesRecord.cs => src/Orchard.Web/Modules/Orchard.Roles/Models/UserRolesRecord.cs rename : src/Orchard.Web/Modules/Orchard.Sandbox/Controllers/SandboxPageDriver.cs => src/Orchard.Web/Modules/Orchard.Sandbox/Drivers/SandboxPageDriver.cs rename : src/Orchard.Web/Modules/Orchard.Sandbox/Models/SandboxContentHandler.cs => src/Orchard.Web/Modules/Orchard.Sandbox/Handlers/SandboxContentHandler.cs rename : src/Orchard.Web/Modules/Orchard.Tags/Controllers/HasTagsDriver.cs => src/Orchard.Web/Modules/Orchard.Tags/Drivers/HasTagsDriver.cs rename : src/Orchard.Web/Modules/Orchard.Tags/Models/HasTagsHandler.cs => src/Orchard.Web/Modules/Orchard.Tags/Handlers/HasTagsHandler.cs rename : src/Orchard.Web/Modules/Orchard.Users/Controllers/UserDriver.cs => src/Orchard.Web/Modules/Orchard.Users/Drivers/UserDriver.cs rename : src/Orchard.Web/Modules/Orchard.Users/Models/UserHandler.cs => src/Orchard.Web/Modules/Orchard.Users/Handlers/UserHandler.cs
2010-03-03 23:31:42 -08:00
}