Merge branch 'develop' into feature/invite-accounts

This commit is contained in:
Ilya Oleshko 2022-10-27 17:39:02 +03:00
commit 76d19a0a43
25 changed files with 378 additions and 138 deletions

View File

@ -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

View File

@ -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/

View File

@ -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}

View File

@ -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: ./

View File

@ -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>
);

View File

@ -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}
/>
);
};

View File

@ -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}
/>
)}

View File

@ -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}
/>
);
};

View File

@ -224,7 +224,7 @@ class SelectFolderDialog extends React.Component {
const buttonIsDisabled =
isDisableButton ||
(isRecycleBin && currentFolderId === resultingFolderId) ||
selectionFiles[0]?.parentId === +resultingFolderId;
(selectionFiles && selectionFiles[0])?.parentId === +resultingFolderId;
const isCurrentFolder = +currentFolderId === +resultingFolderId;

View File

@ -56,6 +56,8 @@ const SectionFilterContent = ({
groups,
customNames,
}) => {
const [selectedFilterValues, setSelectedFilterValues] = React.useState(null);
//TODO: add new options from filter after update backend and fix manager from role
const onFilter = (data) => {
const status = getStatus(data);
@ -79,7 +81,7 @@ const SectionFilterContent = ({
newFilter.group = group;
setIsLoading(true);
fetchPeople(newFilter).finally(() => setIsLoading(false));
fetchPeople(newFilter, true).finally(() => setIsLoading(false));
};
const onSort = (sortId, sortDirection) => {
@ -93,7 +95,7 @@ const SectionFilterContent = ({
setIsLoading(true);
fetchPeople(newFilter).finally(() => setIsLoading(false));
fetchPeople(newFilter, true).finally(() => setIsLoading(false));
};
const onSearch = (data = "") => {
@ -103,7 +105,7 @@ const SectionFilterContent = ({
setIsLoading(true);
fetchPeople(newFilter).finally(() => setIsLoading(false));
fetchPeople(newFilter, true).finally(() => setIsLoading(false));
};
// TODO: change translation keys
@ -232,7 +234,7 @@ const SectionFilterContent = ({
}, [filter.sortOrder, filter.sortBy]);
//TODO: add new options from filter after update backend
const getSelectedFilterData = async () => {
const getSelectedFilterData = React.useCallback(async () => {
const { guestCaption, userCaption, groupCaption } = customNames;
const filterValues = [];
@ -295,8 +297,59 @@ const SectionFilterContent = ({
}
}
return filterValues;
};
const currentFilterValues = [];
setSelectedFilterValues((value) => {
if (!value) {
currentFilterValues.push(...filterValues);
return filterValues.map((f) => ({ ...f }));
}
const items = value.map((v) => {
const item = filterValues.find((f) => f.group === v.group);
if (item) {
if (item.isMultiSelect) {
let isEqual = true;
item.key.forEach((k) => {
if (!v.key.includes(k)) {
isEqual = false;
}
});
if (isEqual) return item;
return false;
} else {
if (item.key === v.key) return item;
return false;
}
} else {
return false;
}
});
const newItems = filterValues.filter(
(v) => !items.find((i) => i.group === v.group)
);
items.push(...newItems);
currentFilterValues.push(...items.filter((i) => i));
return items.filter((i) => i);
});
return currentFilterValues;
}, [
filter.employeeStatus,
filter.activationStatus,
filter.role,
filter.group,
t,
customNames,
]);
//TODO: add new options from filter after update backend
const removeSelectedItem = ({ key, group }) => {
@ -317,12 +370,12 @@ const SectionFilterContent = ({
}
setIsLoading(true);
fetchPeople(newFilter).finally(() => setIsLoading(false));
fetchPeople(newFilter, true).finally(() => setIsLoading(false));
};
const clearAll = () => {
setIsLoading(true);
fetchPeople().finally(() => setIsLoading(false));
fetchPeople(null, true).finally(() => setIsLoading(false));
};
return isLoaded && tReady ? (

View File

@ -244,7 +244,7 @@ const SectionBodyContent = (props) => {
{(context) =>
isEmptyFilesList || null ? (
<>
<EmptyContainer />
<EmptyContainer sectionWidth={context.sectionWidth} />
</>
) : viewAs === "tile" ? (
<>

View File

@ -155,6 +155,8 @@ const SectionFilterContent = ({
setCurrentRoomsFilter,
providers,
}) => {
const [selectedFilterValues, setSelectedFilterValues] = React.useState(null);
const onFilter = React.useCallback(
(data) => {
if (isRooms) {
@ -378,30 +380,6 @@ const SectionFilterContent = ({
// });
// }
if (roomsFilter.provider) {
const provider = +roomsFilter.provider;
const label = RoomsProviderTypeName[provider];
filterValues.push({
key: provider,
label: label,
group: FilterGroups.roomFilterProviderType,
});
}
if (roomsFilter.type) {
const key = +roomsFilter.type;
const label = getDefaultRoomName(key, t);
filterValues.push({
key: key,
label: label,
group: FilterGroups.roomFilterType,
});
}
if (roomsFilter.subjectId) {
const isMe = userId === roomsFilter.subjectId;
let label = isMe
@ -431,6 +409,18 @@ const SectionFilterContent = ({
// });
// }
if (roomsFilter.type) {
const key = +roomsFilter.type;
const label = getDefaultRoomName(key, t);
filterValues.push({
key: key,
label: label,
group: FilterGroups.roomFilterType,
});
}
if (roomsFilter?.tags?.length > 0) {
filterValues.push({
key: roomsFilter.tags,
@ -438,6 +428,18 @@ const SectionFilterContent = ({
isMultiSelect: true,
});
}
if (roomsFilter.provider) {
const provider = +roomsFilter.provider;
const label = RoomsProviderTypeName[provider];
filterValues.push({
key: provider,
label: label,
group: FilterGroups.roomFilterProviderType,
});
}
} else {
if (filter.withSubfolders === "false") {
filterValues.push({
@ -525,7 +527,51 @@ const SectionFilterContent = ({
}
}
return filterValues;
const currentFilterValues = [];
setSelectedFilterValues((value) => {
if (!value) {
currentFilterValues.push(...filterValues);
return filterValues.map((f) => ({ ...f }));
}
const items = value.map((v) => {
const item = filterValues.find((f) => f.group === v.group);
if (item) {
if (item.isMultiSelect) {
let isEqual = true;
item.key.forEach((k) => {
if (!v.key.includes(k)) {
isEqual = false;
}
});
if (isEqual) return item;
return false;
} else {
if (item.key === v.key) return item;
return false;
}
} else {
return false;
}
});
const newItems = filterValues.filter(
(v) => !items.find((i) => i.group === v.group)
);
items.push(...newItems);
currentFilterValues.push(...items.filter((i) => i));
return items.filter((i) => i);
});
return currentFilterValues;
}, [
filter.withSubfolders,
filter.authorType,

View File

@ -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;

View File

@ -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}

View File

@ -23,7 +23,7 @@ class UsersStore {
makeAutoObservable(this);
}
getUsersList = async (filter) => {
getUsersList = async (filter, updateFilter = false) => {
const filterData = filter ? filter.clone() : Filter.getDefault();
if (!this.authStore.settingsStore.withPaging) {
@ -41,6 +41,10 @@ class UsersStore {
const res = await api.people.getUserList(filterData);
filterData.total = res.total;
if (updateFilter) {
this.peopleStore.filterStore.setFilterParams(filterData);
}
/* this.peopleStore.filterStore.setFilterParams(filterData);
this.peopleStore.selectedGroupStore.setSelectedGroup(
filterData.group || "root"

View File

@ -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,14 +68,39 @@ const EmptyPageStyles = css`
}
`;
const MobileView = css`
grid-template-areas:
"img img img"
"headerText headerText headerText"
${(props) =>
props.subheadingText && `"subheadingText subheadingText subheadingText"`}
${(props) =>
props.descriptionText &&
`"descriptionText descriptionText descriptionText"`}
"button button button";
.ec-header {
padding-top: 0px;
}
.ec-header,
.ec-subheading,
.ec-desc,
.ec-image,
.ec-buttons {
padding-left: 16px;
}
.ec-image {
height: 75px;
margin-left: 0;
}
`;
const EmptyContentBody = styled.div`
margin: 0 auto;
padding: 64px 0;
grid-template-columns: 150px 1fr;
@media ${tablet} {
grid-template-columns: none;
}
padding: ${(props) => (props.isEmptyFolderContainer ? "37px 0" : "64px 0")};
grid-template-columns: 150px 1fr;
display: grid;
grid-template-areas:
@ -80,12 +120,9 @@ const EmptyContentBody = styled.div`
${NoUserSelect}
}
@media ${tablet} {
max-width: 480px;
}
.ec-header {
grid-area: headerText;
font-size: 16px;
padding-top: 16px;
@media (max-width: 375px) {
margin-top: 5px;
@ -106,9 +143,14 @@ const EmptyContentBody = styled.div`
grid-area: button;
}
@media ${tablet} {
grid-template-columns: none;
max-width: 480px;
}
@media (orientation: portrait) {
@media (max-width: 768px) {
padding-top: 0px;
padding-top: ${(props) => !props.isEmptyFolderContainer && "0px"};
.ec-image {
max-height: 100px;
@ -116,36 +158,53 @@ const EmptyContentBody = styled.div`
}
@media (max-width: 428px) {
grid-template-areas:
"img img img"
"headerText headerText headerText"
${(props) =>
props.subheadingText &&
`"subheadingText subheadingText subheadingText"`}
${(props) =>
props.descriptionText &&
`"descriptionText descriptionText descriptionText"`}
"button button button";
.ec-header {
padding-top: 0px;
}
.ec-header,
.ec-subheading,
.ec-desc,
.ec-image,
.ec-buttons {
padding-left: 16px;
}
.ec-image {
height: 75px;
margin-left: 0;
}
${MobileView}
}
}
${(props) => props.isEmptyPage && `${EmptyPageStyles}`}
${(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) => ({

View File

@ -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 {

View File

@ -2734,6 +2734,7 @@ const Base = {
textColor: gray,
navBackground: "#F8F9F9",
headerColor: black,
helpButton: "#A3A9AE",
register: {
backgroundColor: grayLight,

View File

@ -2740,6 +2740,7 @@ const Dark = {
textColor: "#858585",
navBackground: "#282828",
headerColor: white,
helpButton: "#D8D8D8",
register: {
backgroundColor: "#292929",

View File

@ -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;
};

View File

@ -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};
}

View File

@ -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>

View File

@ -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)
{

View File

@ -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;
}

View File

@ -70,28 +70,36 @@ public abstract class TfaSettingsHelperBase<T> where T : TfaSettingsBase<T>, new
{
return false;
}
foreach (var mandatory in settings.MandatoryGroups)
{
if (_userManager.IsUserInGroup(userGuid, mandatory))
{
return true;
}
if (settings.MandatoryGroups != null)
{
foreach (var mandatory in settings.MandatoryGroups)
{
if (_userManager.IsUserInGroup(userGuid, mandatory))
{
return true;
}
}
}
foreach (var mandatory in settings.MandatoryUsers)
{
if (mandatory == userGuid)
{
return true;
}
if (settings.MandatoryUsers != null)
{
foreach (var mandatory in settings.MandatoryUsers)
{
if (mandatory == userGuid)
{
return true;
}
}
}
var requestIP = MessageSettings.GetIP(_httpContextAccessor.HttpContext.Request);
if (!string.IsNullOrWhiteSpace(requestIP) && settings.TrustedIps.Any(trustedIp => IPSecurity.IPSecurity.MatchIPs(requestIP, trustedIp)))
{
return false;
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;