Merge branch 'release/v0.1.8' of github.com:ONLYOFFICE/AppServer into release/v0.1.8

This commit is contained in:
Vladislav Makhov 2021-04-27 15:52:31 +03:00
commit decb2857e6
11 changed files with 130 additions and 117 deletions

View File

@ -28,6 +28,7 @@ using System;
using System.Collections.Generic;
using System.Threading;
using ASC.Common;
using ASC.Common.Caching;
using ASC.Common.Utils;
using ASC.Core;
@ -161,4 +162,17 @@ namespace ASC.FederatedLogin.LoginProviders
public abstract LoginProfile GetLoginProfile(string accessToken);
}
public class BaseLoginProviderExtension
{
public static void Register(DIHelper services)
{
services.TryAdd<BoxLoginProvider>();
services.TryAdd<DropboxLoginProvider>();
services.TryAdd<OneDriveLoginProvider>();
services.TryAdd<DocuSignLoginProvider>();
services.TryAdd<GoogleLoginProvider>();
services.TryAdd<WordpressLoginProvider>();
}
}
}

View File

@ -236,7 +236,7 @@ export function getConsumersList() {
export function getAuthProviders() {
return request({
method: "get",
url: `/settings/authproviders`,
url: `/people/thirdparty/providers`,
});
}

View File

@ -15,6 +15,7 @@ const StyledLabel = styled.label`
.checkbox {
margin-right: 12px;
overflow: visible;
}
/* ${(props) =>

View File

@ -81,6 +81,7 @@ const PureTreeSettings = ({
history,
setIsLoading,
t,
isVisitor,
}) => {
const { setting } = match.params;
@ -168,7 +169,7 @@ const PureTreeSettings = ({
title={t("TreeSettingsAdminSettings")}
/>
) : null}
{enableThirdParty ? (
{enableThirdParty && !isVisitor ? (
<TreeNode
selectable={true}
className="settings-node"
@ -226,6 +227,7 @@ export default inject(
return {
isAdmin: auth.isAdmin,
isVisitor: auth.userStore.user.isVisitor,
isLoading,
selectedTreeNode,
enableThirdParty,

View File

@ -85,6 +85,7 @@ class ArticleBodyContent extends React.Component {
onTreeDrop,
selectedTreeNode,
enableThirdParty,
isVisitor,
} = this.props;
return isEmpty(treeFolders) ? (
@ -99,7 +100,7 @@ class ArticleBodyContent extends React.Component {
onTreeDrop={onTreeDrop}
/>
<TreeSettings />
{enableThirdParty && <ThirdPartyList />}
{enableThirdParty && !isVisitor && <ThirdPartyList />}
</>
);
}
@ -107,6 +108,7 @@ class ArticleBodyContent extends React.Component {
export default inject(
({
auth,
filesStore,
treeFoldersStore,
selectedFolderStore,
@ -129,6 +131,7 @@ export default inject(
selectedTreeNode,
filter,
enableThirdParty: settingsStore.enableThirdParty,
isVisitor: auth.userStore.user.isVisitor,
setIsLoading,
fetchFiles,

View File

@ -37,7 +37,7 @@ using Microsoft.Extensions.Configuration;
namespace ASC.Web.Files.Helpers
{
[Scope(Additional = typeof(ThirdpartyConfigurationExtension))]
[Scope(Additional = typeof(BaseLoginProviderExtension))]
public class ThirdpartyConfiguration
{
private IConfiguration Configuration { get; }
@ -201,16 +201,4 @@ namespace ASC.Web.Files.Helpers
return result;
}
}
public class ThirdpartyConfigurationExtension
{
public static void Register(DIHelper services)
{
services.TryAdd<BoxLoginProvider>();
services.TryAdd<DropboxLoginProvider>();
services.TryAdd<OneDriveLoginProvider>();
services.TryAdd<DocuSignLoginProvider>();
services.TryAdd<GoogleLoginProvider>();
}
}
}

View File

@ -10,6 +10,7 @@ using System.Net.Mail;
using System.Security;
using System.ServiceModel.Security;
using System.Threading;
using System.Web;
using ASC.Api.Core;
using ASC.Common;
@ -22,6 +23,7 @@ using ASC.Core.Tenants;
using ASC.Core.Users;
using ASC.Data.Reassigns;
using ASC.FederatedLogin;
using ASC.FederatedLogin.LoginProviders;
using ASC.FederatedLogin.Profile;
using ASC.MessagingSystem;
using ASC.People;
@ -31,6 +33,7 @@ using ASC.Security.Cryptography;
using ASC.Web.Api.Models;
using ASC.Web.Api.Routing;
using ASC.Web.Core;
using ASC.Web.Core.Mobile;
using ASC.Web.Core.PublicResources;
using ASC.Web.Core.Users;
using ASC.Web.Studio.Core;
@ -48,7 +51,7 @@ using SecurityContext = ASC.Core.SecurityContext;
namespace ASC.Employee.Core.Controllers
{
[Scope]
[Scope(Additional = typeof(BaseLoginProviderExtension))]
[DefaultRoute]
[ApiController]
public class PeopleController : ControllerBase
@ -88,7 +91,9 @@ namespace ASC.Employee.Core.Controllers
private PasswordHasher PasswordHasher { get; }
private UserHelpTourHelper UserHelpTourHelper { get; }
private PersonalSettingsHelper PersonalSettingsHelper { get; }
public CommonLinkUtility CommonLinkUtility { get; }
private CommonLinkUtility CommonLinkUtility { get; }
private MobileDetector MobileDetector { get; }
private ProviderManager ProviderManager { get; }
private ILog Log { get; }
public PeopleController(
@ -127,7 +132,10 @@ namespace ASC.Employee.Core.Controllers
PasswordHasher passwordHasher,
UserHelpTourHelper userHelpTourHelper,
PersonalSettingsHelper personalSettingsHelper,
CommonLinkUtility commonLinkUtility)
CommonLinkUtility commonLinkUtility,
MobileDetector mobileDetector,
ProviderManager providerManager
)
{
Log = option.Get("ASC.Api");
Log.Debug("Test");
@ -166,6 +174,8 @@ namespace ASC.Employee.Core.Controllers
UserHelpTourHelper = userHelpTourHelper;
PersonalSettingsHelper = personalSettingsHelper;
CommonLinkUtility = commonLinkUtility;
MobileDetector = mobileDetector;
ProviderManager = providerManager;
}
[Read("info")]
@ -1486,6 +1496,50 @@ namespace ASC.Employee.Core.Controllers
return string.Format(Resource.SuccessfullySentNotificationDeleteUserInfoMessage, "<b>" + user.Email + "</b>");
}
[AllowAnonymous]
[Read("thirdparty/providers")]
public ICollection<AccountInfo> GetAuthProviders(bool inviteView, bool settingsView, string clientCallback, string fromOnly)
{
ICollection<AccountInfo> infos = new List<AccountInfo>();
IEnumerable<LoginProfile> linkedAccounts = new List<LoginProfile>();
if (AuthContext.IsAuthenticated)
{
linkedAccounts = AccountLinker.Get("webstudio").GetLinkedProfiles(AuthContext.CurrentAccount.ID.ToString());
}
fromOnly = string.IsNullOrWhiteSpace(fromOnly) ? string.Empty : fromOnly.ToLower();
foreach (var provider in ProviderManager.AuthProviders.Where(provider => string.IsNullOrEmpty(fromOnly) || fromOnly == provider || (provider == "google" && fromOnly == "openid")))
{
if (inviteView && provider.ToLower() == "twitter") continue;
var loginProvider = ProviderManager.GetLoginProvider(provider);
if (loginProvider != null && loginProvider.IsEnabled)
{
var url = VirtualPathUtility.ToAbsolute("~/login.ashx") + $"?auth={provider}";
var mode = (settingsView || inviteView || (!MobileDetector.IsMobile() && !Request.DesktopApp())
? ("&mode=popup&callback=" + clientCallback)
: ("&mode=Redirect&returnurl="
+ HttpUtility.UrlEncode(new Uri(Request.GetUrlRewriter(),
"Auth.aspx"
+ (Request.DesktopApp() ? "?desktop=true" : "")
).ToString())
));
infos.Add(new AccountInfo
{
Linked = linkedAccounts.Any(x => x.Provider == provider),
Provider = provider,
Url = url + mode
});
}
}
return infos;
}
[Update("thirdparty/linkaccount")]
public void LinkAccountFromBody([FromBody]LinkAccountModel model)

View File

@ -1,4 +1,4 @@
namespace ASC.Web.Api.Models
namespace ASC.People.Models
{
public class AccountInfo
{

View File

@ -43,7 +43,6 @@ using ASC.Common;
using ASC.Common.Caching;
using ASC.Common.Logging;
using ASC.Common.Utils;
using ASC.Common.Web;
using ASC.Core;
using ASC.Core.Billing;
using ASC.Core.Common.Configuration;
@ -59,16 +58,13 @@ using ASC.Data.Storage;
using ASC.Data.Storage.Configuration;
using ASC.Data.Storage.Encryption;
using ASC.Data.Storage.Migration;
using ASC.FederatedLogin;
using ASC.FederatedLogin.LoginProviders;
using ASC.FederatedLogin.Profile;
using ASC.IPSecurity;
using ASC.MessagingSystem;
using ASC.Security.Cryptography;
using ASC.Web.Api.Models;
using ASC.Web.Api.Routing;
using ASC.Web.Core;
using ASC.Web.Core.Mobile;
using ASC.Web.Core.PublicResources;
using ASC.Web.Core.Sms;
using ASC.Web.Core.Users;
@ -122,8 +118,6 @@ namespace ASC.Api.Settings
private IPSecurity.IPSecurity IpSecurity { get; }
private IMemoryCache MemoryCache { get; }
private ProviderManager ProviderManager { get; }
private MobileDetector MobileDetector { get; }
private IOptionsSnapshot<AccountLinker> AccountLinker { get; }
private FirstTimeTenantSettings FirstTimeTenantSettings { get; }
private UserManager UserManager { get; }
private TenantManager TenantManager { get; }
@ -220,8 +214,6 @@ namespace ASC.Api.Settings
IPSecurity.IPSecurity ipSecurity,
IMemoryCache memoryCache,
ProviderManager providerManager,
MobileDetector mobileDetector,
IOptionsSnapshot<AccountLinker> accountLinker,
FirstTimeTenantSettings firstTimeTenantSettings,
ServiceClient serviceClient,
TelegramHelper telegramHelper,
@ -247,8 +239,6 @@ namespace ASC.Api.Settings
IpSecurity = ipSecurity;
MemoryCache = memoryCache;
ProviderManager = providerManager;
MobileDetector = mobileDetector;
AccountLinker = accountLinker;
FirstTimeTenantSettings = firstTimeTenantSettings;
MessageService = messageService;
StudioNotifyService = studioNotifyService;
@ -649,51 +639,6 @@ namespace ASC.Api.Settings
return new QuotaWrapper(Tenant, CoreBaseSettings, CoreConfiguration, TenantExtra, TenantStatisticsProvider, AuthContext, SettingsManager, WebItemManager);
}
[AllowAnonymous]
[Read("authproviders")]
public ICollection<AccountInfo> GetAuthProviders(bool inviteView, bool settingsView, string clientCallback, string fromOnly)
{
ICollection<AccountInfo> infos = new List<AccountInfo>();
IEnumerable<LoginProfile> linkedAccounts = new List<LoginProfile>();
if (AuthContext.IsAuthenticated)
{
linkedAccounts = AccountLinker.Get("webstudio").GetLinkedProfiles(AuthContext.CurrentAccount.ID.ToString());
}
fromOnly = string.IsNullOrWhiteSpace(fromOnly) ? string.Empty : fromOnly.ToLower();
foreach (var provider in ProviderManager.AuthProviders.Where(provider => string.IsNullOrEmpty(fromOnly) || fromOnly == provider || (provider == "google" && fromOnly == "openid")))
{
if (inviteView && provider.ToLower() == "twitter") continue;
var loginProvider = ProviderManager.GetLoginProvider(provider);
if (loginProvider != null && loginProvider.IsEnabled)
{
var url = VirtualPathUtility.ToAbsolute("~/login.ashx") + $"?auth={provider}";
var mode = (settingsView || inviteView || (!MobileDetector.IsMobile() && !Request.DesktopApp())
? ("&mode=popup&callback=" + clientCallback)
: ("&mode=Redirect&returnurl="
+ HttpUtility.UrlEncode(new Uri(Request.GetUrlRewriter(),
"Auth.aspx"
+ (Request.DesktopApp() ? "?desktop=true" : "")
).ToString())
));
infos.Add(new AccountInfo
{
Linked = linkedAccounts.Any(x => x.Provider == provider),
Provider = provider,
Url = url + mode
});
}
}
return infos;
}
[AllowAnonymous]
[Read("cultures", Check = false)]
public IEnumerable<object> GetSupportedCultures()

View File

@ -37,7 +37,7 @@ using Microsoft.AspNetCore.Mvc;
namespace ASC.Web.Api.Controllers
{
[Scope(Additional = typeof(ThirdPartyControllerExtension))]
[Scope(Additional = typeof(BaseLoginProviderExtension))]
[DefaultRoute]
[ApiController]
public class ThirdPartyController : ControllerBase
@ -140,17 +140,4 @@ namespace ASC.Web.Api.Controllers
return url;
}
}
public class ThirdPartyControllerExtension
{
public static void Register(DIHelper services)
{
services.TryAdd<BoxLoginProvider>();
services.TryAdd<DropboxLoginProvider>();
services.TryAdd<OneDriveLoginProvider>();
services.TryAdd<DocuSignLoginProvider>();
services.TryAdd<GoogleLoginProvider>();
services.TryAdd<WordpressLoginProvider>();
}
}
}

View File

@ -93,17 +93,21 @@ const Editor = () => {
//showLoader();
const docApiUrl = await getDocServiceUrl();
if (!doc) {
const success = await checkIsAuthenticated();
if (!success) {
if (!doc && !success) {
return tryRedirectTo(combineUrl(AppServerConfig.proxyURL, "/login"));
} else {
}
if (success) {
try {
fileInfo = await getFileInfo(fileId);
} catch (err) {
console.error(err);
}
setIsAuthenticated(success);
}
}
fileInfo = await getFileInfo(fileId);
config = await openEdit(fileId, version, doc);
@ -145,7 +149,8 @@ const Editor = () => {
if (
config &&
config.document.permissions.edit &&
config.document.permissions.modifyFilter
config.document.permissions.modifyFilter &&
fileInfo
) {
const sharingSettings = await SharingDialog.getSharingSettings(fileId);
config.document.info = {
@ -249,19 +254,35 @@ const Editor = () => {
config.type = "mobile";
}
let goback;
if (fileInfo) {
const filterObj = FilesFilter.getDefault();
filterObj.folder = fileInfo.folderId;
const urlFilter = filterObj.toUrlParams();
config.editorConfig.customization = {
...config.editorConfig.customization,
goback: {
goback = {
blank: true,
requestClose: false,
text: i18n.t("FileLocation"),
url: `${combineUrl(filesUrl, `/filter?${urlFilter}`)}`,
},
};
}
config.editorConfig.customization = {
...config.editorConfig.customization,
goback,
};
let onRequestSharingSettings;
if (
fileInfo &&
config.document.permissions.edit &&
config.document.permissions.modifyFilter
) {
onRequestSharingSettings = onSDKRequestSharingSettings;
}
const events = {
events: {
@ -272,10 +293,7 @@ const Editor = () => {
onInfo: onSDKInfo,
onWarning: onSDKWarning,
onError: onSDKError,
...(config.document.permissions.edit &&
config.document.permissions.modifyFilter && {
onRequestSharingSettings: onSDKRequestSharingSettings,
}),
onRequestSharingSettings,
},
};
@ -357,13 +375,14 @@ const Editor = () => {
{!isLoading ? (
<>
<div id="editor"></div>
{fileInfo && (
<SharingDialog
isVisible={isVisible}
sharingObject={fileInfo}
onCancel={onCancel}
onSuccess={updateUsersRightsList}
/>
)}
</>
) : (
<Box paddingProp="16px">