Merge branch 'master' into feature-5726-gab-autocomplete

This commit is contained in:
smizrahi
2023-11-27 11:18:31 +01:00
16 changed files with 173 additions and 39 deletions

View File

@@ -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");
@@ -3513,13 +3515,12 @@ without activity for specified number of minutes. Those users will have to log i
sogo-tool expire-sessions [nbMinutes]
* *nbMinutes* Integer, number of minutes. All session without activity in these last minutes will be removed.
* _*Warning*_ Putting anything other that a number will be count as 0 minutes...
Example:
----
sogo-tool expire-sessions #Will print usage.
sogo-tool expire-sessions 160 #Will remove session which last activity is older than 160 minutes.
sogo-tool expire-sessions --help #Will remove session which last activity is older than 0 minutes.
sogo-tool expire-sessions 0 #Will remove session which last activity is older than 0 minutes.
----
sogo-tool manage-acl

View File

@@ -72,8 +72,14 @@
- (void) setEndDate: (NSCalendarDate *) newEndDate
{
CardElement *c;
[(iCalDateTime *) [self uniqueChildWithTag: @"dtend"]
setDateTime: newEndDate];
c = [self uniqueChildWithTag: @"duration"];
if (c)
[self removeChild: c];
}
- (NSCalendarDate *) endDate

View File

@@ -44,10 +44,11 @@
{
NSMutableArray *ranges;
NSArray *byMonth;
NSCalendarDate *firStart, *lastDate, *rStart, *rEnd, *until, *referenceDate;
NSCalendarDate *firStart, *lastDate, *rStart, *rEnd, *until, *referenceDate, *rTemp;
NSInteger *hoursOfOffset;
iCalMonthlyRecurrenceCalculator *monthlyCalc;
unsigned j, yearIdxInRange, numberOfYearsInRange, count, interval, monthDiff;
int diff, repeatCount, currentMonth;
int diff, repeatCount, currentMonth, origNbDaysInMonth;
firStart = [firstRange startDate];
rStart = [_r startDate];
@@ -186,18 +187,31 @@
days: 0];
//Due to the bug with dateByAddingYears, we have to take off one day (see line 133)
rStart = [NSCalendarDate dateWithYear: [rStart yearOfCommonEra]
month: [rStart monthOfYear]
day: 0
hour: [rStart hourOfDay]
minute: [rStart minuteOfHour]
second: 0
timeZone: [rStart timeZone]];
//Due to the bug with dateByAddingYears, we may take the previous day (see line 133)
hoursOfOffset = [rStart hourOfDay];
origNbDaysInMonth = [rStart numberOfDaysInMonth];
if(hoursOfOffset > 12) {
//If rStart is 1st 22:00, we should start at the previous day 22:00
rTemp = [NSCalendarDate dateWithYear: [rStart yearOfCommonEra]
month: 1+([rStart monthOfYear]-2)%12
day: 1
hour: [rStart hourOfDay]
minute: [rStart minuteOfHour]
second: 0
timeZone: [rStart timeZone]];
rStart = [NSCalendarDate dateWithYear: [rStart yearOfCommonEra]
month: 1+([rStart monthOfYear]-2)%12
day: [rTemp numberOfDaysInMonth]
hour: [rStart hourOfDay]
minute: [rStart minuteOfHour]
second: 0
timeZone: [rStart timeZone]];
}
rEnd = [rStart dateByAddingYears: 0
months: 0
days: [rStart numberOfDaysInMonth]];
days: origNbDaysInMonth];
rangeForMonth = [NGCalendarDateRange calendarDateRangeWithStartDate: rStart

View File

@@ -418,7 +418,7 @@ convention:
[self setCategories: [o componentsSeparatedByString: @","]];
// Photo
if ([ldifRecord objectForKey: @"photo"])
if ([ldifRecord objectForKey: @"photo"] && [ldifRecord objectForKey: @"photo"] != [NSNull null])
[self setPhoto: [[ldifRecord objectForKey: @"photo"] stringByEncodingBase64]];
[self cleanupEmptyChildren];

View File

@@ -65,6 +65,7 @@
- (id) objectFromJSONString;
/* bare email addresses */
- (NSString *) mailDomain;
- (NSString *) pureEMailAddress;
- (NSString *) asQPSubjectString: (NSString *) encoding;

View File

@@ -609,6 +609,18 @@ static int cssEscapingCount;
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;

View File

@@ -123,6 +123,7 @@
SOGoTemplatesFolderName = "Templates";
SOGoMailComposeMessageType = "html";
SOGoMailComposeFontSize = "0";
SOGoMailHideInlineAttachments = NO;
SOGoMailDisplayRemoteInlineImages = "never";
SOGoMailCertificateEnabled = YES;

View File

@@ -217,7 +217,7 @@
v = [self integerForKey: @"SOGoForwardConstraints"];
return (v > 2 ? 0 : v);
return (v > 3 ? 0 : v);
}
- (NSArray *) forwardConstraintsDomains

View File

