* mdd_help.htm:

* mdd_styles.css:
* LocalizedText.resx:
* all.css:
* jquery-ui-1.11.4.js:
* tabs.css:
* menu.css:
* core.css:
* base.css:
* LocalizedText.fr.resx:
* theme.css:
* slider.css:
* button.css:
* dialog.css:
* spinner.css:
* tooltip.css:
* jquery-ui-1.11.4.min.js:
* sortable.css:
* LocalizedText.Designer.cs:
* resizable.css:
* accordion.css:
* draggable.css:
* selectmenu.css:
* selectable.css:
* datepicker.css:
* progressbar.css:
* LocalizedText.fr.Designer.cs:
* autocomplete.css:
* ui-icons_888888_256x240.png:
* ui-icons_cd0a0a_256x240.png:
* ui-icons_454545_256x240.png:
* ui-icons_2e83ff_256x240.png:
* ui-icons_222222_256x240.png:
* ui-bg_flat_0_aaaaaa_40x100.png:
* ui-bg_glass_95_fef1ec_1x400.png:
* ui-bg_flat_75_ffffff_40x100.png:
* ui-bg_glass_55_fbf9ee_1x400.png:
* ui-bg_glass_65_ffffff_1x400.png:
* ui-bg_glass_75_dadada_1x400.png:
* ui-bg_glass_75_e6e6e6_1x400.png:
* ui-bg_highlight-soft_75_cccccc_1x100.png:

* BlogsController.cs: implements the access control on file upload to
  blog entries

* style.css: nicer appmenu

* BlogsController.cs: Enables the input validation at posting blog
  entries

* MarkdownHelper.cs: enables ExtraMode transformation parameter

* App.master: Error and message html divisions must exist in the DOM
  to display Ajax messages and errors

* yavsc.js:
* yavsc.circles.js: refactoring

* Circles.aspx: removes a DOM element that already exists in the
  mastyer page : the message box

* Edit.aspx: submits files for import as Markdown text

* Web.config: Disables the local trace

* Web.csproj: jQuery.UI addition

* packages.config: adds a ref to jQuery.UI Combined
This commit is contained in:
Paul Schneider 2015-09-16 01:07:04 +02:00
commit 9eff4b0749
55 changed files with 18399 additions and 90 deletions

View file

@ -11,6 +11,8 @@ using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Diagnostics;
using Yavsc.Formatters;
using Yavsc.Model;
namespace Yavsc.ApiControllers
{
@ -82,37 +84,33 @@ namespace Yavsc.ApiControllers
/// Posts the file.
/// </summary>
/// <returns>The file.</returns>
[Authorize]
public async Task<HttpResponseMessage> PostFile(long postid) {
[Authorize,HttpPost]
public async Task<HttpResponseMessage> PostFile(long id) {
if (!(Request.Content.Headers.ContentType.MediaType=="multipart/form-data"))
{
throw new HttpRequestException ("not a multipart/form-data request");
}
string root = HttpContext.Current.Server.MapPath("~/bfiles/"+postid);
BlogEntry be = BlogManager.GetPost (postid);
BlogEntry be = BlogManager.GetPost (id);
if (be.UserName != Membership.GetUser ().UserName)
throw new AuthorizationDenied ("b"+postid);
throw new AuthorizationDenied ("b"+id);
string root = HttpContext.Current.Server.MapPath("~/bfiles/"+id);
DirectoryInfo di = new DirectoryInfo (root);
if (!di.Exists) di.Create ();
var provider = new MultipartFormDataStreamProvider(root);
try
{
// Read the form data.
foreach (var content in await Request.Content.ReadAsMultipartAsync(provider)) {
Trace.WriteLine("Server file path: " + provider.GetLocalFileName(
content.Headers));
}
// This illustrates how to get the file names.
await Request.Content.ReadAsMultipartAsync(provider) ;
var invalidChars = Path.GetInvalidFileNameChars();
foreach (string fkey in provider.BodyPartFileNames.Keys)
{
Trace.WriteLine(provider.BodyPartFileNames[fkey]);
string filename = provider.BodyPartFileNames[fkey];
Trace.WriteLine(filename);
string nicename=fkey;
if (fkey.StartsWith("\"") && fkey.EndsWith("\"") && fkey.Length > 2)
nicename = fkey.Substring(1,fkey.Length-2);
var filtered = new string (nicename.Where( x=> !invalidChars.Contains(x)).ToArray());
File.Move(Path.Combine(root,filename),
Path.Combine(root,filtered));
}
return Request.CreateResponse(HttpStatusCode.OK);
@ -122,7 +120,79 @@ namespace Yavsc.ApiControllers
return Request.CreateResponse(HttpStatusCode.InternalServerError, e);
}
}
/// <summary>
/// Import the specified id.
/// </summary>
/// <param name="id">Identifier.</param>
public async Task<HttpResponseMessage> Import(long id) {
if (!(Request.Content.Headers.ContentType.MediaType=="multipart/form-data"))
throw new HttpRequestException ("not a multipart/form-data request");
BlogEntry be = BlogManager.GetPost (id);
if (be.UserName != Membership.GetUser ().UserName)
throw new AuthorizationDenied ("b"+id);
string root = HttpContext.Current.Server.MapPath("~/bfiles/"+id);
DirectoryInfo di = new DirectoryInfo (root);
if (!di.Exists) di.Create ();
var provider = new MultipartFormDataStreamProvider(root);
try
{
// Read the form data.
await Request.Content.ReadAsMultipartAsync(provider) ;
var invalidChars = Path.GetInvalidFileNameChars();
List<string> bodies = new List<string>();
foreach (string fkey in provider.BodyPartFileNames.Keys)
{
string filename = provider.BodyPartFileNames[fkey];
string nicename=fkey;
if (fkey.StartsWith("\"") && fkey.EndsWith("\"") && fkey.Length > 2)
nicename = fkey.Substring(1,fkey.Length-2);
var filtered = new string (nicename.Where( x=> !invalidChars.Contains(x)).ToArray());
FileInfo fi = new FileInfo(filtered);
FileInfo fo = new FileInfo(filtered+".md");
FileInfo fp = new FileInfo (Path.Combine(root,filename));
if (fi.Exists) fi.Delete();
fp.MoveTo(fi.FullName);
using (Process p = new Process ()) {
p.StartInfo.WorkingDirectory = root;
p.StartInfo = new ProcessStartInfo ();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = "/usr/bin/pandoc";
p.StartInfo.Arguments =
string.Format (" -o {0} -t markdown {1}",
fo.FullName,
fi.FullName);
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;
p.Start ();
p.WaitForExit ();
if (p.ExitCode != 0) {
return Request.CreateResponse (HttpStatusCode.InternalServerError,
"# Import failed with exit code: " + p.ExitCode + "---\n"
+ LocalizedText.ImportException + "---\n"
+ p.StandardError.ReadToEnd() + "---\n"
+ p.StandardOutput.ReadToEnd()
);
}
}
bodies.Add(fo.OpenText().ReadToEnd());
fi.Delete();
fo.Delete();
}
return Request.CreateResponse(HttpStatusCode.OK,string.Join("---\n",bodies),new SimpleFormatter("text/plain"));
}
catch (System.Exception e)
{
return Request.CreateResponse(HttpStatusCode.InternalServerError, e);
}
}
}
}