mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-04-14 09:48:51 +00:00
Merge branch 'master' into feature-5726-gab-autocomplete
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -65,6 +65,7 @@
|
||||
- (id) objectFromJSONString;
|
||||
|
||||
/* bare email addresses */
|
||||
- (NSString *) mailDomain;
|
||||
- (NSString *) pureEMailAddress;
|
||||
|
||||
- (NSString *) asQPSubjectString: (NSString *) encoding;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -123,6 +123,7 @@
|
||||
SOGoTemplatesFolderName = "Templates";
|
||||
SOGoMailComposeMessageType = "html";
|
||||
SOGoMailComposeFontSize = "0";
|
||||
SOGoMailHideInlineAttachments = NO;
|
||||
SOGoMailDisplayRemoteInlineImages = "never";
|
||||
SOGoMailCertificateEnabled = YES;
|
||||
|
||||
|
||||
@@ -217,7 +217,7 @@
|
||||
|
||||
v = [self integerForKey: @"SOGoForwardConstraints"];
|
||||
|
||||
return (v > 2 ? 0 : v);
|
||||
return (v > 3 ? 0 : v);
|
||||
}
|
||||
|
||||
- (NSArray *) forwardConstraintsDomains
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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"];
|
||||
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user