@@ -739,7 +739,8 @@ static NSArray *childRecordFields = nil;
qualifier = aclQualifier;
// For Thunderbird, disable contact list
if ([[context request] isThunderbird]) {
// This will be removed when VCARD will be implemented
if ([[context request] isThunderbird] && [self isKindOfClass: NSClassFromString(@"SOGoContactGCSFolder")]) {
vlistExclusionQualifier = [EOQualifier qualifierWithQualifierFormat: @"c_component != 'vlist'"];
qualifier = [[[EOAndQualifier alloc] initWithQualifiers:
vlistExclusionQualifier,
@@ -1191,7 +1192,8 @@ static NSArray *childRecordFields = nil;
folder = [self ocsFolder];
// For Thunderbird, disable contact list
if ([[context request] isThunderbird]) {
// This will be removed when VCARD will be implemented
if ([[context request] isThunderbird] && [self isKindOfClass: NSClassFromString(@"SOGoContactGCSFolder")]) {
vlistExclusionQualifier = [EOQualifier qualifierWithQualifierFormat: @"c_component != 'vlist'"];
qualifier = [[[EOAndQualifier alloc] initWithQualifiers:
vlistExclusionQualifier,

View File

@@ -140,7 +140,12 @@
NSLog(@"Remove all sessions older than %d min", sessionExpireMinutes);
if (sessionExpireMinutes >= 0)
if (sessionExpireMinutes == 0 && ![[arguments objectAtIndex: 0] isEqualToString:@"0"])
{
//If the input is not a number intValue return 0 so we check that's really the case
[self usage];
}
else if (sessionExpireMinutes >= 0)
{
rc = [self expireUserSessionOlderThan: sessionExpireMinutes];
}

View File

@@ -314,24 +314,54 @@
return [[[self message] valueForKey:@"uid"] stringValue];
}
- (BOOL) parseParts: (NSArray *) parts hasAttachment:(BOOL) hasAttachment {
NSEnumerator *part;
NSDictionary *currentPart;
SOGoUserDefaults *ud;
BOOL isInline;
ud = [[[self context] activeUser] userDefaults];
if ([parts count] > 1)
{
part = [parts objectEnumerator];
while (!hasAttachment
&& (currentPart = [part nextObject])) {
if ([currentPart objectForKey: @"type"] && ![[[currentPart objectForKey: @"type"] uppercaseString] hasPrefix: @"MULTIPART"]) {
isInline = currentPart && [currentPart objectForKey:@"disposition"]
&& [[currentPart objectForKey:@"disposition"] objectForKey:@"type"]
&& [[[[currentPart objectForKey:@"disposition"] objectForKey:@"type"] uppercaseString] isEqualToString:@"INLINE"];
if (![ud hideInlineAttachments] || ([ud hideInlineAttachments] && !isInline)) {
hasAttachment = (([currentPart objectForKey:@"disposition"]
&& [[[currentPart objectForKey:@"disposition"] allKeys] length] > 0)
|| ([currentPart objectForKey:@"parameterList"]
&& [[currentPart objectForKey:@"parameterList"] objectForKey:@"name"]
));
}
} else if ([currentPart objectForKey:@"parts"]) {
hasAttachment = [self parseParts: [currentPart objectForKey:@"parts"] hasAttachment: hasAttachment];
}
}
}
return hasAttachment;
}
- (BOOL) hasMessageAttachment
{
NSArray *parts;
NSEnumerator *dispositions;
NSDictionary *currentDisp;
BOOL hasAttachment;
hasAttachment = NO;
parts = [[message objectForKey: @"bodystructure"] objectForKey: @"parts"];
if ([parts count] > 1)
{
dispositions = [[parts objectsForKey: @"disposition"
notFoundMarker: nil] objectEnumerator];
while (!hasAttachment
&& (currentDisp = [dispositions nextObject]))
hasAttachment = ([[currentDisp objectForKey: @"type"] length]);
}
NS_DURING
{
hasAttachment = [self parseParts: [[message objectForKey: @"bodystructure"] objectForKey: @"parts"] hasAttachment:hasAttachment];
}
NS_HANDLER
{
[self logWithFormat: @"Error while parsing attachements for rendering bracket"];
}
NS_ENDHANDLER;
return hasAttachment;
}

View File

@@ -368,6 +368,9 @@ static SoProduct *preferencesProduct = nil;
if ([[defaults source] objectForKey: @"SOGoMailAutoMarkAsReadDelay"] == nil)
[[defaults source] setObject: [NSNumber numberWithInt: [defaults mailAutoMarkAsReadDelay]] forKey: @"SOGoMailAutoMarkAsReadDelay"];
if ([[defaults source] objectForKey: @"SOGoMailHideInlineAttachments"] == nil)
[[defaults source] setObject: [NSNumber numberWithBool: [defaults hideInlineAttachments]] forKey: @"SOGoMailHideInlineAttachments"];
if (![[defaults source] objectForKey: @"SOGoMailAutoSave"])
[[defaults source] setObject: [defaults mailAutoSave] forKey: @"SOGoMailAutoSave"];

View File

@@ -1532,6 +1532,44 @@ static NSArray *reminderValues = nil;
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
@@ -1561,8 +1599,8 @@ static NSArray *reminderValues = nil;
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;
@@ -1600,6 +1638,20 @@ static NSArray *reminderValues = nil;
[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])
{
@@ -1658,7 +1710,7 @@ static NSArray *reminderValues = nil;
// - forceDefaultIdentity => SOGoMailForceDefaultIdentity
// - receipts.receiptAction => SOGoMailReceiptAllow
// - receipts.receiptNonRecipientAction => SOGoMailReceiptNonRecipientAction
// - receipts.receiptOutsideDomainAction => SOGoMailReceiptOutsideDomainAction
// - receipts.receiptOutsideDomaforwardAddressinAction => SOGoMailReceiptOutsideDomainAction
// - receipts.receiptAnyAction => SOGoMailReceiptAnyAction
// - security.alwaysSign => SOGoMailCertificateAlwaysSign
// - security.alwaysEncrypt => SOGoMailCertificateAlwaysEncrypt

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

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