Implemented authentification for Package publishing commands

--HG--
branch : dev
This commit is contained in:
Sebastien Ros
2010-07-23 17:44:56 -07:00
parent bdcaca8d63
commit 89495ef6cf
8 changed files with 59 additions and 11 deletions

View File

@@ -10,6 +10,12 @@ namespace Orchard.Packaging.Commands {
public class GalleryCommands : DefaultOrchardCommandHandler {
private readonly IPackageManager _packageManager;
[OrchardSwitch]
public string User { get; set; }
[OrchardSwitch]
public string Password { get; set; }
public GalleryCommands(IPackageManager packageManager) {
_packageManager = packageManager;
}
@@ -36,13 +42,24 @@ namespace Orchard.Packaging.Commands {
}
#endif
[CommandHelp("gallery submit module <moduleName> <feedUrl>\r\n\t" + "Package a module into a distributable and push it to a feed server.")]
[CommandHelp("gallery submit module <moduleName> <feedUrl> /User:<user> /Password:<password>\r\n\t" + "Package a module into a distributable and push it to a feed server.")]
[CommandName("gallery submit module")]
[OrchardSwitches("User,Password")]
public void SubmitModule(string moduleName, string feedUrl) {
var packageData = _packageManager.Harvest(moduleName);
if ( String.IsNullOrWhiteSpace(User) ) {
Context.Output.WriteLine("Missing or incorrect User");
return;
}
if ( String.IsNullOrWhiteSpace(Password) ) {
Context.Output.WriteLine("Missing or incorrect Password");
return;
}
try {
_packageManager.Push(packageData, feedUrl);
_packageManager.Push(packageData, feedUrl, User, Password);
Context.Output.WriteLine("Success");
}
catch (WebException webException) {
@@ -51,16 +68,27 @@ namespace Orchard.Packaging.Commands {
}
}
[CommandHelp("gallery submit package <filePath> <feedUrl>\r\n\t" + "Push a packaged module to a feed server.")]
[CommandHelp("gallery submit package <filePath> <feedUrl> /User:<user> /Password:<password>\r\n\t" + "Push a packaged module to a feed server.")]
[CommandName("gallery submit package")]
[OrchardSwitches("User,Password")]
public void SubmitPackage(string filePath, string feedUrl) {
using (var stream = File.Open(filePath, FileMode.Open, FileAccess.Read)) {
var packageData = new PackageData {
PackageStream = stream
};
if ( String.IsNullOrWhiteSpace(User) ) {
Context.Output.WriteLine("Missing or incorrect User");
return;
}
if ( String.IsNullOrWhiteSpace(Password) ) {
Context.Output.WriteLine("Missing or incorrect Password");
return;
}
try {
_packageManager.Push(packageData, feedUrl);
_packageManager.Push(packageData, feedUrl, User, Password);
Context.Output.WriteLine("Success");
}
catch (WebException webException) {

View File

@@ -132,7 +132,7 @@ namespace Orchard.Packaging.Controllers {
return View("Harvest", model);
}
_packageManager.Push(packageData, model.FeedUrl);
_packageManager.Push(packageData, model.FeedUrl, model.User, model.Password);
_notifier.Information(T("Harvested {0} and published onto {1}", model.ExtensionName, model.FeedUrl));
Update();

View File

@@ -5,7 +5,7 @@ namespace Orchard.Packaging.Services {
PackageData Harvest(string extensionName);
PackageData Download(string feedItemId);
void Push(PackageData packageData, string feedUrl);
void Push(PackageData packageData, string feedUrl, string login, string password);
PackageInfo Install(Stream packageStream);
}
}

View File

@@ -1,7 +1,9 @@
using System;
using System.IO;
using System.IO.Packaging;
using System.Linq;
using System.Net;
using System.Text;
using Orchard.Environment.Extensions;
using Orchard.Environment.Extensions.Models;
@@ -38,11 +40,13 @@ namespace Orchard.Packaging.Services {
};
}
public void Push(PackageData packageData, string feedUrl) {
public void Push(PackageData packageData, string feedUrl, string user, string password) {
WebRequest request = WebRequest.Create(feedUrl);
request.Method = "POST";
request.ContentType = "application/x-package";
using (Stream requestStream = request.GetRequestStream()) {
request.Headers.Add("user", Convert.ToBase64String(Encoding.UTF8.GetBytes(user)));
request.Headers.Add("password", Convert.ToBase64String(Encoding.UTF8.GetBytes(password)));
using ( Stream requestStream = request.GetRequestStream() ) {
packageData.PackageStream.Seek(0, SeekOrigin.Begin);
packageData.PackageStream.CopyTo(requestStream);
}

View File

@@ -12,5 +12,7 @@ namespace Orchard.Packaging.ViewModels {
public string ExtensionName { get; set; }
public string FeedUrl { get; set; }
public string User { get; set; }
public string Password { get; set; }
}
}

View File

@@ -3,11 +3,11 @@
<%: Html.TitleForPage(T("Browse Gallery").ToString())%></h1>
<div class="manage">
<%:Html.ActionLink("Update List", "Update", new object{}, new { @class = "button primaryAction" }) %>
<%:Html.ActionLink("Refresh", "Update", new object{}, new { @class = "button primaryAction" }) %>
</div>
<% using ( Html.BeginFormAntiForgeryPost(Url.Action("Modules", "Gallery")) ) {%>
<fieldset class="bulk-actions">
<label for="filterResults" class="bulk-filter"><%:T("Show only of feed")%></label>
<label for="filterResults" class="bulk-filter"><%:T("Feed:")%></label>
<select id="sourceId" name="sourceId">
<%:Html.SelectOption("", Model.SelectedSource == null, T("Any (show all feeds)").ToString())%>
<%

View File

@@ -3,7 +3,7 @@
<%: Html.TitleForPage(T("Gallery Feeds").ToString())%></h1>
<div class="manage">
<%:Html.ActionLink(T("Add a Feed").Text, "AddSource", new { }, new { @class = "button primaryAction" }) %>
<%:Html.ActionLink(T("Add Feed").Text, "AddSource", new { }, new { @class = "button primaryAction" }) %>
</div>
<fieldset>

View File

@@ -2,11 +2,15 @@
using System.IO;
using System.IO.Packaging;
using System.Linq;
using System.Security.Authentication;
using System.Security.Policy;
using System.Text;
using System.Web.Mvc;
using System.Web.Routing;
using System.ServiceModel.Syndication;
using System.Web.Security;
using PackageIndexReferenceImplementation.Controllers.Artifacts;
using PackageIndexReferenceImplementation.Models;
using PackageIndexReferenceImplementation.Services;
namespace PackageIndexReferenceImplementation.Controllers {
@@ -15,9 +19,12 @@ namespace PackageIndexReferenceImplementation.Controllers {
private readonly FeedStorage _feedStorage;
private readonly MediaStorage _mediaStorage;
public IMembershipService MembershipService { get; set; }
public AtomController() {
_feedStorage = new FeedStorage();
_mediaStorage = new MediaStorage();
if ( MembershipService == null ) { MembershipService = new AccountMembershipService(); }
}
public ActionResult Index() {
@@ -34,6 +41,13 @@ namespace PackageIndexReferenceImplementation.Controllers {
var hostHeader = HttpContext.Request.Headers["Host"];
var slugHeader = HttpContext.Request.Headers["Slug"];
var user = Encoding.UTF8.GetString(Convert.FromBase64String(HttpContext.Request.Headers["User"]));
var password = Encoding.UTF8.GetString(Convert.FromBase64String(HttpContext.Request.Headers["Password"]));
if ( !MembershipService.ValidateUser(user, password) ) {
throw new AuthenticationException("This credentials are not valid fo this action.");
}
var utcNowDateString = DateTimeOffset.UtcNow.ToString("yyyy-MM-dd");
var package = Package.Open(Request.InputStream, FileMode.Open, FileAccess.Read);