Skip to content

Commit

Permalink
feat(preferences): can set SOGoForwardConstraints to 3 to accept both…
Browse files Browse the repository at this point in the history
… internal and external domains from SOGoForwardConstraintsDomains
  • Loading branch information
QHivert committed Nov 10, 2023
1 parent d163405 commit c872fb4
Show file tree
Hide file tree
Showing 6 changed files with 82 additions and 8 deletions.
10 changes: 6 additions & 4 deletions Documentation/SOGoInstallationGuide.asciidoc
Original file line number Diff line number Diff line change
Expand Up @@ -2280,12 +2280,14 @@ Defaults to `NO` when unset.
|D |SOGoForwardConstraints
|Parameter used to set constraints on possible addresses used when
automatically forwarding mails. When set to `0` (default), no constraint
is enforced. When set to `1`, only internal domains can be used. When
set to `2`, only external domains can be used.
is enforced. When set to `1`, only internal domains can be used.
When set to `2`, only external domains defined in `SOGoForwardConstraintsDomains`
can be used. When set to `3`, internal domains and other domains defined
in `SOGoForwardConstraintsDomains` can be used.
|D |SOGoForwardConstraintsDomains
|Parameter used to set which domains are allowed as external domains
when SOGoForwardConstraints is set to `2`. For example, setting:
|Parameter used to set which external domains are allowed
when SOGoForwardConstraints is set to `2` or `3`. For example, setting:
SOGoForwardConstraintsDomains = ("gmail.com", "googlemail.com");
Expand Down
1 change: 1 addition & 0 deletions SoObjects/SOGo/NSString+Utilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
- (id) objectFromJSONString;

/* bare email addresses */
- (NSString *) mailDomain;
- (NSString *) pureEMailAddress;

- (NSString *) asQPSubjectString: (NSString *) encoding;
Expand Down
12 changes: 12 additions & 0 deletions SoObjects/SOGo/NSString+Utilities.m
Original file line number Diff line number Diff line change
Expand Up @@ -609,6 +609,18 @@ - (NSString *) fromCSSIdentifier
return newString;
}


- (NSString *) mailDomain
{
NSArray *mailSeparated;

mailSeparated = [self componentsSeparatedByString: @"@"];
if([mailSeparated count] == 2)
return [mailSeparated objectAtIndex: 1];
[self logWithFormat: @"Error while extracting domain from : %@", self];
return nil;
}

- (NSString *) pureEMailAddress
{
NSString *pureAddress;
Expand Down
2 changes: 1 addition & 1 deletion SoObjects/SOGo/SOGoDomainDefaults.m
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ - (int) forwardConstraints

v = [self integerForKey: @"SOGoForwardConstraints"];

return (v > 2 ? 0 : v);
return (v > 3 ? 0 : v);
}

- (NSArray *) forwardConstraintsDomains
Expand Down
58 changes: 55 additions & 3 deletions UI/PreferencesUI/UIxPreferences.m
Original file line number Diff line number Diff line change
Expand Up @@ -1532,6 +1532,44 @@ - (NSString *) forwardEnabled
return (forwardEnabled ? @"true" : @"false");
}

- (BOOL) doForwardsMatchTheConstraints: (NSArray *) forwardMails
{
NSArray *allUserMails, *domainConstraints;
NSMutableArray *allUserDomains;
NSString *currentMail, *currentDomain, *userMail;
SOGoDomainDefaults *dd;
int constraint;

dd = [[context activeUser] domainDefaults];
constraint = [dd forwardConstraints];

if(constraint > 0)
{
allUserMails = [[user allEmails] uniqueObjects];
allUserDomains = [NSMutableArray array];
for(userMail in allUserMails)
{
[allUserDomains push: [userMail mailDomain]];
}
for(currentMail in forwardMails)
{
currentDomain = [currentMail mailDomain];
domainConstraints = [dd forwardConstraintsDomains];
if (constraint == 1 && [allUserDomains indexOfObject: currentDomain] == NSNotFound)
return NO;
else if (constraint == 2 && [allUserDomains indexOfObject: currentDomain] != NSNotFound)
return NO;
else if (constraint == 2 && (!domainConstraints || [domainConstraints indexOfObject: currentDomain] == NSNotFound))
return NO;
else if (constraint == 3 &&
[allUserDomains indexOfObject: currentDomain] == NSNotFound &&
(!domainConstraints || [domainConstraints indexOfObject: currentDomain] == NSNotFound))
return NO;
}
}
return YES;
}

/**
* @api {post} /so/:username/Preferences/save Save user's defaults and settings
* @apiVersion 1.0.0
Expand Down Expand Up @@ -1561,8 +1599,8 @@ - (NSString *) forwardEnabled
if ((v = [o objectForKey: @"defaults"]))
{
NSMutableDictionary *sanitizedLabels;
NSArray *allKeys, *accounts, *identities;
NSDictionary *newLabels;
NSArray *allKeys, *accounts, *identities, *forwardMails;
NSDictionary *newLabels, *forwardPref;
NSString *name;
id loginModule;

Expand Down Expand Up @@ -1600,6 +1638,20 @@ - (NSString *) forwardEnabled
[v removeObjectForKey: @"SOGoAlternateAvatar"];
[[[user userDefaults] source] removeObjectForKey: @"SOGoAlternateAvatar"];
}

//We check if there are forward constraints
forwardPref = [v objectForKey: @"Forward"];
if(forwardPref && [forwardPref isKindOfClass: [NSDictionary class]]
&& [forwardPref objectForKey: @"enabled"]
&& [[forwardPref objectForKey: @"enabled"] boolValue])
{
BOOL doForward = NO;
forwardMails = [forwardPref objectForKey: @"forwardAddress"];
if (forwardMails && [forwardMails isKindOfClass: [NSArray class]] && [forwardMails count]>0)
doForward = [self doForwardsMatchTheConstraints: [forwardPref objectForKey: @"forwardAddress"]];
if(!doForward)
[v removeObjectForKey: @"Forward"];
}

if ([self userHasMailAccess])
{
Expand Down Expand Up @@ -1658,7 +1710,7 @@ - (NSString *) forwardEnabled
// - forceDefaultIdentity => SOGoMailForceDefaultIdentity
// - receipts.receiptAction => SOGoMailReceiptAllow
// - receipts.receiptNonRecipientAction => SOGoMailReceiptNonRecipientAction
// - receipts.receiptOutsideDomainAction => SOGoMailReceiptOutsideDomainAction
// - receipts.receiptOutsideDomaforwardAddressinAction => SOGoMailReceiptOutsideDomainAction
// - receipts.receiptAnyAction => SOGoMailReceiptAnyAction
// - security.alwaysSign => SOGoMailCertificateAlwaysSign
// - security.alwaysEncrypt => SOGoMailCertificateAlwaysEncrypt
Expand Down
7 changes: 7 additions & 0 deletions UI/WebServerResources/js/Preferences/PreferencesController.js
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,13 @@
$window.forwardConstraintsDomains.indexOf(domain) < 0) {
throw new Error(l("You are not allowed to forward your messages to this domain:") + " " + domain);
}
else if ($window.forwardConstraints == 3 &&
domains.indexOf(domain) < 0 &&
($window.forwardConstraintsDomains.length > 0 &&
$window.forwardConstraintsDomains.indexOf(domain) < 0)) {
// If constraints mode is 3 and the domain is not an internal nor in forwardConstraintsDomains list, throw an error
throw new Error(l("You are not allowed to forward your messages to this domain:")+ " " + domain);
}
}

return true;
Expand Down

0 comments on commit c872fb4

Please sign in to comment.