webdav portal upload func added
This commit is contained in:
parent
1da7c6c3b3
commit
a882072b02
23 changed files with 553 additions and 17 deletions
|
@ -0,0 +1,13 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
|
||||
namespace WebsitePanel.WebDav.Core.Extensions
|
||||
{
|
||||
static class UriExtensions
|
||||
{
|
||||
public static Uri Append(this Uri uri, params string[] paths)
|
||||
{
|
||||
return new Uri(paths.Aggregate(uri.AbsoluteUri, (current, path) => string.Format("{0}/{1}", current.TrimEnd('/'), path.TrimStart('/'))));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -110,6 +110,23 @@ namespace WebsitePanel.WebDav.Core
|
|||
webClient.UploadFile(Href, "PUT", filename);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Uploads content of a file specified by filename to the server
|
||||
/// </summary>
|
||||
/// <param name="data">Posted file data to be uploaded</param>
|
||||
public void Upload(byte[] data)
|
||||
{
|
||||
var credentials = (NetworkCredential)_credentials;
|
||||
string auth = "Basic " +
|
||||
Convert.ToBase64String(
|
||||
Encoding.Default.GetBytes(credentials.UserName + ":" + credentials.Password));
|
||||
var webClient = new WebClient();
|
||||
webClient.Credentials = credentials;
|
||||
webClient.Headers.Add("Authorization", auth);
|
||||
|
||||
webClient.UploadData(Href, "PUT", data);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Loads content of the resource from WebDAV server.
|
||||
/// </summary>
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Web;
|
||||
using WebsitePanel.WebDav.Core.Client;
|
||||
|
||||
namespace WebsitePanel.WebDav.Core.Interfaces.Managers
|
||||
|
@ -8,6 +9,7 @@ namespace WebsitePanel.WebDav.Core.Interfaces.Managers
|
|||
IEnumerable<IHierarchyItem> OpenFolder(string path);
|
||||
bool IsFile(string path);
|
||||
byte[] GetFileBytes(string path);
|
||||
void UploadFile(string path, HttpPostedFileBase file);
|
||||
IResource GetResource(string path);
|
||||
string GetFileUrl(string path);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
using WebsitePanel.WebDav.Core.Security.Authentication.Principals;
|
||||
using WebsitePanel.WebDav.Core.Security.Authorization.Enums;
|
||||
|
||||
namespace WebsitePanel.WebDav.Core.Interfaces.Security
|
||||
{
|
||||
public interface IWebDavAuthorizationService
|
||||
{
|
||||
bool HasAccess(WspPrincipal principal, string path);
|
||||
WebDavPermissions GetPermissions(WspPrincipal principal, string path);
|
||||
}
|
||||
}
|
|
@ -3,11 +3,15 @@ using System.Collections.Generic;
|
|||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Web;
|
||||
using System.Xml.Serialization;
|
||||
using log4net;
|
||||
using WebsitePanel.Providers.OS;
|
||||
using WebsitePanel.WebDav.Core.Client;
|
||||
using WebsitePanel.WebDav.Core.Config;
|
||||
using WebsitePanel.WebDav.Core.Exceptions;
|
||||
using WebsitePanel.WebDav.Core.Extensions;
|
||||
using WebsitePanel.WebDav.Core.Interfaces.Managers;
|
||||
using WebsitePanel.WebDav.Core.Security.Cryptography;
|
||||
using WebsitePanel.WebDav.Core.Wsp.Framework;
|
||||
|
@ -108,6 +112,24 @@ namespace WebsitePanel.WebDav.Core.Managers
|
|||
}
|
||||
}
|
||||
|
||||
public void UploadFile(string path, HttpPostedFileBase file)
|
||||
{
|
||||
var resource = new WebDavResource();
|
||||
|
||||
var fileUrl = new Uri(WebDavAppConfigManager.Instance.WebdavRoot)
|
||||
.Append(WspContext.User.OrganizationId)
|
||||
.Append(path)
|
||||
.Append(Path.GetFileName(file.FileName));
|
||||
|
||||
resource.SetHref(fileUrl);
|
||||
resource.SetCredentials(new NetworkCredential(WspContext.User.Login, _cryptography.Decrypt(WspContext.User.EncryptedPassword)));
|
||||
|
||||
file.InputStream.Seek(0, SeekOrigin.Begin);
|
||||
var bytes = ReadFully(file.InputStream);
|
||||
|
||||
resource.Upload(bytes);
|
||||
}
|
||||
|
||||
public IResource GetResource(string path)
|
||||
{
|
||||
try
|
||||
|
@ -184,6 +206,14 @@ namespace WebsitePanel.WebDav.Core.Managers
|
|||
}
|
||||
}
|
||||
|
||||
public void WriteTo(Stream sourceStream, Stream targetStream)
|
||||
{
|
||||
byte[] buffer = new byte[16 * 1024];
|
||||
int n;
|
||||
while ((n = sourceStream.Read(buffer, 0, buffer.Length)) != 0)
|
||||
targetStream.Write(buffer, 0, n);
|
||||
}
|
||||
|
||||
private string GetFileFolder(string path)
|
||||
{
|
||||
path = path.TrimEnd('/');
|
||||
|
|
|
@ -0,0 +1,13 @@
|
|||
using System;
|
||||
|
||||
namespace WebsitePanel.WebDav.Core.Security.Authorization.Enums
|
||||
{
|
||||
[Flags]
|
||||
public enum WebDavPermissions
|
||||
{
|
||||
Empty = 0,
|
||||
None = 1,
|
||||
Read = 2,
|
||||
Write = 4
|
||||
}
|
||||
}
|
|
@ -0,0 +1,69 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using WebsitePanel.WebDav.Core.Interfaces.Security;
|
||||
using WebsitePanel.WebDav.Core.Security.Authentication.Principals;
|
||||
using WebsitePanel.WebDav.Core.Security.Authorization.Enums;
|
||||
using WebsitePanel.WebDav.Core.Wsp.Framework;
|
||||
|
||||
namespace WebsitePanel.WebDav.Core.Security.Authorization
|
||||
{
|
||||
public class WebDavAuthorizationService : IWebDavAuthorizationService
|
||||
{
|
||||
public bool HasAccess(WspPrincipal principal, string path)
|
||||
{
|
||||
var permissions = GetPermissions(principal, path);
|
||||
|
||||
return permissions.HasFlag(WebDavPermissions.Read) || permissions.HasFlag(WebDavPermissions.Write);
|
||||
}
|
||||
|
||||
public WebDavPermissions GetPermissions(WspPrincipal principal, string path)
|
||||
{
|
||||
if (string.IsNullOrEmpty(path))
|
||||
{
|
||||
return WebDavPermissions.Read;
|
||||
}
|
||||
|
||||
var resultPermissions = WebDavPermissions.Empty;
|
||||
|
||||
var rootFolder = GetRootFolder(path);
|
||||
|
||||
var userGroups = WSP.Services.Organizations.GetSecurityGroupsByMember(principal.ItemId, principal.AccountId);
|
||||
|
||||
var rootFolders = WSP.Services.EnterpriseStorage.GetEnterpriseFolders(principal.ItemId);
|
||||
|
||||
var esRootFolder = rootFolders.FirstOrDefault(x => x.Name == rootFolder);
|
||||
|
||||
if (esRootFolder == null)
|
||||
{
|
||||
return WebDavPermissions.None;
|
||||
}
|
||||
|
||||
var permissions = WSP.Services.EnterpriseStorage.GetEnterpriseFolderPermissions(principal.ItemId, esRootFolder.Name);
|
||||
|
||||
foreach (var permission in permissions)
|
||||
{
|
||||
if ((!permission.IsGroup
|
||||
&& (permission.DisplayName == principal.UserName || permission.DisplayName == principal.DisplayName))
|
||||
|| (permission.IsGroup && userGroups.Any(x => x.DisplayName == permission.DisplayName)))
|
||||
{
|
||||
if (permission.Access.ToLowerInvariant().Contains("read"))
|
||||
{
|
||||
resultPermissions |= WebDavPermissions.Read;
|
||||
}
|
||||
|
||||
if (permission.Access.ToLowerInvariant().Contains("write"))
|
||||
{
|
||||
resultPermissions |= WebDavPermissions.Write;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return resultPermissions;
|
||||
}
|
||||
|
||||
private string GetRootFolder(string path)
|
||||
{
|
||||
return path.Split(new[]{'/'}, StringSplitOptions.RemoveEmptyEntries)[0];
|
||||
}
|
||||
}
|
||||
}
|
|
@ -123,10 +123,12 @@
|
|||
<Compile Include="Exceptions\UnauthorizedException.cs" />
|
||||
<Compile Include="Exceptions\WebDavException.cs" />
|
||||
<Compile Include="Exceptions\WebDavHttpException.cs" />
|
||||
<Compile Include="Extensions\UriExtensions.cs" />
|
||||
<Compile Include="IConnectionSettings.cs" />
|
||||
<Compile Include="IFolder.cs" />
|
||||
<Compile Include="IHierarchyItem.cs" />
|
||||
<Compile Include="IItemContent.cs" />
|
||||
<Compile Include="Interfaces\Security\IWebDavAuthorizationService.cs" />
|
||||
<Compile Include="Managers\AccessTokenManager.cs" />
|
||||
<Compile Include="Interfaces\Managers\IAccessTokenManager.cs" />
|
||||
<Compile Include="Interfaces\Managers\IWebDavManager.cs" />
|
||||
|
@ -145,6 +147,8 @@
|
|||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>HttpErrors.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Security\Authorization\Enums\WebDavPermissions.cs" />
|
||||
<Compile Include="Security\Authorization\WebDavAuthorizationService.cs" />
|
||||
<Compile Include="Security\Cryptography\CryptoUtils.cs" />
|
||||
<Compile Include="Security\Cryptography\ICryptography.cs" />
|
||||
<Compile Include="Security\Authentication\FormsAuthenticationService.cs" />
|
||||
|
|
|
@ -26,7 +26,8 @@ namespace WebsitePanel.WebDavPortal
|
|||
bundles.Add(new ScriptBundle("~/bundles/appScripts").Include(
|
||||
"~/Scripts/appScripts/recalculateResourseHeight.js",
|
||||
"~/Scripts/appScripts/uploadingData2.js",
|
||||
"~/Scripts/appScripts/authentication.js"));
|
||||
"~/Scripts/appScripts/authentication.js",
|
||||
"~/Scripts/appScripts/dialogs.js"));
|
||||
|
||||
bundles.Add(new ScriptBundle("~/bundles/authScripts").Include(
|
||||
"~/Scripts/appScripts/authentication.js"));
|
||||
|
|
|
@ -43,7 +43,13 @@ namespace WebsitePanel.WebDavPortal
|
|||
#endregion
|
||||
|
||||
routes.MapRoute(
|
||||
name: FileSystemRouteNames.OfficeOnlinePath,
|
||||
name: FileSystemRouteNames.UploadFile,
|
||||
url: "upload-file/{org}/{*pathPart}",
|
||||
defaults: new { controller = "FileSystem", action = "UploadFile" }
|
||||
);
|
||||
|
||||
routes.MapRoute(
|
||||
name: FileSystemRouteNames.ShowOfficeOnlinePath,
|
||||
url: "office365/{org}/{*pathPart}",
|
||||
defaults: new { controller = "FileSystem", action = "ShowOfficeDocument", pathPart = UrlParameter.Optional }
|
||||
);
|
||||
|
@ -55,7 +61,7 @@ namespace WebsitePanel.WebDavPortal
|
|||
);
|
||||
|
||||
routes.MapRoute(
|
||||
name: FileSystemRouteNames.FilePath,
|
||||
name: FileSystemRouteNames.ShowContentPath,
|
||||
url: "{org}/{*pathPart}",
|
||||
defaults: new { controller = "FileSystem", action = "ShowContent", pathPart = UrlParameter.Optional }
|
||||
);
|
||||
|
|
|
@ -29,7 +29,7 @@ namespace WebsitePanel.WebDavPortal.Controllers
|
|||
{
|
||||
if (WspContext.User != null && WspContext.User.Identity.IsAuthenticated)
|
||||
{
|
||||
return RedirectToRoute(FileSystemRouteNames.FilePath, new { org = WspContext.User.OrganizationId });
|
||||
return RedirectToRoute(FileSystemRouteNames.ShowContentPath, new { org = WspContext.User.OrganizationId });
|
||||
}
|
||||
|
||||
return View();
|
||||
|
@ -46,7 +46,7 @@ namespace WebsitePanel.WebDavPortal.Controllers
|
|||
{
|
||||
_authenticationService.CreateAuthenticationTicket(user);
|
||||
|
||||
return RedirectToRoute(FileSystemRouteNames.FilePath, new { org = WspContext.User.OrganizationId });
|
||||
return RedirectToRoute(FileSystemRouteNames.ShowContentPath, new { org = WspContext.User.OrganizationId });
|
||||
}
|
||||
|
||||
return View(new AccountModel { LdapError = "The user name or password is incorrect" });
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net.Mime;
|
||||
|
@ -30,13 +31,15 @@ namespace WebsitePanel.WebDavPortal.Controllers
|
|||
private readonly IWebDavManager _webdavManager;
|
||||
private readonly IAuthenticationService _authenticationService;
|
||||
private readonly IAccessTokenManager _tokenManager;
|
||||
private readonly IWebDavAuthorizationService _webDavAuthorizationService;
|
||||
|
||||
public FileSystemController(ICryptography cryptography, IWebDavManager webdavManager, IAuthenticationService authenticationService, IAccessTokenManager tokenManager)
|
||||
public FileSystemController(ICryptography cryptography, IWebDavManager webdavManager, IAuthenticationService authenticationService, IAccessTokenManager tokenManager, IWebDavAuthorizationService webDavAuthorizationService)
|
||||
{
|
||||
_cryptography = cryptography;
|
||||
_webdavManager = webdavManager;
|
||||
_authenticationService = authenticationService;
|
||||
_tokenManager = tokenManager;
|
||||
_webDavAuthorizationService = webDavAuthorizationService;
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
|
@ -59,7 +62,9 @@ namespace WebsitePanel.WebDavPortal.Controllers
|
|||
{
|
||||
IEnumerable<IHierarchyItem> children = _webdavManager.OpenFolder(pathPart);
|
||||
|
||||
var model = new ModelForWebDav { Items = children.Take(WebDavAppConfigManager.Instance.ElementsRendering.DefaultCount), UrlSuffix = pathPart };
|
||||
var permissions = _webDavAuthorizationService.GetPermissions(WspContext.User, pathPart);
|
||||
|
||||
var model = new ModelForWebDav { Items = children.Take(WebDavAppConfigManager.Instance.ElementsRendering.DefaultCount), UrlSuffix = pathPart, Permissions = permissions};
|
||||
|
||||
return View(model);
|
||||
}
|
||||
|
@ -94,5 +99,23 @@ namespace WebsitePanel.WebDavPortal.Controllers
|
|||
|
||||
return PartialView("_ResourseCollectionPartial", result);
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public ActionResult UploadFile(string org, string pathPart)
|
||||
{
|
||||
foreach (string fileName in Request.Files)
|
||||
{
|
||||
var file = Request.Files[fileName];
|
||||
|
||||
if (file == null || file.ContentLength == 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
_webdavManager.UploadFile(pathPart, file);
|
||||
}
|
||||
|
||||
return RedirectToRoute(FileSystemRouteNames.ShowContentPath);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,19 +1,14 @@
|
|||
using Ninject;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web;
|
||||
using System.Web.SessionState;
|
||||
using WebsitePanel.WebDav.Core.Interfaces.Managers;
|
||||
using WebsitePanel.WebDav.Core.Interfaces.Owa;
|
||||
using WebsitePanel.WebDav.Core.Interfaces.Security;
|
||||
using WebsitePanel.WebDav.Core.Managers;
|
||||
using WebsitePanel.WebDav.Core.Owa;
|
||||
using WebsitePanel.WebDav.Core.Security;
|
||||
using WebsitePanel.WebDav.Core.Security.Authentication;
|
||||
using WebsitePanel.WebDav.Core.Security.Authorization;
|
||||
using WebsitePanel.WebDav.Core.Security.Cryptography;
|
||||
using WebsitePanel.WebDavPortal.DependencyInjection.Providers;
|
||||
using WebsitePanel.WebDavPortal.Models;
|
||||
|
||||
namespace WebsitePanel.WebDavPortal.DependencyInjection
|
||||
{
|
||||
|
@ -27,6 +22,7 @@ namespace WebsitePanel.WebDavPortal.DependencyInjection
|
|||
kernel.Bind<IWebDavManager>().To<WebDavManager>();
|
||||
kernel.Bind<IAccessTokenManager>().To<AccessTokenManager>();
|
||||
kernel.Bind<IWopiServer>().To<WopiServer>();
|
||||
kernel.Bind<IWebDavAuthorizationService>().To<WebDavAuthorizationService>();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
using System.Collections.Generic;
|
||||
using WebsitePanel.WebDav.Core.Client;
|
||||
using WebsitePanel.WebDav.Core.Security.Authorization.Enums;
|
||||
|
||||
namespace WebsitePanel.WebDavPortal.Models
|
||||
{
|
||||
|
@ -8,5 +9,6 @@ namespace WebsitePanel.WebDavPortal.Models
|
|||
public IEnumerable<IHierarchyItem> Items { get; set; }
|
||||
public string UrlSuffix { get; set; }
|
||||
public string Error { get; set; }
|
||||
public WebDavPermissions Permissions { get; set; }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
var processDialog;
|
||||
processDialog = processDialog || (function () {
|
||||
var processDialogDiv = $('#processDialog');
|
||||
return {
|
||||
showPleaseWait: function () {
|
||||
$('#processDialog').modal();
|
||||
},
|
||||
hidePleaseWait: function () {
|
||||
$('#processDialog').modal('hide');
|
||||
},
|
||||
|
||||
};
|
||||
})();
|
||||
|
||||
|
||||
$(document).ready(function() {
|
||||
$('.processing-dialog').click(function () {
|
||||
processDialog.showPleaseWait();
|
||||
});
|
||||
});
|
117
WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Resources.Designer.cs
generated
Normal file
117
WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Resources.Designer.cs
generated
Normal file
|
@ -0,0 +1,117 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.33440
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace WebsitePanel.WebDavPortal.UI {
|
||||
using System;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// A strongly-typed resource class, for looking up localized strings, etc.
|
||||
/// </summary>
|
||||
// This class was auto-generated by the StronglyTypedResourceBuilder
|
||||
// class via a tool like ResGen or Visual Studio.
|
||||
// To add or remove a member, edit your .ResX file then rerun ResGen
|
||||
// with the /str option, or rebuild your VS project.
|
||||
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
|
||||
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||
public class Resources {
|
||||
|
||||
private static global::System.Resources.ResourceManager resourceMan;
|
||||
|
||||
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||
|
||||
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal Resources() {
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the cached ResourceManager instance used by this class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
public static global::System.Resources.ResourceManager ResourceManager {
|
||||
get {
|
||||
if (object.ReferenceEquals(resourceMan, null)) {
|
||||
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("WebsitePanel.WebDavPortal.UI.Resources", typeof(Resources).Assembly);
|
||||
resourceMan = temp;
|
||||
}
|
||||
return resourceMan;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Overrides the current thread's CurrentUICulture property for all
|
||||
/// resource lookups using this strongly typed resource class.
|
||||
/// </summary>
|
||||
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||
public static global::System.Globalization.CultureInfo Culture {
|
||||
get {
|
||||
return resourceCulture;
|
||||
}
|
||||
set {
|
||||
resourceCulture = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Actions.
|
||||
/// </summary>
|
||||
public static string Actions {
|
||||
get {
|
||||
return ResourceManager.GetString("Actions", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Close.
|
||||
/// </summary>
|
||||
public static string Close {
|
||||
get {
|
||||
return ResourceManager.GetString("Close", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to File Upload.
|
||||
/// </summary>
|
||||
public static string FileUpload {
|
||||
get {
|
||||
return ResourceManager.GetString("FileUpload", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Processing.
|
||||
/// </summary>
|
||||
public static string Processing {
|
||||
get {
|
||||
return ResourceManager.GetString("Processing", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Processing....
|
||||
/// </summary>
|
||||
public static string ProcessingWithDots {
|
||||
get {
|
||||
return ResourceManager.GetString("ProcessingWithDots", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Looks up a localized string similar to Upload.
|
||||
/// </summary>
|
||||
public static string Upload {
|
||||
get {
|
||||
return ResourceManager.GetString("Upload", resourceCulture);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
138
WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Resources.resx
Normal file
138
WebsitePanel/Sources/WebsitePanel.WebDavPortal/UI/Resources.resx
Normal file
|
@ -0,0 +1,138 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<data name="Actions" xml:space="preserve">
|
||||
<value>Actions</value>
|
||||
</data>
|
||||
<data name="Close" xml:space="preserve">
|
||||
<value>Close</value>
|
||||
</data>
|
||||
<data name="FileUpload" xml:space="preserve">
|
||||
<value>File Upload</value>
|
||||
</data>
|
||||
<data name="Processing" xml:space="preserve">
|
||||
<value>Processing</value>
|
||||
</data>
|
||||
<data name="ProcessingWithDots" xml:space="preserve">
|
||||
<value>Processing...</value>
|
||||
</data>
|
||||
<data name="Upload" xml:space="preserve">
|
||||
<value>Upload</value>
|
||||
</data>
|
||||
</root>
|
|
@ -7,8 +7,10 @@ namespace WebsitePanel.WebDavPortal.UI.Routes
|
|||
{
|
||||
public class FileSystemRouteNames
|
||||
{
|
||||
public const string FilePath = "FilePathRoute";
|
||||
public const string OfficeOnlinePath = "OfficeOnline";
|
||||
public const string ShowContentPath = "ShowContentRoute";
|
||||
public const string ShowOfficeOnlinePath = "ShowOfficeOnlineRoute";
|
||||
public const string ShowAdditionalContent = "ShowAdditionalContentRoute";
|
||||
|
||||
public const string UploadFile = "UplaodFIleRoute";
|
||||
}
|
||||
}
|
|
@ -3,6 +3,9 @@
|
|||
@using Ninject
|
||||
@using WebsitePanel.WebDav.Core.Config
|
||||
@using WebsitePanel.WebDav.Core.Interfaces.Managers
|
||||
@using WebsitePanel.WebDav.Core.Security.Authorization.Enums
|
||||
@using WebsitePanel.WebDavPortal.UI
|
||||
@using WebsitePanel.WebDavPortal.UI.Routes
|
||||
|
||||
@model WebsitePanel.WebDavPortal.Models.ModelForWebDav
|
||||
@{
|
||||
|
@ -34,6 +37,21 @@ else
|
|||
<span class="glyphicon glyphicon-chevron-right" style="top: 2px;"></span>
|
||||
<a href="@string.Concat("/" + header + "/", string.Join("/", elements.Take(i + 1)))" class="btn btn-primary btn-sm active" role="button">@elements[i]</a>
|
||||
}
|
||||
|
||||
if (Model.Permissions.HasFlag(WebDavPermissions.Write))
|
||||
{
|
||||
@*<a id="upload-button" class="btn btn-success btn-sm active" data-toggle="modal" data-target="#file-upload" role="button">@Resources.FileUpload</a>*@
|
||||
|
||||
<div class="dropdown navbar-right">
|
||||
<button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-expanded="true">
|
||||
@Resources.Actions
|
||||
<span class="caret"></span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
|
||||
<li role="presentation"><a id="upload-button" data-toggle="modal" data-target="#file-upload" role="menuitem" tabindex="-1" href="#">@Resources.FileUpload</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
</div>
|
||||
<br />
|
||||
|
@ -49,3 +67,30 @@ else
|
|||
</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
|
||||
@section popups
|
||||
{
|
||||
<div id="file-upload" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="modal-file-upload-title" aria-hidden="true" style="display: none;">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||
<h4 class="modal-title" id="modal-file-upload-title">@Resources.FileUpload</h4>
|
||||
</div>
|
||||
@using (Html.BeginRouteForm(FileSystemRouteNames.UploadFile, FormMethod.Post, new {enctype = "multipart/form-data"}))
|
||||
{
|
||||
<div class="modal-body">
|
||||
<input type="file" name="file" />
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-default" data-dismiss="modal">@Resources.Close</button>
|
||||
<button type="submit" class="btn btn-primary processing-dialog">@Resources.Upload</button>
|
||||
</div>
|
||||
}
|
||||
</div><!-- /.modal-content -->
|
||||
</div><!-- /.modal-dialog -->
|
||||
</div>
|
||||
|
||||
@Html.Partial("_ProcessDialog", null)
|
||||
}
|
|
@ -17,7 +17,7 @@
|
|||
case FileOpenerType.OfficeOnline:
|
||||
isTargetBlank = true;
|
||||
var pathPart = Model.Href.AbsolutePath.Replace("/" + WspContext.User.OrganizationId, "");
|
||||
href = string.Concat(Url.RouteUrl(FileSystemRouteNames.OfficeOnlinePath, new { org = WspContext.User.OrganizationId, pathPart = "" }), pathPart);
|
||||
href = string.Concat(Url.RouteUrl(FileSystemRouteNames.ShowOfficeOnlinePath, new { org = WspContext.User.OrganizationId, pathPart = "" }), pathPart);
|
||||
break;
|
||||
default:
|
||||
isTargetBlank = false;
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<span class="icon-bar"></span>
|
||||
<span class="icon-bar"></span>
|
||||
</button>
|
||||
@Html.RouteLink(WebDavAppConfigManager.Instance.ApplicationName, FileSystemRouteNames.FilePath, new { pathPart = string.Empty }, new { @class = "navbar-brand" })
|
||||
@Html.RouteLink(WebDavAppConfigManager.Instance.ApplicationName, FileSystemRouteNames.ShowContentPath, new { pathPart = string.Empty }, new { @class = "navbar-brand" })
|
||||
</div>
|
||||
<div class="navbar-collapse collapse">
|
||||
@{
|
||||
|
@ -40,6 +40,8 @@
|
|||
@RenderBody()
|
||||
</div>
|
||||
|
||||
@RenderSection("popups", required: false)
|
||||
|
||||
@Scripts.Render("~/bundles/jquery")
|
||||
@Scripts.Render("~/bundles/bootstrap")
|
||||
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
@using WebsitePanel.WebDavPortal.UI
|
||||
|
||||
<div id="processDialog" class="modal fade" tabindex="-1" role="dialog" data-backdrop="static" data-keyboard="false" aria-hidden="true" style="display: none;">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-body">
|
||||
<h4 class="modal-title">@Resources.ProcessingWithDots</h4>
|
||||
</div>
|
||||
</div><!-- /.modal-content -->
|
||||
</div><!-- /.modal-dialog -->
|
||||
</div>
|
|
@ -164,6 +164,11 @@
|
|||
<Compile Include="Models\ModelForWebDav.cs" />
|
||||
<Compile Include="Models\OfficeOnlineModel.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="UI\Resources.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
<DependentUpon>Resources.resx</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="UI\Routes\AccountRouteNames.cs" />
|
||||
<Compile Include="UI\Routes\FileSystemRouteNames.cs" />
|
||||
<Compile Include="UI\Routes\OwaRouteNames.cs" />
|
||||
|
@ -219,6 +224,7 @@
|
|||
</Content>
|
||||
<None Include="Scripts\jquery-2.1.1.intellisense.js" />
|
||||
<Content Include="Scripts\appScripts\authentication.js" />
|
||||
<Content Include="Scripts\appScripts\dialogs.js" />
|
||||
<Content Include="Scripts\appScripts\recalculateResourseHeight.js" />
|
||||
<Content Include="Scripts\appScripts\uploadingData2.js" />
|
||||
<Content Include="Scripts\bootstrap.js" />
|
||||
|
@ -258,6 +264,7 @@
|
|||
<Content Include="Views\FileSystem\ShowOfficeDocument.cshtml" />
|
||||
<Content Include="Views\FileSystem\_ResourseCollectionPartial.cshtml" />
|
||||
<Content Include="Views\FileSystem\_ResoursePartial.cshtml" />
|
||||
<Content Include="Views\Shared\ProcessDialog.cshtml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Views\Owa\" />
|
||||
|
@ -272,6 +279,13 @@
|
|||
<Name>WebsitePanel.WebDav.Core</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="UI\Resources.resx">
|
||||
<Generator>PublicResXFileCodeGenerator</Generator>
|
||||
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||
<SubType>Designer</SubType>
|
||||
</EmbeddedResource>
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
|
||||
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue