Merge branch 'develop' of github.com:ONLYOFFICE/DocSpace into develop
This commit is contained in:
commit
bc2cb2db83
@ -82,6 +82,7 @@ services_name_backend+=(ASC.Data.Backup.BackgroundTasks)
|
||||
services_name_backend+=(ASC.ClearEvents)
|
||||
services_name_backend+=(ASC.Migration)
|
||||
services_name_backend+=(ASC.Webhooks.Service)
|
||||
services_name_backend+=(ASC.ApiSystem)
|
||||
|
||||
# Publish backend services
|
||||
for i in ${!services_name_backend[@]}; do
|
||||
|
@ -189,6 +189,15 @@ COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.Data.B
|
||||
|
||||
CMD ["ASC.Data.Backup.BackgroundTasks.dll", "ASC.Data.Backup.BackgroundTasks"]
|
||||
|
||||
# ASC.ApiSystem ##
|
||||
FROM dotnetrun AS api_system
|
||||
WORKDIR ${BUILD_PATH}/services/ASC.ApiSystem/
|
||||
|
||||
COPY --chown=onlyoffice:onlyoffice docker-entrypoint.py ./docker-entrypoint.py
|
||||
COPY --from=base --chown=onlyoffice:onlyoffice ${BUILD_PATH}/services/ASC.ApiSystem/service/ .
|
||||
|
||||
CMD [" ASC.ApiSystem.dll", " ASC.ApiSystem"]
|
||||
|
||||
## ASC.ClearEvents ##
|
||||
FROM dotnetrun AS clear-events
|
||||
WORKDIR ${BUILD_PATH}/services/ASC.ClearEvents/
|
||||
|
@ -114,6 +114,11 @@ services:
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api:${DOCKER_TAG}"
|
||||
container_name: ${API_HOST}
|
||||
|
||||
onlyoffice-api-system:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api-system:${DOCKER_TAG}"
|
||||
container_name: ${API_SYSTEM_HOST}
|
||||
|
||||
onlyoffice-studio:
|
||||
<<: *x-service-base
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-studio:${DOCKER_TAG}"
|
||||
@ -170,6 +175,7 @@ services:
|
||||
- onlyoffice-telegram-service
|
||||
- onlyoffice-urlshortener
|
||||
- onlyoffice-api
|
||||
- onlyoffice-api-system
|
||||
- onlyoffice-studio
|
||||
- onlyoffice-ssoauth
|
||||
- onlyoffice-doceditor
|
||||
@ -188,6 +194,7 @@ services:
|
||||
- SERVICE_TELEGRAM_SERVICE=${SERVICE_TELEGRAM_SERVICE}
|
||||
- SERVICE_URLSHORTENER=${SERVICE_URLSHORTENER}
|
||||
- SERVICE_API=${SERVICE_API}
|
||||
- SERVICE_API_SYSTEM=${SERVICE_API_SYSTEM}
|
||||
- SERVICE_STUDIO=${SERVICE_STUDIO}
|
||||
- SERVICE_SSOAUTH=${SERVICE_SSOAUTH}
|
||||
- SERVICE_DOCEDITOR=${SERVICE_DOCEDITOR}
|
||||
|
@ -92,6 +92,13 @@ services:
|
||||
target: api
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-api-system:
|
||||
build:
|
||||
context: ./
|
||||
dockerfile: "${DOCKERFILE}"
|
||||
target: api_system
|
||||
image: "${REPO}/${DOCKER_IMAGE_PREFIX}-api-system:${DOCKER_TAG}"
|
||||
|
||||
onlyoffice-studio:
|
||||
build:
|
||||
context: ./
|
||||
|
@ -6,8 +6,9 @@ import {
|
||||
tablet,
|
||||
smallTablet,
|
||||
desktop,
|
||||
size,
|
||||
} from "@docspace/components/utils/device";
|
||||
import { isMobile } from "react-device-detect";
|
||||
import { isMobile, isMobileOnly } from "react-device-detect";
|
||||
|
||||
const EmptyPageStyles = css`
|
||||
padding: 44px 0px 64px 0px;
|
||||
@ -32,11 +33,10 @@ const EmptyPageStyles = css`
|
||||
@media ${tablet} {
|
||||
padding: 44px 0px 64px 0px;
|
||||
grid-column-gap: 33px;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
@media ${smallTablet} {
|
||||
padding: 20px 0px 64px 11px;
|
||||
padding-right: 44px;
|
||||
}
|
||||
`;
|
||||
|
||||
@ -90,14 +90,26 @@ const EmptyFolderWrapper = styled.div`
|
||||
bottom: 16px;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1325px) {
|
||||
${!isMobile &&
|
||||
css`
|
||||
margin-left: 98px;
|
||||
`};
|
||||
}
|
||||
|
||||
${(props) => props.isEmptyPage && `${EmptyPageStyles}`}
|
||||
|
||||
${(props) =>
|
||||
props.isEmptyPage &&
|
||||
isMobileOnly &&
|
||||
css`
|
||||
padding: 20px 42px 64px 11px !important;
|
||||
`}
|
||||
|
||||
${(props) =>
|
||||
(props.isEmptyPage || props.isEmptyFolderContainer) &&
|
||||
props.sectionWidth <= size.smallTablet &&
|
||||
!isMobileOnly &&
|
||||
css`
|
||||
padding-left: 12px !important;
|
||||
|
||||
.empty-folder_link {
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
`}
|
||||
}
|
||||
`;
|
||||
|
||||
@ -113,11 +125,18 @@ const EmptyFoldersContainer = (props) => {
|
||||
imageStyle,
|
||||
buttonStyle,
|
||||
isEmptyPage,
|
||||
sectionWidth,
|
||||
isEmptyFolderContainer,
|
||||
} = props;
|
||||
|
||||
return (
|
||||
<EmptyFolderWrapper isEmptyPage={isEmptyPage}>
|
||||
<EmptyFolderWrapper
|
||||
sectionWidth={sectionWidth}
|
||||
isEmptyPage={isEmptyPage}
|
||||
isEmptyFolderContainer={isEmptyFolderContainer}
|
||||
>
|
||||
<EmptyScreenContainer
|
||||
sectionWidth={sectionWidth}
|
||||
className="empty-folder_container"
|
||||
style={style}
|
||||
imageStyle={imageStyle}
|
||||
@ -129,6 +148,7 @@ const EmptyFoldersContainer = (props) => {
|
||||
descriptionText={descriptionText}
|
||||
buttons={buttons}
|
||||
isEmptyPage={isEmptyPage}
|
||||
isEmptyFolderContainer={isEmptyFolderContainer}
|
||||
/>
|
||||
</EmptyFolderWrapper>
|
||||
);
|
||||
|
@ -14,6 +14,7 @@ const EmptyFolderContainer = ({
|
||||
parentId,
|
||||
linkStyles,
|
||||
isRooms,
|
||||
sectionWidth,
|
||||
}) => {
|
||||
const onBackToParentFolder = () => {
|
||||
setIsLoading(true);
|
||||
@ -83,6 +84,8 @@ const EmptyFolderContainer = ({
|
||||
descriptionText={t("EmptyFolderDecription")}
|
||||
imageSrc="/static/images/empty_screen_alt.svg"
|
||||
buttons={buttons}
|
||||
sectionWidth={sectionWidth}
|
||||
isEmptyFolderContainer={true}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
@ -48,6 +48,7 @@ const RootFolderContainer = (props) => {
|
||||
isEmptyPage,
|
||||
setIsEmptyPage,
|
||||
isVisitor,
|
||||
sectionWidth,
|
||||
} = props;
|
||||
const personalDescription = t("PersonalEmptyContainerDescription");
|
||||
const shareDescription = t("SharedEmptyContainerDescription");
|
||||
@ -342,6 +343,7 @@ const RootFolderContainer = (props) => {
|
||||
<EmptyContainer
|
||||
headerText={headerText}
|
||||
isEmptyPage={isEmptyPage}
|
||||
sectionWidth={sectionWidth}
|
||||
{...emptyFolderProps}
|
||||
/>
|
||||
)}
|
||||
|
@ -20,6 +20,7 @@ const EmptyContainer = ({
|
||||
parentId,
|
||||
theme,
|
||||
setCreateRoomDialogVisible,
|
||||
sectionWidth,
|
||||
}) => {
|
||||
linkStyles.color = theme.filesEmptyContainer.linkColor;
|
||||
|
||||
@ -49,9 +50,14 @@ const EmptyContainer = ({
|
||||
onCreate={onCreate}
|
||||
linkStyles={linkStyles}
|
||||
onCreateRoom={onCreateRoom}
|
||||
sectionWidth={sectionWidth}
|
||||
/>
|
||||
) : (
|
||||
<EmptyFolderContainer onCreate={onCreate} linkStyles={linkStyles} />
|
||||
<EmptyFolderContainer
|
||||
sectionWidth={sectionWidth}
|
||||
onCreate={onCreate}
|
||||
linkStyles={linkStyles}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
|
@ -244,7 +244,7 @@ const SectionBodyContent = (props) => {
|
||||
{(context) =>
|
||||
isEmptyFilesList || null ? (
|
||||
<>
|
||||
<EmptyContainer />
|
||||
<EmptyContainer sectionWidth={context.sectionWidth} />
|
||||
</>
|
||||
) : viewAs === "tile" ? (
|
||||
<>
|
||||
|
@ -36,6 +36,13 @@ const StyledSettingsComponent = styled.div`
|
||||
.dns-setting_helpbutton {
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
.dns-textarea {
|
||||
textarea {
|
||||
color: ${(props) => props.theme.text.disableColor};
|
||||
}
|
||||
}
|
||||
|
||||
.combo-button-label {
|
||||
max-width: 100%;
|
||||
font-weight: 400;
|
||||
|
@ -16,6 +16,7 @@ import { DNSSettingsTooltip } from "../sub-components/common-tooltips";
|
||||
import { StyledSettingsComponent, StyledScrollbar } from "./StyledSettings";
|
||||
import { setDocumentTitle } from "SRC_DIR/helpers/utils";
|
||||
import LoaderCustomization from "../sub-components/loaderCustomization";
|
||||
import Textarea from "@docspace/components/textarea";
|
||||
import withLoading from "SRC_DIR/HOCs/withLoading";
|
||||
import Badge from "@docspace/components/badge";
|
||||
const DNSSettings = (props) => {
|
||||
@ -93,21 +94,20 @@ const DNSSettings = (props) => {
|
||||
|
||||
const settingsBlock = (
|
||||
<div className="settings-block">
|
||||
<div className="settings-block-description settings_unavailable">
|
||||
{t("DNSSettingsMobile")}
|
||||
</div>
|
||||
<div className="settings-block-description">{t("DNSSettingsMobile")}</div>
|
||||
<FieldContainer
|
||||
id="fieldContainerDNSSettings"
|
||||
className="field-container-width settings_unavailable"
|
||||
labelText={`${t("YourCurrentDomain")}`}
|
||||
isVertical={true}
|
||||
>
|
||||
<TextInput
|
||||
tabIndex={8}
|
||||
<Textarea
|
||||
id="textInputContainerDNSSettings"
|
||||
scale={true}
|
||||
className="dns-textarea"
|
||||
heightTextArea={30}
|
||||
tabIndex={8}
|
||||
isDisabled={true}
|
||||
value={location.hostname}
|
||||
isDisabled={!isSettingPaid}
|
||||
/>
|
||||
</FieldContainer>
|
||||
</div>
|
||||
@ -123,9 +123,7 @@ const DNSSettings = (props) => {
|
||||
>
|
||||
{isCustomizationView && !isMobileView && (
|
||||
<div className="category-item-heading">
|
||||
<div className="category-item-title settings_unavailable">
|
||||
{t("DNSSettings")}
|
||||
</div>
|
||||
<div className="category-item-title">{t("DNSSettings")}</div>
|
||||
<HelpButton
|
||||
iconName="static/images/combined.shape.svg"
|
||||
size={12}
|
||||
|
@ -1,6 +1,14 @@
|
||||
import styled, { css } from "styled-components";
|
||||
import { mobile, tablet, smallTablet, desktop } from "../utils/device";
|
||||
import {
|
||||
mobile,
|
||||
tablet,
|
||||
smallTablet,
|
||||
desktop,
|
||||
size,
|
||||
hugeDesktop,
|
||||
} from "../utils/device";
|
||||
import NoUserSelect from "../utils/commonStyles";
|
||||
import { isMobileOnly } from "react-device-detect";
|
||||
|
||||
const EmptyPageStyles = css`
|
||||
grid-row-gap: 9px;
|
||||
@ -15,31 +23,38 @@ const EmptyPageStyles = css`
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.ec-header {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.ec-buttons {
|
||||
max-width: 285px;
|
||||
}
|
||||
|
||||
.empty-folder_container-links {
|
||||
align-items: start;
|
||||
margin: 16px 0 !important;
|
||||
}
|
||||
|
||||
@media ${smallTablet} {
|
||||
.ec-image {
|
||||
height: 72px;
|
||||
max-width: 800px;
|
||||
|
||||
@media ${hugeDesktop} {
|
||||
margin: 0 13%;
|
||||
width: 74%;
|
||||
min-width: 480px;
|
||||
}
|
||||
|
||||
@media ${tablet} {
|
||||
max-width: 480px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
@media (max-width: 768px) {
|
||||
${(props) =>
|
||||
props.sectionWidth > size.smallTablet &&
|
||||
css`
|
||||
margin: 0 13% !important;
|
||||
width: 74%;
|
||||
min-width: auto;
|
||||
`}
|
||||
}
|
||||
|
||||
@media ${smallTablet} {
|
||||
.ec-header {
|
||||
padding-top: 22px;
|
||||
}
|
||||
|
||||
.ec-desc {
|
||||
max-width: 282px;
|
||||
}
|
||||
}
|
||||
|
||||
@media ${desktop} {
|
||||
@ -53,75 +68,12 @@ const EmptyPageStyles = css`
|
||||
}
|
||||
`;
|
||||
|
||||
const EmptyContentBody = styled.div`
|
||||
margin: 0 auto;
|
||||
padding: 64px 0;
|
||||
grid-template-columns: 150px 1fr;
|
||||
|
||||
@media ${tablet} {
|
||||
grid-template-columns: none;
|
||||
}
|
||||
|
||||
display: grid;
|
||||
grid-template-areas:
|
||||
"img headerText"
|
||||
${(props) => props.subheadingText && `"img subheadingText"`}
|
||||
${(props) => props.descriptionText && `"img descriptionText"`}
|
||||
"img button";
|
||||
|
||||
grid-column-gap: 16px;
|
||||
grid-row-gap: 10px;
|
||||
max-width: 800px;
|
||||
|
||||
grid-template-rows: max-content;
|
||||
.ec-image {
|
||||
grid-area: img;
|
||||
margin: 16px 0 0 auto;
|
||||
${NoUserSelect}
|
||||
}
|
||||
|
||||
@media ${tablet} {
|
||||
max-width: 480px;
|
||||
}
|
||||
|
||||
.ec-header {
|
||||
grid-area: headerText;
|
||||
padding-top: 16px;
|
||||
@media (max-width: 375px) {
|
||||
margin-top: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.ec-subheading {
|
||||
grid-area: subheadingText;
|
||||
}
|
||||
|
||||
.ec-desc {
|
||||
grid-area: descriptionText;
|
||||
line-height: 18px;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
.ec-buttons {
|
||||
grid-area: button;
|
||||
}
|
||||
|
||||
@media (orientation: portrait) {
|
||||
@media (max-width: 768px) {
|
||||
padding-top: 0px;
|
||||
|
||||
.ec-image {
|
||||
max-height: 100px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 428px) {
|
||||
const MobileView = css`
|
||||
grid-template-areas:
|
||||
"img img img"
|
||||
"headerText headerText headerText"
|
||||
${(props) =>
|
||||
props.subheadingText &&
|
||||
`"subheadingText subheadingText subheadingText"`}
|
||||
props.subheadingText && `"subheadingText subheadingText subheadingText"`}
|
||||
${(props) =>
|
||||
props.descriptionText &&
|
||||
`"descriptionText descriptionText descriptionText"`}
|
||||
@ -142,10 +94,117 @@ const EmptyContentBody = styled.div`
|
||||
height: 75px;
|
||||
margin-left: 0;
|
||||
}
|
||||
`;
|
||||
|
||||
const EmptyContentBody = styled.div`
|
||||
margin: 0 auto;
|
||||
|
||||
padding: ${(props) => (props.isEmptyFolderContainer ? "37px 0" : "64px 0")};
|
||||
grid-template-columns: 150px 1fr;
|
||||
|
||||
display: grid;
|
||||
grid-template-areas:
|
||||
"img headerText"
|
||||
${(props) => props.subheadingText && `"img subheadingText"`}
|
||||
${(props) => props.descriptionText && `"img descriptionText"`}
|
||||
"img button";
|
||||
|
||||
grid-column-gap: 16px;
|
||||
grid-row-gap: 10px;
|
||||
max-width: 800px;
|
||||
|
||||
grid-template-rows: max-content;
|
||||
.ec-image {
|
||||
grid-area: img;
|
||||
margin: 16px 0 0 auto;
|
||||
${NoUserSelect}
|
||||
}
|
||||
|
||||
.ec-header {
|
||||
grid-area: headerText;
|
||||
font-size: 16px;
|
||||
padding-top: 16px;
|
||||
@media (max-width: 375px) {
|
||||
margin-top: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
${(props) => props.isEmptyPage && `${EmptyPageStyles}`}
|
||||
.ec-subheading {
|
||||
grid-area: subheadingText;
|
||||
}
|
||||
|
||||
.ec-desc {
|
||||
grid-area: descriptionText;
|
||||
line-height: 18px;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
.ec-buttons {
|
||||
grid-area: button;
|
||||
}
|
||||
|
||||
@media ${tablet} {
|
||||
grid-template-columns: none;
|
||||
max-width: 480px;
|
||||
}
|
||||
|
||||
@media (orientation: portrait) {
|
||||
@media (max-width: 768px) {
|
||||
padding-top: ${(props) => !props.isEmptyFolderContainer && "0px"};
|
||||
|
||||
.ec-image {
|
||||
max-height: 100px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 428px) {
|
||||
${MobileView}
|
||||
}
|
||||
}
|
||||
|
||||
${(props) =>
|
||||
(props.isEmptyPage || props.isEmptyFolderContainer) && `${EmptyPageStyles}`}
|
||||
|
||||
${(props) =>
|
||||
(props.isEmptyPage || props.isEmptyFolderContainer) &&
|
||||
props.sectionWidth <= size.smallTablet &&
|
||||
!isMobileOnly &&
|
||||
css`
|
||||
${MobileView}
|
||||
|
||||
.ec-desc {
|
||||
max-width: none;
|
||||
}
|
||||
|
||||
.ec-header {
|
||||
padding-top: 22px;
|
||||
}
|
||||
|
||||
.ec-image {
|
||||
height: 100px !important;
|
||||
}
|
||||
`}
|
||||
|
||||
${(props) =>
|
||||
(props.isEmptyPage || props.isEmptyFolderContainer) &&
|
||||
isMobileOnly &&
|
||||
css`
|
||||
.ec-image {
|
||||
margin-top: ${(props) => props.isEmptyFolderContainer && "0px"};
|
||||
height: ${(props) => props.isEmptyPage && "72px !important"};
|
||||
}
|
||||
`}
|
||||
|
||||
|
||||
${(props) =>
|
||||
(props.isEmptyPage || props.isEmptyFolderContainer) &&
|
||||
props.sectionWidth <= size.smallTablet &&
|
||||
css`
|
||||
max-width: none !important;
|
||||
width: auto !important;
|
||||
min-width: auto !important;
|
||||
margin: 0 !important;
|
||||
`}
|
||||
`;
|
||||
|
||||
const EmptyContentImage = styled.img.attrs((props) => ({
|
||||
|
@ -17,7 +17,7 @@ const StyledOuter = styled.div`
|
||||
}
|
||||
path {
|
||||
fill: ${(props) =>
|
||||
props.color ? props.color : props.theme.iconButton.color} !important;
|
||||
props.color ? props.color : props.theme.iconButton.color};
|
||||
}
|
||||
}
|
||||
&:hover {
|
||||
|
@ -2734,6 +2734,7 @@ const Base = {
|
||||
textColor: gray,
|
||||
navBackground: "#F8F9F9",
|
||||
headerColor: black,
|
||||
helpButton: "#A3A9AE",
|
||||
|
||||
register: {
|
||||
backgroundColor: grayLight,
|
||||
|
@ -2740,6 +2740,7 @@ const Dark = {
|
||||
textColor: "#858585",
|
||||
navBackground: "#282828",
|
||||
headerColor: white,
|
||||
helpButton: "#D8D8D8",
|
||||
|
||||
register: {
|
||||
backgroundColor: "#292929",
|
||||
|
@ -6,6 +6,7 @@ export const size = {
|
||||
smallTablet: 600,
|
||||
tablet: 1024,
|
||||
desktop: 1025,
|
||||
hugeDesktop: 1439,
|
||||
};
|
||||
|
||||
export const mobile = `(max-width: ${size.mobile}px)`;
|
||||
@ -18,6 +19,8 @@ export const tablet = `(max-width: ${size.tablet}px)`;
|
||||
|
||||
export const desktop = `(min-width: ${size.desktop}px)`;
|
||||
|
||||
export const hugeDesktop = `(max-width: ${size.hugeDesktop}px)`;
|
||||
|
||||
export const isMobile = () => {
|
||||
return window.innerWidth <= size.mobile;
|
||||
};
|
||||
|
@ -174,6 +174,14 @@ export const LoginContainer = styled.div`
|
||||
}
|
||||
}
|
||||
|
||||
.help-button{
|
||||
svg {
|
||||
path {
|
||||
fill: ${(props) => props.theme.login.helpButton};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.checkbox-text{
|
||||
color: ${(props) => props.theme.checkbox.arrowColor};
|
||||
}
|
||||
|
@ -284,7 +284,7 @@ const LoginForm: React.FC<ILoginFormProps> = ({
|
||||
helpButton={
|
||||
!checkIsSSR() && (
|
||||
<HelpButton
|
||||
color="#A3A9AE"
|
||||
className="help-button"
|
||||
helpButtonHeaderContent={t("CookieSettingsTitle")}
|
||||
tooltipContent={
|
||||
<Text fontSize="12px">{t("RememberHelper")}</Text>
|
||||
|
@ -147,7 +147,7 @@ public class WhitelabelController : BaseSettingsController
|
||||
|
||||
|
||||
///<visible>false</visible>
|
||||
[AllowNotPayment]
|
||||
[AllowNotPayment, AllowAnonymous]
|
||||
[HttpGet("whitelabel/logos")]
|
||||
public Dictionary<string, string> GetWhiteLabelLogos([FromQuery] WhiteLabelQueryRequestsDto inDto)
|
||||
{
|
||||
|
@ -46,13 +46,11 @@ public class StudioSmsNotificationSettingsHelper : TfaSettingsHelperBase<StudioS
|
||||
{
|
||||
private readonly CoreBaseSettings _coreBaseSettings;
|
||||
private readonly SetupInfo _setupInfo;
|
||||
private readonly SettingsManager _settingsManager;
|
||||
private readonly SmsProviderManager _smsProviderManager;
|
||||
private readonly TenantManager _tenantManager;
|
||||
|
||||
public StudioSmsNotificationSettingsHelper(
|
||||
IHttpContextAccessor httpContextAccessor,
|
||||
TenantExtra tenantExtra,
|
||||
CoreBaseSettings coreBaseSettings,
|
||||
SetupInfo setupInfo,
|
||||
SettingsManager settingsManager,
|
||||
@ -63,7 +61,6 @@ public class StudioSmsNotificationSettingsHelper : TfaSettingsHelperBase<StudioS
|
||||
{
|
||||
_coreBaseSettings = coreBaseSettings;
|
||||
_setupInfo = setupInfo;
|
||||
_settingsManager = settingsManager;
|
||||
_smsProviderManager = smsProviderManager;
|
||||
_tenantManager = tenantManager;
|
||||
}
|
||||
|
@ -71,6 +71,8 @@ public abstract class TfaSettingsHelperBase<T> where T : TfaSettingsBase<T>, new
|
||||
return false;
|
||||
}
|
||||
|
||||
if (settings.MandatoryGroups != null)
|
||||
{
|
||||
foreach (var mandatory in settings.MandatoryGroups)
|
||||
{
|
||||
if (_userManager.IsUserInGroup(userGuid, mandatory))
|
||||
@ -78,7 +80,10 @@ public abstract class TfaSettingsHelperBase<T> where T : TfaSettingsBase<T>, new
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (settings.MandatoryUsers != null)
|
||||
{
|
||||
foreach (var mandatory in settings.MandatoryUsers)
|
||||
{
|
||||
if (mandatory == userGuid)
|
||||
@ -86,13 +91,16 @@ public abstract class TfaSettingsHelperBase<T> where T : TfaSettingsBase<T>, new
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (settings.TrustedIps != null && settings.TrustedIps.Any())
|
||||
{
|
||||
var requestIP = MessageSettings.GetIP(_httpContextAccessor.HttpContext.Request);
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(requestIP) && settings.TrustedIps.Any(trustedIp => IPSecurity.IPSecurity.MatchIPs(requestIP, trustedIp)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user