Compare commits

..
3 Commits
Author SHA1 Message Date
Hivert Quentin 99b76ec9ca again 2025-03-26 10:42:39 +01:00
Hivert Quentin 5d0ee3f49b cast correct type 2025-03-26 09:59:47 +01:00
Hivert Quentin ecfc54a0af add logs 2025-03-26 09:26:35 +01:00
119 changed files with 352 additions and 51421 deletions

No files matched your search

-1
View File
@@ -10,7 +10,6 @@
*/obj/
.scss-lint-config.yml_
ActiveSync/ActiveSync.SOGo
API/API.SOGo
Documentation/*.docbook
Documentation/*.pdf
Documentation/*.html
+1 -1
View File
@@ -1,3 +1,3 @@
[submodule "UI/WebServerResources/angular-material"]
path = UI/WebServerResources/angular-material
url = https://github.com/Alinto/material.git
url = https://github.com/angular/material
-28
View File
@@ -1,28 +0,0 @@
# GNUstep makefile
include common.make
BUNDLE_NAME = API
API_PRINCIPAL_CLASS = SOGoAPIProduct
API_OBJC_FILES = \
SOGoAPIProduct.m \
SOGoAPI.m \
SOGoAPIVersion.m \
SOGoAPIUserFolder.m \
SOGoAPIDispatcher.m
API_RESOURCE_FILES += \
product.plist
API_LANGUAGES = $(SOGO_LANGUAGES)
API_LOCALIZED_RESOURCE_FILES = Localizable.strings
ADDITIONAL_INCLUDE_DIRS += -I../SOPE/ -I../SoObjects/
-include GNUmakefile.preamble
include $(GNUSTEP_MAKEFILES)/bundle.make
-include GNUmakefile.postamble
-16
View File
@@ -1,16 +0,0 @@
# compile settings
ADDITIONAL_CPPFLAGS += \
-DSOGO_MAJOR_VERSION=$(MAJOR_VERSION) \
-DSOGO_MINOR_VERSION=$(MINOR_VERSION) \
-DSOGO_PATCH_VERSION=$(SUBMINOR_VERSION) \
-DSOGO_LIBDIR="@\"$(SOGO_LIBDIR)\""
ADDITIONAL_INCLUDE_DIRS += \
-D_GNU_SOURCE -I../SOPE/ -I../SoObjects/
ADDITIONAL_LIB_DIRS += \
-L../SoObjects/SOGo/SOGo.framework/sogo -lSOGo \
-L../SOPE/GDLContentStore/$(GNUSTEP_OBJ_DIR)/ -lGDLContentStore \
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ -lNGCards \
-lEOControl -lNGStreams -lNGMime -lNGExtensions -lNGObjWeb -lWEExtensions
-35
View File
@@ -1,35 +0,0 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of SOPE.
SOPE is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with SOPE; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#import <Foundation/Foundation.h>
#import <Foundation/NSObject.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSArray.h>
@class WOContext;
@interface SOGoAPI : NSObject
- (NSArray *) methodAllowed;
- (BOOL) needAuth;
- (NSArray *) paramNeeded;
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param;
@end
-52
View File
@@ -1,52 +0,0 @@
/*
Copyright (C) todo...
*/
#import <SOGoAPI.h>
@implementation SOGoAPI
- (id) init
{
[super init];
return self;
}
- (void) dealloc
{
[super dealloc];
}
- (NSArray *) methodAllowed
{
NSArray *result;
result = [NSArray arrayWithObjects:@"GET",nil];
return result;
}
- (BOOL) needAuth
{
return YES;
}
- (NSArray *) paramNeeded
{
return nil;
}
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param
{
NSDictionary* result;
result = [[NSDictionary alloc] initWithObjectsAndKeys:
@"API not defined", @"error",
nil];
[result autorelease];
return result;
}
@end /* SOGoAPI */
View File
Whitespace-only changes.
-54
View File
@@ -1,54 +0,0 @@
/*
Copyright (c) 2014-2015, Inverse inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Inverse inc. nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#import <Foundation/NSObject.h>
#import <SOGo/WORequest+SOGo.h>
#import <SOGo/WOResponse+SOGo.h>
@class NSCalendarDate;
@class NSException;
@class NSMutableDictionary;
@class NSURL;
@class NSNumber;
static volatile BOOL apiShouldTerminate = NO;
@interface SOGoAPIDispatcher : NSObject
{
id context;
BOOL debugOn;
}
- (NSException *) dispatchRequest: (WORequest*) theRequest
inResponse: (WOResponse*) theResponse
context: (id) theContext;
@end
-399
View File
@@ -1,399 +0,0 @@
/*
Copyright (c) 2014, Inverse inc.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Inverse inc. nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "SOGoAPIDispatcher.h"
#import <Foundation/NSAutoreleasePool.h>
#import <NGObjWeb/NSException+HTTP.h>
#import <NGObjWeb/WOContext+SoObjects.h>
#import <NGObjWeb/WOCoreApplication.h>
#import <NGExtensions/NSObject+Logs.h>
#import <NGExtensions/NSString+misc.h>
#import <NGExtensions/NSString+Encoding.h>
#import <SOGo/SOGoSystemDefaults.h>
#import <SOGo/SOGoUser.h>
#import <SOGo/SOGoUserManager.h>
#import <SOGo/NSString+Utilities.h>
#import <SOGo/WORequest+SOGo.h>
#import <SOGo/WOResponse+SOGo.h>
#import <SOGo/NSArray+Utilities.h>
#import <SOGo/NSString+Utilities.h>
#import <SOGo/SOGoOpenIdSession.h>
void handle_api_terminate(int signum)
{
NSLog(@"Forcing termination of API loop.");
apiShouldTerminate = YES;
[[WOCoreApplication application] terminateAfterTimeInterval: 1];
}
@implementation SOGoAPIDispatcher
- (id) init
{
[super init];
debugOn = [[SOGoSystemDefaults sharedSystemDefaults] apiDebugEnabled];
apiShouldTerminate = NO;
signal(SIGTERM, handle_api_terminate);
return self;
}
- (void) dealloc
{
[super dealloc];
}
- (void) _sendAPIErrorResponse: (WOResponse* ) response
withMessage: (NSString *) message
withStatus: (unsigned int) status
{
NSDictionary *msg;
msg = [[NSDictionary alloc] initWithObjectsAndKeys:
message, @"error",
nil];
[response setStatus: status];
[response setContent: [msg jsonRepresentation]];
}
- (NSString *) _getActionFromUri: (NSString *) _uri
{
/*
_uri always start with /SOGo/SOGoAPI
full _uri example /SOGo/SOGoAPI/Action/subaction1?param1&param2
*/
NSString *uriWithoutParams, *action, *prefix;
NSArray *uriSplits;
prefix = @"/SOGo/SOGoAPI";
action = @"";
uriWithoutParams = [_uri urlWithoutParameters];
if(![uriWithoutParams hasPrefix: prefix])
{
[self errorWithFormat: @"Uri for API request does not start with /SOGo/SOGoAPI: %@", uriWithoutParams];
return nil;
}
else
{
uriWithoutParams = [uriWithoutParams substringFromIndex:[prefix length]];
}
//remove first and last '/'' if needed
if([uriWithoutParams hasPrefix: @"/"])
{
uriWithoutParams = [uriWithoutParams substringFromIndex:1];
}
if([uriWithoutParams hasSuffix: @"/"])
{
uriWithoutParams = [uriWithoutParams substringToIndex:([uriWithoutParams length] -1)];
}
if([uriWithoutParams length] == 0)
{
[self warnWithFormat: @"Uri for API request has no action, make Version instead: %@", uriWithoutParams];
return @"SOGoAPIVersion";
}
else
{
uriSplits = [uriWithoutParams componentsSeparatedByString: @"/"];
action = [@"SOGoAPI" stringByAppendingString: [uriSplits objectAtIndex: 0]];
if(debugOn)
[self logWithFormat: @"API request, action made is %@", action];
}
return action;
}
- (NSDictionary *) _authBasicCheck: (NSString *) auth
{
NSDictionary *user;
NSRange rng;
NSString *decodeCred, *domain, *login, *pwd;
SOGoUserManager *lm;
SOGoPasswordPolicyError perr;
int expire, grace;
BOOL rc;
user = nil;
decodeCred = [[auth substringFromIndex:5] stringByTrimmingLeadWhiteSpaces];
decodeCred = [decodeCred stringByDecodingBase64];
rng = [decodeCred rangeOfString:@":"];
login = [decodeCred substringToIndex:rng.location];
pwd = [decodeCred substringFromIndex:(rng.location + rng.length)];
domain = nil;
perr = PolicyNoError;
rc = ([[SOGoUserManager sharedUserManager]
checkLogin: [login stringByReplacingString: @"%40"
withString: @"@"]
password: pwd
domain: &domain
perr: &perr
expire: &expire
grace: &grace
additionalInfo: nil]
&& perr == PolicyNoError);
if(rc)
{
//Fecth user info
lm = [SOGoUserManager sharedUserManager];
user = [lm contactInfosForUserWithUIDorEmail: login];
}
else
user = nil;
return user;
}
- (NSDictionary *) _authOpenId: (NSString *) auth withDomain: (NSString *) domain
{
NSDictionary *user;
NSString *token, *login;
SOGoOpenIdSession *openIdSession;
SOGoUserManager *lm;
user = nil;
token = [[auth substringFromIndex:6] stringByTrimmingLeadWhiteSpaces];
openIdSession = [SOGoOpenIdSession OpenIdSession: domain];
if(![openIdSession sessionIsOk])
{
[self errorWithFormat: @"API - OpenId server not found or has unexpected behavior, contact your admin."];
return nil;
}
[openIdSession setAccessToken: token];
login = [openIdSession login: @""];
if(login && ![login isEqualToString: @"anonymous"])
{
//Fecth user info
lm = [SOGoUserManager sharedUserManager];
user = [lm contactInfosForUserWithUIDorEmail: login];
}
else
user = nil;
return user;
}
- (NSException *) dispatchRequest: (WORequest*) theRequest
inResponse: (WOResponse*) theResponse
context: (id) theContext
{
NSAutoreleasePool *pool;
id activeUser;
NSString *method, *action, *error;
NSDictionary *form;
NSArray *paramNeeded;
NSMutableDictionary *paramInjected, *ret;
NSBundle *bundle;
id classAction;
Class clazz;
pool = [[NSAutoreleasePool alloc] init];
ASSIGN(context, theContext);
//Get the api action, check it
action = [self _getActionFromUri: [theRequest uri]];
if(!action)
{
error = [NSString stringWithFormat: @"No actions found for request to API: %@", [theRequest uri]];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 400];
RELEASE(context);
RELEASE(pool);
return nil;
}
//Get the class for this action, check it
bundle = [NSBundle bundleForClass: NSClassFromString(@"SOGoAPIProduct")];
clazz = [bundle classNamed: action];
if(!clazz)
{
error = [NSString stringWithFormat: @"No backend API found for action: %@", action];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 400];
RELEASE(context);
RELEASE(pool);
return nil;
}
//try to instantiate the class
NS_DURING
{
classAction = [[clazz alloc] init];
}
NS_HANDLER
{
error = [NSString stringWithFormat: @"Can't alloc and init class: %@", classAction];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 500];
RELEASE(context);
RELEASE(pool);
return nil;
}
NS_ENDHANDLER;
//Check method
method = [theRequest method];
if(![[classAction methodAllowed] containsObject: method])
{
error = [NSString stringWithFormat: @"Method %@ not allowed for action %@", method, action];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 400];
RELEASE(context);
RELEASE(pool);
return nil;
}
paramInjected = [NSMutableDictionary dictionary];
//Check parameters
if((paramNeeded = [classAction paramNeeded]) && [paramNeeded count] >= 1)
{
NSDictionary* formAndQuery = [theRequest formValues];
for(NSString *param in paramNeeded)
{
id value;
if((value = [formAndQuery objectForKey: param]))
{
NSString* trueValue;
if ([value isKindOfClass: [NSArray class]])
trueValue = [value lastObject];
else
trueValue = value;
[paramInjected setObject: trueValue forKey: param];
}
else
{
error = [NSString stringWithFormat: @"Missing param %@ for action %@", param, action];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 400];
RELEASE(context);
RELEASE(pool);
return nil;
}
}
}
if([classAction needAuth])
{
if(debugOn)
[self logWithFormat: @"Check auth for action %@", action];
//check auth
NSString *auth = [theRequest headerForKey: @"authorization"];
if(auth)
{
NSDictionary* user;
if([[auth lowercaseString] hasPrefix: @"basic"])
{
//basic auth
user = [self _authBasicCheck: auth];
}
else if([[auth lowercaseString] hasPrefix: @"bearer"])
{
//openid auth, we may need to know the user-domain to know which openid server to fetch
NSString *domain = [theRequest headerForKey: @"user-domain"];
user = [self _authOpenId: auth withDomain: domain];
}
else
{
error = [NSString stringWithFormat: @"Authorization method incorrect: %@ for action %@", auth, action];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 401];
RELEASE(context);
RELEASE(pool);
return nil;
}
//add current user in paramInjected
if(user){
if(debugOn)
[self logWithFormat: @"User authenticated %@", user];
[paramInjected setObject: user forKey: @"user"];
}
else
{
error = [NSString stringWithFormat: @"User wrong login or not found for action %@", action];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 401];
RELEASE(context);
RELEASE(pool);
return nil;
}
}
else
{
error = [NSString stringWithFormat: @"No authorization header found for action %@", action];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 401];
RELEASE(context);
RELEASE(pool);
return nil;
}
}
//Execute action
NS_DURING
{
ret = [classAction action: context withParam: paramInjected];
}
NS_HANDLER
{
error = [NSString stringWithFormat: @"Internal error during: %@", action];
[self errorWithFormat: error];
[self _sendAPIErrorResponse: theResponse withMessage: error withStatus: 500];
RELEASE(context);
RELEASE(pool);
return nil;
}
NS_ENDHANDLER;
//Make the response
[theResponse setContent: [ret jsonRepresentation]];
RELEASE(context);
RELEASE(pool);
return nil;
}
@end
-11
View File
@@ -1,11 +0,0 @@
/*
Copyright (C) todo...
*/
#import <Foundation/NSObject.h>
@interface SOGoAPIProduct : NSObject
@end
@implementation SOGoAPIProduct
@end /* SOGoAPIProduct */
-33
View File
@@ -1,33 +0,0 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of SOPE.
SOPE is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with SOPE; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#import <Foundation/Foundation.h>
#import <Foundation/NSObject.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSArray.h>
#import <SOGoAPI.h>
@class WOContext;
@interface SOGoAPIUserFolder : SOGoAPI
- (NSArray *) methodAllowed;
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param;
@end
-110
View File
@@ -1,110 +0,0 @@
/*
Copyright (C) todo...
*/
#import <SOGoAPIUserFolder.h>
#import <GDLContentStore/GCSFolderManager.h>
#import <GDLContentStore/GCSFolder.h>
@implementation SOGoAPIUserFolder
- (id) init
{
[super init];
return self;
}
- (void) dealloc
{
[super dealloc];
}
/**
{
"calendar":[
{
"name":"DidyShared",
"url":"http://127.0.0.1/SOGo/dav/sogo-tests1@example.org/Calendar/12509-67F67D00-1-3105AF40"
},
{
"name":"LocalDidy",
"url":"http://127.0.0.1/SOGo/dav/sogo-tests1@example.org/Calendar/1BC38-67B60000-1-6E4B6880"
},
{
"name":"Personal Calendar",
"url":"http://127.0.0.1/SOGo/dav/sogo-tests1@example.org/Calendar/personal"
}
],
"username":"sogo-tests1@example.org",
"contact":[
{
"name":"Personal Address Book",
"url":"http://127.0.0.1/SOGo/dav/sogo-tests1@example.org/Contacts/personal"
}
]
}
**/
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param
{
NSDictionary* result;
NSArray *folders;
NSMutableArray *cardavLinks, *caldavLinks;
NSString *serverUrl, *basePath, *c_uid, *url;
GCSFolderManager *fm;
GCSFolder *folder;
int max, i;
//Should be a user
c_uid = [[[param objectForKey: @"user"] objectForKey: @"emails"] objectAtIndex: 0];
//fetch folders
fm = [GCSFolderManager defaultFolderManager];
basePath = [NSString stringWithFormat: @"/Users/%@", c_uid];
folders = [fm listSubFoldersAndNamesAtPath: basePath recursive: YES];
//Generate dav link
max = [folders count];
serverUrl = [[ctx serverURL] absoluteString];
cardavLinks = [NSMutableArray array];
caldavLinks = [NSMutableArray array];
serverUrl = [[ctx serverURL] absoluteString];
for (i = 0; i < max; i++)
{
NSMutableDictionary *folderRet;
folderRet = [NSMutableDictionary dictionary];
folder = [folders objectAtIndex: i];
url = [NSString stringWithFormat: @"%@/SOGo/dav/%@/%@", serverUrl, c_uid, [folder objectForKey: @"path"]];
[folderRet setObject: url forKey: @"url"];
[folderRet setObject: [folder objectForKey: @"name"] forKey: @"name"];
if([url rangeOfString:@"/Calendar/"].location == NSNotFound)
{
//Contacts
[cardavLinks addObject: folderRet];
}
else
{
//Calendar
[caldavLinks addObject: folderRet];
}
}
result = [[NSDictionary alloc] initWithObjectsAndKeys:
c_uid, @"username",
cardavLinks, @"contact",
caldavLinks, @"calendar",
nil];
[result autorelease];
return result;
}
@end /* SOGoAPIVersion */
-33
View File
@@ -1,33 +0,0 @@
/*
Copyright (C) 2004-2005 SKYRIX Software AG
This file is part of SOPE.
SOPE is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with SOPE; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#import <Foundation/Foundation.h>
#import <Foundation/NSObject.h>
#import <Foundation/NSDictionary.h>
#import <Foundation/NSArray.h>
#import <SOGoAPI.h>
@class WOContext;
@interface SOGoAPIVersion : SOGoAPI
- (NSArray *) methodAllowed;
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param;
@end
-42
View File
@@ -1,42 +0,0 @@
/*
Copyright (C) todo...
*/
#import <SOGoAPIVersion.h>
@implementation SOGoAPIVersion
- (id) init
{
[super init];
return self;
}
- (void) dealloc
{
[super dealloc];
}
- (BOOL) needAuth
{
return NO;
}
- (NSDictionary *) action: (WOContext*) ctx withParam: (NSDictionary *) param
{
NSDictionary* result;
result = [[NSDictionary alloc] initWithObjectsAndKeys:
[NSNumber numberWithInt:SOGO_MAJOR_VERSION], @"major",
[NSNumber numberWithInt:SOGO_MINOR_VERSION], @"minor",
[NSNumber numberWithInt:SOGO_PATCH_VERSION], @"patch",
nil];
[result autorelease];
return result;
}
@end /* SOGoAPIVersion */
-34
View File
@@ -1,34 +0,0 @@
include ../config.make
include $(GNUSTEP_MAKEFILES)/common.make
include ../Version
NEEDS_GUI=no
BUNDLE_EXTENSION = .SOGo
BUNDLE_INSTALL_DIR = $(SOGO_LIBDIR)
WOBUNDLE_EXTENSION = $(BUNDLE_EXTENSION)
WOBUNDLE_INSTALL_DIR = $(BUNDLE_INSTALL_DIR)
# SYSTEM_LIB_DIR += -L/usr/local/lib -L/usr/lib
ADDITIONAL_INCLUDE_DIRS += \
-I.. \
-I../.. \
-I../../SOPE
ADDITIONAL_LIB_DIRS += \
-L../SoObjects/SOGo/SOGo.framework/Versions/Current/sogo \
-L../SoObjects/SOGo/$(GNUSTEP_OBJ_DIR)/ \
-L../SOPE/NGCards/$(GNUSTEP_OBJ_DIR)/ \
-L/usr/local/lib \
-Wl,-rpath,$(SOGO_SYSLIBDIR)/sogo
BUNDLE_LIBS += \
-lSOGo \
-lGDLContentStore \
-lGDLAccess \
-lNGObjWeb \
-lNGCards -lNGMime -lNGLdap \
-lNGStreams -lNGExtensions -lEOControl \
-lDOM -lSaxObjC -lSBJson
ADDITIONAL_BUNDLE_LIBS += $(BUNDLE_LIBS)
-31
View File
@@ -1,31 +0,0 @@
{
requires = ( MAIN, Appointments, Contacts, Mailer );
publicResources = ();
factories = {};
classes = {
SOGoAPI = {
protectedBy = "<public>";
defaultRoles = {
"View" = ( "Authenticated", "PublicUser" );
};
};
};
categories = {
SOGoAPI = {
slots = {
};
methods = {
Version = {
protectedBy = "View";
pageName = "SOGoAPI";
actionName = "sogoVersion";
};
};
};
};
}
+19 -9
View File
@@ -2471,28 +2471,37 @@ void handle_eas_terminate(int signum)
[[o properties] setObject: processIdentifier forKey: @"PingRequest"];
[o save];
NSLog(@"EASLOG: processPing, load defaults");
defaults = [SOGoSystemDefaults sharedSystemDefaults];
defaultInterval = [defaults maximumPingInterval];
internalInterval = [defaults internalSyncInterval];
sleepInterval = (internalInterval < 5) ? 5 : internalInterval;
NSLog(@"EASLOG: processPing, defaults found defaultInterval: %d, internalInterval: %d, sleepInterval: %d", defaultInterval, internalInterval, sleepInterval);
if (theDocumentElement)
{
heartbeatInterval = [[[(id)[theDocumentElement getElementsByTagName: @"HeartbeatInterval"] lastObject] textValue] intValue];
NSLog(@"EASLOG: processPing, heartbeatInterval found in document: %d", heartbeatInterval);
}
else
{
heartbeatInterval = defaultInterval;
NSLog(@"EASLOG: processPing, heartbeatInterval NOT found in document: %d", heartbeatInterval);
}
if (heartbeatInterval > defaultInterval || heartbeatInterval == 0)
{
heartbeatInterval = defaultInterval;
status = 5;
}
{
heartbeatInterval = defaultInterval;
status = 5;
}
else
{
if (heartbeatInterval < internalInterval)
heartbeatInterval = internalInterval;
{
if (heartbeatInterval < internalInterval)
heartbeatInterval = internalInterval;
status = 1;
}
status = 1;
}
NSLog(@"EASLOG: processPing, heartbeatInterval final value: %d", heartbeatInterval);
// We build the list of folders to "ping". When the payload is empty, we use the list
// of "cached" folders.
@@ -2607,6 +2616,7 @@ void handle_eas_terminate(int signum)
{
// We check if we must break the current ping request since an other ping request
// has just arrived.
NSLog(@"EASLOG: processPing, while loop for changes start. total_sleep: %d, internalInterval: %d", total_sleep, internalInterval);
pingRequestInCache = [[self globalMetadataForDevice] objectForKey: @"PingRequest"];
if (pingRequestInCache && ![pingRequestInCache isEqualToString: processIdentifier])
{
-86
View File
@@ -2,92 +2,6 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
## [5.12.2](https://github.com/Alinto/sogo/compare/SOGo-5.12.1...SOGo-5.12.2) (2025-06-25)
### Features
* **api:** add endpoint for caldav/cardav url ([51f1521](https://github.com/Alinto/sogo/commit/51f1521dba2d0ca8bdbadffadb16db26b975f668))
* **openid:** swicth to libcurl for http request ([a782424](https://github.com/Alinto/sogo/commit/a782424a30cfe8e9c6f2769a45bcdd3498679237))
### Bug Fixes
* **api:** add handler for internal error ([dabad1d](https://github.com/Alinto/sogo/commit/dabad1d0cf46263d78558d79d2af9fff528a9a89))
* **calendar:** properly evalute last occurance freebusy ([8766b7c](https://github.com/Alinto/sogo/commit/8766b7c6b32aedf37d7f8f350e461931b253a4fb))
* **openid:** add state in connection flow ([085fc4a](https://github.com/Alinto/sogo/commit/085fc4a9eb7d1e2a0f7b48baa1f09a8ba0d515e1))
* **openid:** allow expires_in param to be null ([9954c36](https://github.com/Alinto/sogo/commit/9954c3607bfda55424f5ac532a1075407235f345))
* **openid:** make end_session_endpoint optional ([c5fb348](https://github.com/Alinto/sogo/commit/c5fb3482e22f1bfc935213e8ed7208becd9bd1f4))
* **password:** put correct regex for special char ([e36d0d2](https://github.com/Alinto/sogo/commit/e36d0d219baed8c7d57af0069fadb8d1bf7df072))
* **session:** allow password/token to be longer than userkey ([516606b](https://github.com/Alinto/sogo/commit/516606baff5674c25da1e76f532ca2a9d7818ec0))
* **sieve:** add requirements for notify when doing a filter ([f53d7b7](https://github.com/Alinto/sogo/commit/f53d7b73db3d87a17a253bf98ee09a80052b3fd8))
* **view:** don't hide the option mailcomposer in small screen ([8a90773](https://github.com/Alinto/sogo/commit/8a907737de336f873047ecdc7d5c8ac07ae9e45b))
### Localization
* **nl:** Update Dutch translations ([031e117](https://github.com/Alinto/sogo/commit/031e117cbacf9d41caff43be19e639dee81b84dc))
* **pt:** Update Portuguese translations ([9649ae3](https://github.com/Alinto/sogo/commit/9649ae345f334d390860b0db70db8c3b621f513e))
* **tr_TR:** Update TurkishTurkey translations ([e9c03d3](https://github.com/Alinto/sogo/commit/e9c03d3cf7e668866ac757f72d87cdc4709c9d33))
## [5.12.1](https://github.com/Alinto/sogo/compare/SOGo-5.12.0...SOGo-5.12.1) (2025-04-30)
### Features
* **calendar:** Make the Jitsi meeting room prefix configurable ([4a68909](https://github.com/Alinto/sogo/commit/4a689090607bc6c4e6385202e9fdaef7308a94fe))
### Bug Fixes
* **calendar:** Fix typo Jisti × Jitsi ([ab9f0c1](https://github.com/Alinto/sogo/commit/ab9f0c1bf1f8930b9cbbf592efe69c68654f35c2))
* **calendar:** properly show the URL property in iCalendar ([eb7f551](https://github.com/Alinto/sogo/commit/eb7f551e88f2c6693354b6c3b617861d4b63a1bb))
* **calendar:** put valarm at the end of vevent block to satisfy outlook.office.com which is too lazy to follow the spec ([148fab9](https://github.com/Alinto/sogo/commit/148fab9409abf703f56ae8ed701547f23d685711))
* **db:** log an error if the table sogo_folder_info is malformed ([3616e56](https://github.com/Alinto/sogo/commit/3616e562894be63fcdb7007b5f172d99f5ff59eb))
* **folder:** fix folders sorting for special folders ([1f8dc12](https://github.com/Alinto/sogo/commit/1f8dc1292924672489a4a1c76f557a9f0bc65662))
* **iOS:** iOS 18.4 encodes caldav url and put %40 instead of @ for username. Fix that. ([9e431d0](https://github.com/Alinto/sogo/commit/9e431d08a273f519ff833b15189d2d3ebef4fc79))
* **ldap:** update baseDN with correct domain if needed ([ca425e6](https://github.com/Alinto/sogo/commit/ca425e6752fd28d68e35cc4c1b7dd6f7b3c43ab4))
* **sieve:** Correctly update default sieve filter for new users ([7c59e6b](https://github.com/Alinto/sogo/commit/7c59e6b3bf4684c2884e5f0bd39009719e5ba1b9))
* **smtp:** fix string type ([788ece4](https://github.com/Alinto/sogo/commit/788ece452b80a0270169178d5e596972797d0906))
* **tnef:** add protection against malformed winmail.dat ([7c6b674](https://github.com/Alinto/sogo/commit/7c6b6743e017effcc0078c9ebc026d628f4b71af))
* **typo:** Fix typo 'attachements' ([#367](https://bugs.sogo.nu/view.php?id=367)) ([4ec3d20](https://github.com/Alinto/sogo/commit/4ec3d2091a8f5c26b4c4463b4fa9c89ef26f63ba))
* **ui:** Change angular material to fix issues with Safari iOS 18+ ([068f1f3](https://github.com/Alinto/sogo/commit/068f1f315498c9bc5a0513e62c7a3fd250d974ad))
* **ui:** Change angular material to fix issues with Safari iOS 18+ ([07c7528](https://github.com/Alinto/sogo/commit/07c75280bb06816562b1fb5747acf8efa39cb4a0))
### Localization
* **ar:** Update Arabic translations ([5c48745](https://github.com/Alinto/sogo/commit/5c48745c94380bfa02f36c751b0389e06d676493))
* **bg_BG:** Update Bulgarian translations ([1d0b6a6](https://github.com/Alinto/sogo/commit/1d0b6a622c30b8f55ac17db0d131992a733d356b))
* **bs_BA:** Update Bosnian translations ([ade923d](https://github.com/Alinto/sogo/commit/ade923d21d409a9bffca609826a630480ea561dc))
* **ca:** Update Catalan translations ([8c4f56c](https://github.com/Alinto/sogo/commit/8c4f56c971002c4e0bb9764c0d7c24fc5cfd3a92))
* **cy:** Update Welsh translations ([54debcf](https://github.com/Alinto/sogo/commit/54debcf47d5896b58917705ff85bada391a26919))
* **es_AR:** Update SpanishArgentina translations ([4b397f6](https://github.com/Alinto/sogo/commit/4b397f68f51f00945cab57bdec77ab5d68e68753))
* **eu:** Update Basque translations ([54f8af3](https://github.com/Alinto/sogo/commit/54f8af30cefe4024d6697a35de25fb1d7896785e))
* **fi:** Update Finnish translations ([aae9e60](https://github.com/Alinto/sogo/commit/aae9e6065fda25803c37a43ca2e067df88aba166))
* **he:** Update Hebrew translations ([f4adf62](https://github.com/Alinto/sogo/commit/f4adf6267d271d91a75d2176424e98862662e9f8))
* **hr_HR:** Update Croatian translations ([961702d](https://github.com/Alinto/sogo/commit/961702de6706531817818063a4a96b40862aa05d))
* **hu:** Update Hungarian translations ([c31b3f4](https://github.com/Alinto/sogo/commit/c31b3f4592c6564c4f372cf4e63c4be3564c75bf))
* **id_ID:** Update Indonesian translations ([5f6168d](https://github.com/Alinto/sogo/commit/5f6168d5365450e40f6e289be694fab5585ba0cc))
* **is:** Update Icelandic translations ([c792ddb](https://github.com/Alinto/sogo/commit/c792ddb601830896cd936e21bb69c17f8d11e705))
* **it:** Update Italian translations ([d7fc5a5](https://github.com/Alinto/sogo/commit/d7fc5a52b8284594a6be4050b6c56cffc0fea472))
* **ja:** Update Japanese translations ([264f94b](https://github.com/Alinto/sogo/commit/264f94b64d5ea1147d45b7040fc5c3c0bc1d368b))
* **kk:** Update Kazakh translations ([1bf955d](https://github.com/Alinto/sogo/commit/1bf955d1930caf920c34be8ffb3e46b47eb0f232))
* **lt:** Update Lithuanian translations ([bbc0491](https://github.com/Alinto/sogo/commit/bbc04913b9a3219cd31cfcfc4b0ec79fbee76713))
* **lv:** Update Latvian translations ([1dcf475](https://github.com/Alinto/sogo/commit/1dcf475d3b0394474950eb73169fcfeab55305cf))
* **mk_MK:** Update Macedonian translations ([1ba83ec](https://github.com/Alinto/sogo/commit/1ba83ec57d7e65f6f28542a89222ec58570d5cef))
* **nl:** Update Dutch translations ([20e7c89](https://github.com/Alinto/sogo/commit/20e7c890dea0a52925b18be2a5ae09ccd4c23dd9))
* **nn_NO:** Update NorwegianNynorsk translations ([828f85c](https://github.com/Alinto/sogo/commit/828f85c7204c86951db4654f2d254a1361ad0d98))
* **ro_RO:** Update Romanian translations ([532b8dc](https://github.com/Alinto/sogo/commit/532b8dc2028b1a1db26566df7baa964daf9bd6b7))
* **sk:** Update Slovak translations ([d3e5a00](https://github.com/Alinto/sogo/commit/d3e5a004dbdd80c6bba405a34dcbbb28819a0fa7))
* **sl_SI:** Update Slovenian translations ([fdb88ab](https://github.com/Alinto/sogo/commit/fdb88abc1251a8763e4c8e5dacf38e3191180fba))
* **sr_ME@latin:** Update Montenegrin translations ([aa6575c](https://github.com/Alinto/sogo/commit/aa6575c42b54b27ca9510ea0f02426a7657ed519))
* **sr@latin:** Update SerbianLatin translations ([9f4440b](https://github.com/Alinto/sogo/commit/9f4440b07f142cc0c68561b4413e56fe5c5322ff))
* **sr:** Update Serbian translations ([3e61a52](https://github.com/Alinto/sogo/commit/3e61a52673092c38ce2f7a32ebd855afab61782a))
* **sv:** Update Swedish translations ([6d8d4f7](https://github.com/Alinto/sogo/commit/6d8d4f7c39fb1c1e9373a9268589b8e6546617ed))
* **zh_CN:** Update ChineseChina translations ([bbd17f5](https://github.com/Alinto/sogo/commit/bbd17f55310e5b2e163eeaaf2cb259ae042f8557))
* **zh_TW:** Update ChineseTaiwan translations ([3ac01f7](https://github.com/Alinto/sogo/commit/3ac01f70516a25f6db65ffa5c03d6d5a833479fe))
## [5.12.0](https://github.com/Alinto/sogo/compare/SOGo-5.11.2...SOGo-5.12.0) (2025-03-24)
+2 -11
View File
@@ -193,9 +193,6 @@ should apply to all supported operating systems.
Software Downloads
~~~~~~~~~~~~~~~~~~
**In order to access the community build, go to https://www.sogo.nu/download.html[SOGo website]
and select "Development (nightly builds)" at the bottom of the page.**
[NOTE]
In order to access the production builds, you need a proper support contract
from https://sogo.nu/support/index_new.html#support-plans[Alinto]. Continue
@@ -493,12 +490,6 @@ the jitsi server used for creating the meeting link.
Defaults to `https://meet.jit.si` when unset.
|D |SOGoCalendarJitsiRoomPrefix
|Only used if SOGoCalendarEnableJitsiLink is set to YES. The string for
the Jitsi room prefix used for creating the meeting link.
Defaults to `SOGo_meeting/` when unset.
|S |SOGoSAML2PrivateKeyLocation
|The location of the SSL private key file on the filesystem that is used
by SOGo to sign and encrypt communications with the SAML2 identity
@@ -1615,7 +1606,7 @@ Defaults to `0` when unset.
|S |SOGoOpenIdLogoutEnabled
|Allow user to end their openId with the webmail. Meaning that will disconnect them from
the others applicaitons as well. The openid server must have a end_session_endpoint.
the others applicaitons as well.
Defaults to `NO` when unset.
|=======================================================================
@@ -2759,7 +2750,7 @@ Defaults to `inline` when unset.
|Show recipients or sender full email in mailboxes if set to `YES`. Default value is `NO`.
|U |SOGoMailHideInlineAttachments
|Hide attachments for inline images if set to `YES`. Default value is `NO`.
|Hide attachements for inline images if set to `YES`. Default value is `NO`.
|U |SOGoMailCustomFullName
-1
View File
@@ -9,7 +9,6 @@ SUBPROJECTS = \
SoObjects \
Main \
UI \
API \
Tools \
Tests/Unit \
+3 -14
View File
@@ -383,12 +383,7 @@ static BOOL debugLeaks;
if([login isEqualToString: @"changeLanguage"])
user = nil;
else
{
//Here the user is expected to be name or name@domain.com
//However iOS 18.4 sanitize the caldav url and put %40 instead of @
login = [login stringByReplacingOccurrencesOfString: @"%40" withString: @"@"];
user = [SOGoUser userWithLogin: login roles: nil];
}
if (user)
userFolder = [$(@"SOGoUserFolder") objectWithName: login
inContainer: self];
@@ -417,7 +412,7 @@ static BOOL debugLeaks;
{
id obj;
WORequest *request;
BOOL isDAVRequest, isAPIRequest;
BOOL isDAVRequest;
SOGoSystemDefaults *sd;
/* put locale info into the context in case it's not there */
@@ -425,14 +420,8 @@ static BOOL debugLeaks;
sd = [SOGoSystemDefaults sharedSystemDefaults];
request = [_ctx request];
isAPIRequest = [[request requestHandlerKey] isEqualToString:@"SOGoAPI"];
isDAVRequest = [[request requestHandlerKey] isEqualToString:@"dav"];
if(isAPIRequest && ![_key isEqualToString:@"SOGo"] && ![_key isEqualToString:@"SOGoAPI"])
{
//The request will be handle by the API Dispatcher
obj = nil;
}
else if (isDAVRequest || [sd isWebAccessEnabled])
if (isDAVRequest || [sd isWebAccessEnabled])
{
if (isDAVRequest)
{
@@ -462,7 +451,7 @@ static BOOL debugLeaks;
{
obj = [self lookupUser: _key inContext: _ctx];
if (!obj && ![_key isEqualToString: @"public"])
obj = [self lookupUser: @"anonymous" inContext: _ctx];
obj = [self lookupUser: @"anonymous" inContext: _ctx];
}
}
}
-1
View File
@@ -76,7 +76,6 @@
- (BOOL)folderExistsAtPath:(NSString *)_path;
- (NSArray *)listSubFoldersAtPath:(NSString *)_path recursive:(BOOL)_flag;
- (NSArray *)listSubFoldersAndNamesAtPath:(NSString *)_path recursive:(BOOL)_recursive;
- (NSDictionary *) recordAtPath: (NSString *) _path;
- (GCSFolder *)folderAtPath:(NSString *)_path;
-87
View File
@@ -598,27 +598,6 @@ static BOOL _singleStoreMode = NO;
return sql;
}
- (NSString *)generateSQLPathAndNameFetchForInternalNames:(NSArray *)_names
exactMatch:(BOOL)_beExact orDirectSubfolderMatch:(BOOL)_directSubs
{
/* fetches the 'path' subset for a given quick-names */
NSMutableString *sql;
NSString *ws;
ws = [self generateSQLWhereForInternalNames:_names
exactMatch:_beExact orDirectSubfolderMatch:_directSubs];
if ([ws length] == 0)
return nil;
sql = [NSMutableString stringWithCapacity:256];
[sql appendString:@"SELECT c_path, c_foldername FROM "];
[sql appendString:[self folderInfoTableName]];
[sql appendString:@" WHERE "];
[sql appendString:ws];
if (debugSQLGen) [self logWithFormat:@"PathFetch-SQL: %@", sql];
return sql;
}
/* handling folder names */
- (BOOL)_isStandardizedPath:(NSString *)_path {
@@ -827,72 +806,6 @@ static BOOL _singleStoreMode = NO;
return result;
}
- (NSArray *)listSubFoldersAndNamesAtPath:(NSString *)_path recursive:(BOOL)_recursive{
NSMutableArray *result;
NSString *fname;
NSArray *fnames, *records;
NSString *sql;
unsigned i, count;
if ((fnames = [self internalNamesFromPath:_path]) == nil) {
[self debugWithFormat:@"got no internal names for path: '%@'", _path];
return nil;
}
sql = [self generateSQLPathAndNameFetchForInternalNames:fnames
exactMatch:NO orDirectSubfolderMatch:(_recursive ? NO : YES)];
if ([sql length] == 0) {
[self debugWithFormat:@"got no SQL for names: %@", fnames];
return nil;
}
if ((records = [self performSQL:sql]) == nil) {
[self logWithFormat:@"ERROR(%s): executing SQL failed: '%@'",
__PRETTY_FUNCTION__, sql];
return nil;
}
if ((count = [records count]) == 0)
return emptyArray;
result = [NSMutableArray arrayWithCapacity:(count > 128 ? 128 : count)];
fname = [self internalNameFromPath:_path];
fname = [fname stringByAppendingString:@"/"]; /* add slash */
for (i = 0; i < count; i++) {
NSDictionary *record, *folderInfo;
NSString *sname, *spath, *foldername;
record = [records objectAtIndex:i];
sname = [record objectForKey:GCSPathRecordName];
if (![sname hasPrefix:fname]) /* does not match at all ... */
continue;
/* strip prefix and following slash */
sname = [sname substringFromIndex:[fname length]];
spath = [self pathPartFromInternalName:sname];
if (_recursive) {
if ([spath length] > 0){
foldername = [record objectForKey: @"c_foldername"];
folderInfo = [NSDictionary dictionaryWithObjectsAndKeys: spath, @"path", foldername, @"name", nil];
[result addObject:folderInfo];
}
}
else {
/* direct children only, so exclude everything with a slash */
if ([sname rangeOfString:@"/"].length == 0 && [spath length] > 0)
{
foldername = [record objectForKey: @"c_foldername"];
folderInfo = [NSDictionary dictionaryWithObjectsAndKeys: spath, @"path", foldername, @"name", nil];
[result addObject:folderInfo];
}
}
}
return result;
}
- (NSDictionary *) recordAtPath: (NSString *) _path
{
NSMutableString *sql;
+1 -1
View File
@@ -303,8 +303,8 @@ static NSString *openIdFolderURLString = nil;
newRecord = [NSDictionary dictionaryWithObjectsAndKeys: _user_session, @"c_user_session",
_old_session, @"c_old_session",
[NSNumber numberWithInt:now], @"c_session_started",
[NSNumber numberWithInt:nowExpire] , @"c_access_token_expires_in",
_refresh_token, @"c_refresh_token",
[NSNumber numberWithInt:nowExpire] , @"c_access_token_expires_in",
[NSNumber numberWithInt:nowRefreshExpire] , @"c_refresh_token_expires_in",
nil];
record = [self recordForSession: _user_session useOldSession: NO];
+3 -3
View File
@@ -218,7 +218,7 @@
@" c_old_session VARCHAR(4096) NULL,"
@" c_session_started INT4 NOT NULL,"
@" c_refresh_token VARCHAR(4096) NULL,"
@" c_access_token_expires_in INT4 NULL,"
@" c_access_token_expires_in INT4 NOT NULL,"
@" c_refresh_token_expires_in INT4 NULL)");
return [NSString stringWithFormat: sqlFolderFormat, tableName];
@@ -379,7 +379,7 @@
@" c_old_session VARCHAR(4096) NULL,"
@" c_session_started INT4 NOT NULL,"
@" c_refresh_token VARCHAR(4096) NULL,"
@" c_access_token_expires_in INT4 NULL,"
@" c_access_token_expires_in INT4 NOT NULL,"
@" c_refresh_token_expires_in INT4 NULL)");
return [NSString stringWithFormat: sqlFolderFormat, tableName];
@@ -540,7 +540,7 @@
@" c_old_session VARCHAR2(4096) NULL,"
@" c_session_started INTEGER NOT NULL,"
@" c_refresh_token VARCHAR2(4096) NULL,"
@" c_access_token_expires_in INTEGER NULL,"
@" c_access_token_expires_in INTEGER NOT NULL,"
@" c_refresh_token_expires_in INTEGER NULL)");
return [NSString stringWithFormat: sqlFolderFormat, tableName];
+9 -14
View File
@@ -55,7 +55,7 @@
- (NSArray *) recurrenceRangesWithinCalendarDateRange: (NGCalendarDateRange *) _r
{
NSMutableArray *ranges;
NSCalendarDate *firStart, *firEnd, *startDate, *endDate, *currentStartDate, *currentEndDate;
NSCalendarDate *firStart, *startDate, *endDate, *currentStartDate, *currentEndDate;
iCalByDayMask *dayMask;
long i, count, repeatCount;
unsigned interval;
@@ -63,7 +63,6 @@
//[self logWithFormat: @"Recurrence rule is %@", rrule];
firStart = [firstRange startDate];
firEnd = [firstRange endDate];
startDate = [_r startDate];
endDate = [_r endDate];
dayMask = nil;
@@ -85,14 +84,13 @@
// If rule is bound, check the bounds
if (![rrule isInfinite])
{
NSCalendarDate *until, *lastStartDate, *lastEndDate;
NSCalendarDate *until, *lastDate;
lastStartDate = nil;
lastEndDate = nil;
lastDate = nil;
until = [rrule untilDate];
if (until)
{
lastStartDate = until;
lastDate = until;
}
else
{
@@ -100,23 +98,20 @@
if (dayMask == nil)
// If there's no day mask, we can compute the date of the last
// occurrence of the recurrent rule.
lastStartDate = [firStart dateByAddingYears: 0 months: 0
days: (interval
* (repeatCount - 1))];
lastEndDate = [firEnd dateByAddingYears: 0 months: 0
lastDate = [firStart dateByAddingYears: 0 months: 0
days: (interval
* (repeatCount - 1))];
}
if (lastStartDate != nil && lastEndDate != nil)
if (lastDate != nil)
{
if ([lastEndDate compare: startDate] == NSOrderedAscending)
if ([lastDate compare: startDate] == NSOrderedAscending)
// Range starts after last occurrence
return nil;
if ([lastStartDate compare: endDate] == NSOrderedAscending)
if ([lastDate compare: endDate] == NSOrderedAscending)
// Range ends after last occurence; adjust end date
endDate = lastStartDate;
endDate = lastDate;
}
}
+9 -14
View File
@@ -185,7 +185,7 @@ static inline unsigned iCalDoWForNSDoW (int dow)
// TODO: check whether this is OK for multiday-events!
NSMutableArray *ranges;
NSTimeZone *timeZone;
NSCalendarDate *eventStartDate, *eventEndDate, *rStart, *rEnd, *untilStart, *untilEnd, *referenceDate;
NSCalendarDate *eventStartDate, *rStart, *rEnd, *until, *referenceDate;
int eventDayOfMonth;
unsigned monthIdxInRange, numberOfMonthsInRange, interval, repeatCount;
int diff, count;
@@ -199,14 +199,12 @@ static inline unsigned iCalDoWForNSDoW (int dow)
iCalByDayMask *byDayMask;
eventStartDate = [firstRange startDate];
eventEndDate = [firstRange endDate];
eventDayOfMonth = [eventStartDate dayOfMonth];
timeZone = [eventStartDate timeZone];
rStart = [_r startDate];
rEnd = [_r endDate];
interval = [rrule repeatInterval];
untilStart = nil;
untilEnd = nil;
until = nil;
repeatCount = [rrule repeatCount];
byMonth = [rrule byMonth];
byMonthDay = [rrule byMonthDay];
@@ -220,27 +218,24 @@ static inline unsigned iCalDoWForNSDoW (int dow)
{
// When there's no BYxxx mask, we can find the date of the last
// occurrence.
untilStart = [eventStartDate dateByAddingYears: 0
until = [eventStartDate dateByAddingYears: 0
months: (interval * (repeatCount - 1))
days: 0];
untilEnd = [eventEndDate dateByAddingYears: 0
months: (interval * (repeatCount - 1))
days: 0];
}
else
{
untilStart = [rrule untilDate];
until = [rrule untilDate];
}
}
if (untilStart != nil)
if (until != nil)
{
if ([untilEnd compare: rStart] == NSOrderedAscending)
if ([until compare: rStart] == NSOrderedAscending)
// Range starts after last occurrence
return nil;
if ([untilStart compare: rEnd] == NSOrderedAscending)
if ([until compare: rEnd] == NSOrderedAscending)
// Range ends after last occurence; adjust end date
rEnd = untilStart;
rEnd = until;
}
if (byMonth && [byMonth count] > 0)
@@ -446,7 +441,7 @@ static inline unsigned iCalDoWForNSDoW (int dow)
start = [cursor dateByAddingYears: 0 months: 0 days: (dom - 1)];
doCont = [self _addInstanceWithStartDate: start
limitDate: untilStart
limitDate: until
limitRange: _r
toArray: ranges];
//NSLog(@"*** MONTHLY [%i/%i] adding %@%@ (count = %i)", dom, numDaysInMonth, start, (doCont?@"":@" .. NOT!"), count);
+9 -14
View File
@@ -64,7 +64,7 @@
- (NSArray *) recurrenceRangesWithinCalendarDateRange: (NGCalendarDateRange *) _r
{
NSMutableArray *ranges;
NSCalendarDate *firStart, *firEnd, *startDate, *endDate, *currentStartDate, *currentEndDate;
NSCalendarDate *firStart, *startDate, *endDate, *currentStartDate, *currentEndDate;
long i, repeatCount, count;
unsigned interval;
iCalByDayMask *dayMask;
@@ -73,7 +73,6 @@
//[self logWithFormat: @"Recurrence rule is %@", rrule];
firStart = [firstRange startDate];
firEnd = [firstRange endDate];
startDate = [_r startDate];
endDate = [_r endDate];
dayMask = nil;
@@ -96,35 +95,31 @@
// If rule is bound, check the bounds
if (![rrule isInfinite])
{
NSCalendarDate *until, *lastStartDate, *lastEndDate;
NSCalendarDate *until, *lastDate;
lastStartDate = nil;
lastEndDate = nil;
lastDate = nil;
until = [rrule untilDate];
if (until)
lastStartDate = until;
lastDate = until;
else
{
repeatCount = [rrule repeatCount];
if (dayMask == nil)
// When there's no BYxxx mask, we can find the date of the last
// occurrence.
lastStartDate = [firStart dateByAddingYears: 0 months: 0
days: (interval
* (repeatCount - 1) * 7)];
lastEndDate = [firEnd dateByAddingYears: 0 months: 0
lastDate = [firStart dateByAddingYears: 0 months: 0
days: (interval
* (repeatCount - 1) * 7)];
}
if (lastStartDate != nil && lastEndDate != nil)
if (lastDate != nil)
{
if ([lastEndDate compare: startDate] == NSOrderedAscending)
if ([lastDate compare: startDate] == NSOrderedAscending)
// Range starts after last occurrence
return nil;
if ([lastStartDate compare: endDate] == NSOrderedAscending)
if ([lastDate compare: endDate] == NSOrderedAscending)
// Range ends after last occurence; adjust end date
endDate = [lastStartDate addTimeInterval: [firstRange duration]];
endDate = [lastDate addTimeInterval: [firstRange duration]];
}
}
+9 -14
View File
@@ -44,14 +44,13 @@
{
NSMutableArray *ranges;
NSArray *byMonth;
NSCalendarDate *firStart, *firEnd, *lastStartDate, *lastEndDate, *rStart, *rEnd, *until, *referenceDate, *rTemp;
NSCalendarDate *firStart, *lastDate, *rStart, *rEnd, *until, *referenceDate, *rTemp;
NSInteger *hoursOfOffset;
iCalMonthlyRecurrenceCalculator *monthlyCalc;
unsigned j, yearIdxInRange, numberOfYearsInRange, count, interval, monthDiff;
int diff, repeatCount, currentMonth, origNbDaysInMonth;
firStart = [firstRange startDate];
firEnd = [firstRange endDate];
rStart = [_r startDate];
rEnd = [_r endDate];
interval = [rrule repeatInterval];
@@ -72,37 +71,33 @@
// If rule is bound, check the bounds
if (![rrule isInfinite])
{
lastStartDate = nil;
lastEndDate = nil;
lastDate = nil;
until = [rrule untilDate];
repeatCount = [rrule repeatCount];
if (until)
{
lastStartDate = until;
lastDate = until;
}
if (repeatCount > 0)
{
if (lastStartDate == nil && ![rrule hasByMask])
if (lastDate == nil && ![rrule hasByMask])
// When there's no BYxxx mask, we can find the date of the last
// occurrence.
lastStartDate = [firStart dateByAddingYears: (interval * (repeatCount - 1))
months: 0
days: 0];
lastEndDate = [firEnd dateByAddingYears: (interval * (repeatCount - 1))
lastDate = [firStart dateByAddingYears: (interval * (repeatCount - 1))
months: 0
days: 0];
referenceDate = firStart;
}
if (lastStartDate != nil)
if (lastDate != nil)
{
if ([lastEndDate compare: rStart] == NSOrderedAscending)
if ([lastDate compare: rStart] == NSOrderedAscending)
// Range starts after last occurrence
return nil;
if ([lastStartDate compare: rEnd] == NSOrderedAscending)
if ([lastDate compare: rEnd] == NSOrderedAscending)
// Range ends after last occurence; adjust end date
rEnd = [lastStartDate addTimeInterval: [firstRange duration]];
rEnd = [lastDate addTimeInterval: [firstRange duration]];
}
}
+1 -1
View File
@@ -170,7 +170,7 @@ CREATE TABLE sogo_opend_id (
c_old_session varchar(4096) DEFAULT '',
c_session_started int(11) NOT NULL,
c_refresh_token varchar(4096) DEFAULT '',
c_access_token_expires_in int(11) DEFAULT '',
c_access_token_expires_in int(11) NOT NULL,
c_refresh_token_expires_in int(11) DEFAULT NULL,
PRIMARY KEY (c_user_session)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC;
@@ -355,12 +355,12 @@ NSNumber *iCalDistantFutureNumber = nil;
if ([o isKindOfClass: [NSArray class]])
[self _setAttendees: o];
// o = [data objectForKey: @"alarm"];
// if ([o isKindOfClass: [NSDictionary class]])
// {
// owner = [data objectForKey: @"owner"];
// [self _setAlarm: o forOwner: owner];
// }
o = [data objectForKey: @"alarm"];
if ([o isKindOfClass: [NSDictionary class]])
{
owner = [data objectForKey: @"owner"];
[self _setAlarm: o forOwner: owner];
}
// Other attributes depend on the client object and therefore are set in [UIxComponentEditor setAttributes:]:
// - organizer & "created-by"
-11
View File
@@ -372,7 +372,6 @@
{
NSCalendarDate *aptStartDate, *aptEndDate, *allDayStartDate;
NSInteger offset, nbrDays;
NSString *owner;
NSTimeZone *timeZone;
iCalDateTime *startDate;
iCalTimeZone *tz;
@@ -455,16 +454,6 @@
}
}
}
//To make an ics conforme with outlook live (bouh), valarm must be the last element of vevent
//Try to set it here
o = [data objectForKey: @"alarm"];
if ([o isKindOfClass: [NSDictionary class]])
{
owner = [data objectForKey: @"owner"];
[self _setAlarm: o forOwner: owner];
}
}
- (iCalTimeZone *) adjustInContext: (WOContext *) context
-5
View File
@@ -291,11 +291,6 @@ unsigned char GetRruleMonthNum(unsigned char a, unsigned char b) {
partName = nil;
data = [self fetchBLOB];
if((int)[data length] < sizeof(DWORD)) {
NSLog(@"TNEF: ERROR try to decode empty data where it should'nt");
return;
}
memcpy(&signature, [data bytes], sizeof(DWORD));
if (TNEFCheckForSignature(signature) == 0)
{
+1 -1
View File
@@ -231,7 +231,7 @@ endif
ADDITIONAL_TOOL_LIBS += -Lobj -lSOGo$(LIBRARY_NAME_SUFFIX)
ADDITIONAL_INCLUDE_DIRS += -I../../SOPE/
ADDITIONAL_LIB_DIRS += -L../../SOPE/GDLContentStore/obj/
ADDITIONAL_LDFLAGS += -lmemcached -lzip -lytnef -lcurl
ADDITIONAL_LDFLAGS += -lmemcached -lzip -lytnef
-include GNUmakefile.preamble
ifneq ($(FHS_INSTALL_ROOT),)
-2
View File
@@ -784,8 +784,6 @@ groupObjectClasses: (NSArray *) newGroupObjectClasses
didChange = NO;
[self updateBaseDNFromLogin: login];
NS_DURING
if ([login length] > 0)
{
+1 -2
View File
@@ -78,8 +78,7 @@
- (BOOL) appointmentSendEMailNotifications;
- (BOOL) foldersSendEMailNotifications;
- (NSArray *) calendarDefaultRoles;
- (NSString *) calendarJitsiBaseUrl;
- (NSString *) calendarJitsiRoomPrefix;
- (NSString *) calendarJistiBaseUrl;
- (NSArray *) contactsDefaultRoles;
- (NSArray *) refreshViewIntervals;
- (NSString *) subscriptionFolderFormat;
+1 -11
View File
@@ -169,7 +169,7 @@
return [self stringArrayForKey: @"SOGoCalendarDefaultRoles"];
}
- (NSString *) calendarJitsiBaseUrl
- (NSString *) calendarJistiBaseUrl
{
NSString *jitsiBaseUrl;
jitsiBaseUrl = [self stringForKey: @"SOGoCalendarJitsiBaseUrl"];
@@ -179,16 +179,6 @@
return jitsiBaseUrl;
}
- (NSString *) calendarJitsiRoomPrefix
{
NSString *jitsiRoomPrefix;
jitsiRoomPrefix = [self stringForKey: @"SOGoCalendarJitsiRoomPrefix"];
if(!jitsiRoomPrefix)
jitsiRoomPrefix = @"SOGo_meeting/";
return jitsiRoomPrefix;
}
- (NSArray *) contactsDefaultRoles
{
return [self stringArrayForKey: @"SOGoContactsDefaultRoles"];
+1 -1
View File
@@ -325,7 +325,7 @@
{
login = [currentAcount objectForKey: @"userName"];
password = [currentAcount objectForKey: @"password"];
smtpAuthMethod = @"plain"; //Only support plain for auxiliary account
smtpAuthMethod = "plain"; //Only support plain for auxiliary account
}
else
{
+2 -22
View File
@@ -33,25 +33,6 @@
@class NSURL;
@class NSJSONSerialization;
size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer);
@interface SimpleOpenIdResponse: NSObject
{
unsigned int status;
NSString *content;
NSString *headers;
}
- (id)initWithResponse: (NSString *)_data andHeaders: (NSString *)_headers andStatus:(unsigned int )_status;
- (void)setStatus:(unsigned int)_status;
- (unsigned int)status;
- (void)setContent:(NSString *)_data;
- (NSString *)contentString;
- (void)setHearders:(NSString *)_data;
- (NSString *)headers;
@end
@interface SOGoOpenIdSession : SOGoObject
{
@@ -66,7 +47,6 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer);
NSString *openIdClient;
NSString *openIdClientSecret;
NSString *openIdEmailParam;
NSString *openIdHttpVersion;
BOOL openIdEnableRefreshToken;
BOOL sendDomainInfo;
@@ -100,12 +80,12 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer);
- (void) initialize;
- (void) initializeWithConfig: (NSDictionary *) _config;
- (BOOL) sessionIsOK;
- (SimpleOpenIdResponse *) _performOpenIdRequest: (NSString *) endpoint
- (WOResponse *) _performOpenIdRequest: (NSString *) endpoint
method: (NSString *) method
headers: (NSDictionary *) headers
body: (NSData *) body;
- (NSMutableDictionary *) fecthConfiguration: (NSString *) _domain;
- (void) setAccessToken: (NSString* ) token;
- (void) setAccessToken;
- (NSString *) getRefreshToken;
- (NSString *) getToken;
- (NSString *) getCurrentToken;
+47 -241
View File
@@ -18,11 +18,6 @@
* Boston, MA 02111-1307, USA.
*/
#import <Foundation/NSProcessInfo.h>
#import <curl/curl.h>
#import <NGObjWeb/WOHTTPConnection.h>
#import <NGObjWeb/WORequest.h>
#import <NGObjWeb/WOResponse.h>
@@ -30,12 +25,12 @@
#import <SOGo/SOGoUser.h>
#import <GDLContentStore/GCSOpenIdFolder.h>
#import <GDLContentStore/GCSFolderManager.h>
#import "NSDictionary+Utilities.h"
#import <SOGo/NSString+Utilities.h>
#import <SOGo/NSString+Crypto.h>
#import "NSString+Utilities.h"
#import "SOGoCache.h"
#import "SOGoSystemDefaults.h"
@@ -43,88 +38,6 @@
static BOOL SOGoOpenIDDebugEnabled = YES;
size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
{
size_t total;
total = size * nmemb;
[(NSMutableData *)buffer appendBytes: ptr length: total];
return total;
}
@implementation SimpleOpenIdResponse
- (id)init {
if ((self = [super init])) {
}
return self;
}
- (id)initWithResponse: (NSString *)_data andHeaders: (NSString *)_headers andStatus:(unsigned int )_status{
if ((self = [self init])) {
[self setStatus: _status];
[self setContent: _data];
[self setHeaders: _headers];
}
return self;
}
- (void)setStatus:(unsigned int)_status
{
self->status = _status;
}
- (unsigned int)status
{
if(self->status)
return self->status;
return 0;
}
- (void)setContent:(NSString *)_data
{
self->content = _data;
}
- (NSString *)contentString
{
if(self->content)
return self->content;
return nil;
}
- (void)setHeaders:(NSString *)_data
{
self->headers = _data;
}
- (NSString *)headers
{
if(self->headers)
return self->headers;
return nil;
}
- (NSString*)description {
NSString *co, *hd;
unsigned int st;
st = 0;
co = @"nil";
hd = @"nil";
if(self->status)
st = self->status;
if(self->headers)
hd = self->headers;
if(self->content)
co = self->content;
return [NSString stringWithFormat: @"<SimpleOpenIdResponse> <status: %d>, <headers: %@>, <content: %@>", st, hd, co];
}
@end
@implementation SOGoOpenIdSession
/// Check if all required parameters to set up a OpenIdSession are in sogo.conf
@@ -139,13 +52,6 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
return NO;
}
sd = [SOGoSystemDefaults sharedSystemDefaults];
if(![[sd authenticationType] isEqualToString: @"openid"])
{
[self errorWithFormat: @"Sogo SOGoAuthenticationType is not openid"];
return NO;
}
return ([sd openIdConfigUrl] && [sd openIdScope] && [sd openIdClient] && [sd openIdClientSecret]);
}
@@ -164,7 +70,6 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
openIdClient = [_config objectForKey: @"SOGoOpenIdClient"];
openIdClientSecret = [_config objectForKey: @"SOGoOpenIdClientSecret"];
openIdEmailParam = [_config objectForKey: @"SOGoOpenIdEmailParam"];
openIdHttpVersion = [_config objectForKey: @"SOGoOpenIdHttpVersion"];
openIdEnableRefreshToken = NO;
refreshTokenBool = [_config objectForKey: @"SOGoOpenIdEnableRefreshToken"];
@@ -213,7 +118,7 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
}
else
{
[self errorWithFormat: @"LoginTypebyDOmain - Openid not found or missing parameters for domain", _domain];
[self errorWithFormat: @"Missing parameters from sogo.conf"];
}
}
else if ([[self class] checkUserConfig])
@@ -223,7 +128,6 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
openIdClient = [sd openIdClient];
openIdClientSecret = [sd openIdClientSecret];
openIdEmailParam = [sd openIdEmailParam];
openIdHttpVersion = [sd openIdHttpVersion];
openIdEnableRefreshToken = [sd openIdEnableRefreshToken];
userTokenInterval = [sd openIdTokenCheckInterval];
sendDomainInfo = [sd openIdSendDomainInfo];
@@ -243,147 +147,66 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
}
}
- (SimpleOpenIdResponse *) _performOpenIdRequest: (NSString *) endpoint
- (WOResponse *) _performOpenIdRequest: (NSString *) endpoint
method: (NSString *) method
headers: (NSDictionary *) headers
body: (NSData *) body
{
NSURL *url;
NSMutableData *buffer, *buffHeaders;
SimpleOpenIdResponse *response;
CURL *curl;
struct curl_slist *headerlist=NULL;
NSUInteger status;
NSString *content, *headerResp;
CURLcode rc;
char error[CURL_ERROR_SIZE];
WORequest *request;
WOResponse *response;
WOHTTPConnection *httpConnection;
url = [NSURL URLWithString: endpoint];
if(!url)
if (url)
{
[self errorWithFormat: @"OpenID can't handle endpoint (not a url): '%@'", endpoint];
return nil;
}
if(SOGoOpenIDDebugEnabled)
{
NSLog(@"OpenId perform request: %@ %@", method, endpoint);
NSLog(@"OpenId perform request, headers %@", headers);
}
if(SOGoOpenIDDebugEnabled)
NSLog(@"OpenId perform request, body raw %@", body);
curl_global_init(CURL_GLOBAL_SSL);
curl = curl_easy_init();
if (curl)
{
error[0] = 0;
curl_easy_setopt(curl, CURLOPT_URL, [endpoint UTF8String]);
//add form
if(body)
if(SOGoOpenIDDebugEnabled)
{
//Trick because sometimes NSData bytes don't add the \0 at the end and junk character may be added
const char *myBodyTmp = (const char*)[body bytes];
char myBody[[body length]+1];
strncpy(myBody, myBodyTmp, [body length]);
myBody[[body length]]='\0';
if(SOGoOpenIDDebugEnabled)
NSLog(@"OpenId perform request, myBodyTmp %s", myBodyTmp);
if(SOGoOpenIDDebugEnabled)
NSLog(@"OpenId perform request, myBody %s", myBody);
curl_easy_setopt(curl, CURLOPT_POST, 1);
curl_easy_setopt(curl, CURLOPT_COPYPOSTFIELDS, myBody);
NSLog(@"OpenId perform request: %@ %@", method, endpoint);
NSLog(@"OpenId perform request, headers %@", headers);
// if(body)
// NSLog(@"OpenId perform request: content %@", [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding]);
}
//add headers
if(headers)
httpConnection = [[WOHTTPConnection alloc] initWithURL: url];
[httpConnection autorelease];
request = [[WORequest alloc] initWithMethod: method
uri: [endpoint hostlessURL]
httpVersion: @"HTTP/1.1"
headers: headers content: body
userInfo: nil];
[request autorelease];
[httpConnection sendRequest: request];
response = [httpConnection readResponse];
status = [response status];
if(status >= 200 && status <500 && status != 404)
return response;
else if (status == 404)
{
NSEnumerator *enumerator = [headers keyEnumerator];
NSString *key, *header;
while((key = [enumerator nextObject]))
{
header = [NSString stringWithFormat: @"%@: %@", key, [headers objectForKey: key]];
headerlist = curl_slist_append(headerlist, [header UTF8String]);
}
}
if(headerlist != NULL)
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
buffer = [NSMutableData data];
buffHeaders = [NSMutableData data];
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_body_function);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, curl_body_function);
curl_easy_setopt(curl, CURLOPT_HEADERDATA, buffHeaders);
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, &error);
// Perform SOAP request
rc = curl_easy_perform(curl);
if (rc == CURLE_OK)
{
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &status);
response = [SimpleOpenIdResponse alloc];
headerResp = [[NSString alloc] initWithData: buffHeaders
encoding: NSUTF8StringEncoding];
response = [response initWithResponse: nil andHeaders: headerResp andStatus: status];
if(status >= 200 && status <500 && status != 404)
{
content = [[NSString alloc] initWithData: buffer
encoding: NSUTF8StringEncoding];
if (!content)
content = [[NSString alloc] initWithData: buffer
encoding: NSISOLatin1StringEncoding];
[response setContent: content];
if(SOGoOpenIDDebugEnabled)
NSLog(@"OpenId perform request: response is: %@", response);
return [response autorelease];
}
else if (status == 404)
{
[self errorWithFormat: @"OpenID endpoint not found (404): %@", endpoint];
return nil;
}
else
{
[self errorWithFormat: @"OpenID server internal error during %@: %@", endpoint, response];
return nil;
}
[self errorWithFormat: @"OpenID endpoint not found (404): %@", endpoint];
return nil;
}
else
{
[self errorWithFormat: @"CURL error while accessing %@ (%d): %@", endpoint, rc,
[NSString stringWithCString: strlen(error) ? error : curl_easy_strerror(rc)]];
[self errorWithFormat: @"OpenID server internal error during %@: %@", endpoint, response];
return nil;
}
curl_easy_cleanup (curl);
}
else
{
[self errorWithFormat: @"OpenID error when setting curl request for: %@", endpoint];
return nil;
[self errorWithFormat: @"OpenID can't handle endpoint (not a url): '%@'", endpoint];
return nil;
}
}
- (NSMutableDictionary *) fecthConfiguration: (NSString*) _domain
{
NSString *content;
SimpleOpenIdResponse *response;
// WOResponse * response;
WOResponse * response;
NSUInteger status;
NSMutableDictionary *result;
NSDictionary *config, *headers;
@@ -415,9 +238,7 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
self->authorizationEndpoint = [config objectForKey: @"authorization_endpoint"];
self->tokenEndpoint = [config objectForKey: @"token_endpoint"];
self->userinfoEndpoint = [config objectForKey: @"userinfo_endpoint"];
if([config objectForKey: @"end_session_endpoint"])
self->endSessionEndpoint = [config objectForKey: @"end_session_endpoint"];
self->endSessionEndpoint = [config objectForKey: @"end_session_endpoint"];
//Optionnals?
if([config objectForKey: @"introspection_endpoint"])
@@ -525,8 +346,7 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
ASSIGN (authorizationEndpoint, [sessionDict objectForKey: @"authorization_endpoint"]);
ASSIGN (tokenEndpoint, [sessionDict objectForKey: @"token_endpoint"]);
ASSIGN (userinfoEndpoint, [sessionDict objectForKey: @"userinfo_endpoint"]);
if([sessionDict objectForKey: @"end_session_endpoint"])
ASSIGN (endSessionEndpoint, [sessionDict objectForKey: @"end_session_endpoint"]);
ASSIGN (endSessionEndpoint, [sessionDict objectForKey: @"end_session_endpoint"]);
//Optionnals?
if([sessionDict objectForKey: @"introspection_endpoint"])
@@ -550,8 +370,7 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
[sessionDict setObject: authorizationEndpoint forKey: @"authorization_endpoint"];
[sessionDict setObject: tokenEndpoint forKey: @"token_endpoint"];
[sessionDict setObject: userinfoEndpoint forKey: @"userinfo_endpoint"];
if(endSessionEndpoint)
[sessionDict setObject: endSessionEndpoint forKey: @"end_session_endpoint"];
[sessionDict setObject: endSessionEndpoint forKey: @"end_session_endpoint"];
//Optionnals?
if(introspectionEndpoint)
@@ -612,12 +431,6 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
nextCheckAfter: nextCheck];
}
-(NSString *) _random_state
{
return [[[NSProcessInfo processInfo] globallyUniqueString] asSHA1String];;
}
- (NSString*) loginUrl: (NSString *) oldLocation
{
NSString* logUrl;
@@ -625,7 +438,6 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
logUrl = [logUrl stringByAppendingString: @"&response_type=code"];
logUrl = [logUrl stringByAppendingFormat: @"&client_id=%@", self->openIdClient];
logUrl = [logUrl stringByAppendingFormat: @"&redirect_uri=%@", oldLocation];
logUrl = [logUrl stringByAppendingFormat: @"&state=%@", [self _random_state]];
if(self->forDomain != nil && [self->forDomain length] > 0)
logUrl = [logUrl stringByAppendingFormat: @"&sogo_domain=%@", forDomain];
// logurl = [self->logurl stringByAppendingFormat: @"&state=%@", state];
@@ -673,8 +485,7 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
- (NSMutableDictionary *) fetchToken: (NSString * ) code redirect: (NSString *) oldLocation
{
NSString *location, *form, *content;
SimpleOpenIdResponse *response;
// WOResponse *response;
WOResponse *response;
NSUInteger status;
NSMutableDictionary *result;
NSDictionary *headers;
@@ -699,10 +510,7 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
self->forDomain, @"sogo-user-domain", nil];
else
headers = [NSDictionary dictionaryWithObject: @"application/x-www-form-urlencoded" forKey: @"content-type"];
if(SOGoOpenIDDebugEnabled)
NSLog(@"OpenId fetch token, form %@", form);
response = [self _performOpenIdRequest: location
method: @"POST"
headers: headers
@@ -745,8 +553,7 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
- (NSMutableDictionary *) refreshToken: (NSString * ) userRefreshToken
{
NSString *location, *form, *content;
SimpleOpenIdResponse *response;
// WOResponse *response;
WOResponse *response;
NSUInteger status;
NSMutableDictionary *result;
NSDictionary *headers;
@@ -819,8 +626,7 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
- (NSMutableDictionary *) fetchUserInfo
{
NSString *location, *auth, *content;
SimpleOpenIdResponse *response;
// WOResponse *response;
WOResponse *response;
NSUInteger status;
NSMutableDictionary *result;
NSDictionary *profile, *headers;
@@ -876,7 +682,7 @@ size_t curl_body_function(void *ptr, size_t size, size_t nmemb, void *buffer)
}
else
{
[self logWithFormat: @"Error fetching userInfo (status %d), response: %@", status, response];
[self logWithFormat: @"Error during fetching the token (status %d), response: %@", status, response];
[result setObject: @"http-error" forKey: @"error"];
}
}
+3 -12
View File
@@ -569,10 +569,7 @@ static SoSecurityManager *sm = nil;
isPropfind = [requestMethod isEqualToString: @"PROPFIND"];
error = [self initSubFolders];
if(error)
{
[self errorWithFormat: @"a database error occured when inititializing the subFolders: %@", [error reason]];
if(isPropfind)
if (error && isPropfind)
{
/* We exceptionnally raise the exception here because doPROPFIND: will
not care for errors in its response from toManyRelationShipKeys,
@@ -580,16 +577,10 @@ static SoSecurityManager *sm = nil;
SOGo extensions. */
[error raise];
}
}
error = [self initSubscribedSubFolders];
if (error)
{
[self errorWithFormat: @"a database error occured when subscribing to subfolders: %@", [error reason]];
if(isPropfind)
[error raise];
}
if (error && isPropfind)
[error raise];
ma = [NSMutableArray arrayWithArray: [subFolders allValues]];
if ([subscribedSubFolders count])
+1 -1
View File
@@ -33,7 +33,7 @@ static const NSString *POLICY_MIN_DIGIT = @"POLICY_MIN_DIGIT";
static const NSString *POLICY_MIN_SPECIAL_SYMBOLS = @"POLICY_MIN_SPECIAL_SYMBOLS";
static const NSString *POLICY_MIN_LENGTH = @"POLICY_MIN_LENGTH";
static const NSString *SPECIAL_SYMBOL_ALLOWED = @"%$&*(){}!?\\@#.,:;+=\\[\\]\\|<>\\/\\-_";
static const NSString *SPECIAL_SYMBOL_ALLOWED = @"%$&*(){}!?\\@#.,:;+=\\[\\]\\|<>\\/-_";
@implementation SOGoPasswordPolicy
+18 -18
View File
@@ -122,28 +122,28 @@ static NSString *productDirectoryName = @"SOGo";
pathes = [[self productSearchPathes] objectEnumerator];
while ((lpath = [pathes nextObject]))
{
productNames = [[fm directoryContentsAtPath: lpath] objectEnumerator];
while ((productName = [productNames nextObject]))
{
if ([[productName pathExtension] isEqualToString: @"SOGo"])
productNames = [[fm directoryContentsAtPath: lpath] objectEnumerator];
while ((productName = [productNames nextObject]))
{
if ([[productName pathExtension] isEqualToString: @"SOGo"])
{
bpath = [lpath stringByAppendingPathComponent: productName];
[registry registerProductAtPath: bpath];
[loadedProducts addObject: productName];
}
}
if ([loadedProducts count])
{
bpath = [lpath stringByAppendingPathComponent: productName];
[registry registerProductAtPath: bpath];
[loadedProducts addObject: productName];
if (verbose)
{
[self logWithFormat: @"SOGo products loaded from '%@':", lpath];
[self logWithFormat: @" %@",
[loadedProducts componentsJoinedByString: @", "]];
}
[loadedProducts removeAllObjects];
}
}
if ([loadedProducts count])
{
if (verbose)
{
[self logWithFormat: @"SOGo products loaded from '%@':", lpath];
[self logWithFormat: @" %@",
[loadedProducts componentsJoinedByString: @", "]];
}
[loadedProducts removeAllObjects];
}
}
if (![registry loadAllProducts] && verbose)
[self warnWithFormat: @"could not load all products !"];
+3 -28
View File
@@ -162,23 +162,11 @@
// Get the key length and its bytes
data = [theKey dataByDecodingBase64];
key = (char *)[data bytes];
klen = [data length];
//value longer than the key, concatenate the key with itself until long enough
if (klen < [theValue length])
{
NSMutableData *concatenatedData = [NSMutableData data];
int j;
int nbDuplication = [theValue length]/klen;
for(j=0; j <= nbDuplication; j++)
[concatenatedData appendData:data];
data = [NSData dataWithData: concatenatedData];
klen = [data length];
}
key = (char *)[data bytes];
[self errorWithFormat: @"Value to be secured is too big (%i > %i) -- secured value will be corrupted", [theValue length], klen, [theKey length]];
// Get the key - padding it with 0 with key length
pass = (char *) calloc(klen, sizeof(char));
@@ -213,6 +201,7 @@
// Get the key length and its bytes
dataKey = [theKey dataByDecodingBase64];
key = (char *)[dataKey bytes];
klen = [dataKey length];
// Get the secured value length and its bytes
@@ -220,20 +209,6 @@
value = (char *)[dataValue bytes];
vlen = [dataValue length];
//If the key is shorer than the value, duplicate it with itself.
if(klen < vlen)
{
NSMutableData *concatenatedData = [NSMutableData data];
int j;
int nbDuplication = [dataValue length]/klen;
for(j=0; j <= nbDuplication; j++)
[concatenatedData appendData:dataKey];
dataKey = [NSData dataWithData: concatenatedData];
klen = [dataKey length];
}
key = (char *)[dataKey bytes];
// Target buffer
buf = (char *) calloc(klen, sizeof(char));
+1 -9
View File
@@ -496,7 +496,6 @@ static NSString *sieveScriptName = @"sogo";
}
- (NSString *) _extractSieveAction: (NSDictionary *) action
withReq: (NSMutableDictionary *) req
delimiter: (NSString *) delimiter
{
NSString *sieveAction, *method, *requirement, *argument, *flag, *mailbox;
@@ -549,9 +548,7 @@ static NSString *sieveScriptName = @"sogo";
{
argument = [NSString stringWithFormat: @"mailto:%@", argument];
sieveAction = [NSString stringWithFormat: @"%@ %@",
method, [argument asSieveQuotedString]];
[req addObjectUniquely: @"enotify"];
[req addObjectUniquely: @"variables"];
method, [argument asSieveQuotedString]];
}
else if ([method isEqualToString: @"reject"])
sieveAction = [NSString stringWithFormat: @"%@ %@",
@@ -578,7 +575,6 @@ static NSString *sieveScriptName = @"sogo";
}
- (NSArray *) _extractSieveActions: (NSArray *) actions
withReq: (NSMutableDictionary *) req
delimiter: (NSString *) delimiter
{
NSMutableArray *sieveActions;
@@ -590,7 +586,6 @@ static NSString *sieveScriptName = @"sogo";
for (count = 0; !scriptError && count < max; count++)
{
sieveAction = [self _extractSieveAction: [actions objectAtIndex: count]
withReq: req
delimiter: delimiter];
if (!scriptError)
[sieveActions addObject: sieveAction];
@@ -600,7 +595,6 @@ static NSString *sieveScriptName = @"sogo";
}
- (NSString *) _convertScriptToSieve: (NSDictionary *) newScript
withReq: (NSMutableDictionary *) req
delimiter: (NSString *) delimiter
{
NSMutableString *sieveText;
@@ -630,7 +624,6 @@ static NSString *sieveScriptName = @"sogo";
scriptError = [NSString stringWithFormat: @"Bad test: %@", match];
}
sieveActions = [self _extractSieveActions: [newScript objectForKey: @"actions"]
withReq: req
delimiter: delimiter];
if ([sieveActions count])
[sieveText appendFormat: @" %@;\r\n",
@@ -667,7 +660,6 @@ static NSString *sieveScriptName = @"sogo";
if ([[currentScript objectForKey: @"active"] boolValue])
{
sieveText = [self _convertScriptToSieve: currentScript
withReq: newRequirements
delimiter: delimiter];
[sieveScript appendString: sieveText];
}
-2
View File
@@ -83,7 +83,6 @@ static const NSString *kDisableSharingCalendar = @"Calendar";
- (BOOL) uixDebugEnabled;
- (BOOL) easDebugEnabled;
- (BOOL) openIdDebugEnabled;
- (BOOL) apiDebugEnabled;
- (BOOL) tnefDecoderDebugEnabled;
- (BOOL) xsrfValidationEnabled;
@@ -107,7 +106,6 @@ NSComparisonResult languageSort(id el1, id el2, void *context);
- (NSString *) openIdClient;
- (NSString *) openIdClientSecret;
- (NSString *) openIdEmailParam;
- (NSString *) openIdHttpVersion;
- (BOOL) openIdEnableRefreshToken;
- (BOOL) openIdLogoutEnabled: (NSString *) _domain;
- (int) openIdTokenCheckInterval;
+6 -14
View File
@@ -654,11 +654,6 @@ _injectConfigurationFromFile (NSMutableDictionary *defaultsDict,
return [self boolForKey: @"SOGoOpenIDDebugEnabled"];
}
- (BOOL) apiDebugEnabled
{
return [self boolForKey: @"SOGoAPIDebugEnabled"];
}
- (BOOL) tnefDecoderDebugEnabled
{
return [self boolForKey: @"SOGoTnefDecoderDebugEnabled"];
@@ -784,15 +779,6 @@ NSComparisonResult languageSort(id el1, id el2, void *context)
return emailParam;
}
- (NSString *) openIdHttpVersion
{
NSString *httpVersion;
httpVersion = [self stringForKey: @"SOGoOpenIdHttpVersion"];
if(!httpVersion)
httpVersion = @"HTTP/1.1";
return httpVersion;
}
- (BOOL) openIdLogoutEnabled: (NSString *) _domain
{
if(_domain && [self doesLoginTypeByDomain])
@@ -1039,7 +1025,13 @@ NSComparisonResult languageSort(id el1, id el2, void *context)
v = [self integerForKey: @"SOGoInternalSyncInterval"];
if (!v)
{
NSLog(@"EASLOG: SOGoInternalSyncInterval didn't find value in conf, go with default 10");
v = 10;
}
else {
NSLog(@"EASLOG: SOGoInternalSyncInterval found, value is %d", v);
}
return v;
}
@@ -25,7 +25,7 @@
"No resource" = "Geen middelen";
"Any Authenticated User" = "Elke geauthenticeerde gebruiker";
"Public Access" = "Publieke toegang";
"Save" = "Opslaan";
"Clear" = "Leeg maken";
"Message of the day" = "Bericht van de dag";
"Message of the day has been saved" = "Bericht van de dag is opgeslagen";
"Save" = "Save";
"Clear" = "Clear";
"Message of the day" = "Message of the day";
"Message of the day has been saved" = "Message of the day has been saved";
+14 -14
View File
@@ -45,7 +45,7 @@
"Reduce" = "Verminderen";
/* tooltip */
"Refresh" = "Vernieuwen";
"Refresh" = "Refresh";
/* generic.js */
"Unable to subscribe to that folder!"
@@ -109,7 +109,7 @@
"Personal" = "Persoonlijk";
"To Do" = "Te doen";
"Later" = "Later";
"Forwarded" = "Doorgestuurd";
"Forwarded" = "Forwarded";
"Return Receipt Sent" = "Ontvangstbewijs verzonden";
"a2_Sunday" = "Zo";
"a2_Monday" = "Ma";
@@ -122,7 +122,7 @@
"Add User" = "Gebruiker toevoegen";
"Loading" = "Laden";
"No such user." = "Geen dergelijke gebruiker";
"You cannot (un)subscribe to a folder that you own!" = "U kunt zich niet (af)melden voor een map waarvan u de eigenaar bent!";
"You cannot (un)subscribe to a folder that you own!" = "Kan niet aan- of afmelden van eigen map!";
/* SMIME Certificate field */
"S/MIME Certificate" = "S/MIME Certificaat";
@@ -227,16 +227,16 @@
"Move forward" = "Ga vooruit";
/* Password Recovery */
"passwordRecovery_Disabled" = "Uitgezet";
"passwordRecovery_SecretQuestion" = "Geheime vraag";
"passwordRecovery_SecretQuestion1" = "Hoe heet je eerste huisdier?";
"passwordRecovery_SecretQuestion2" = "Wat was je eerste auto?";
"passwordRecovery_SecretQuestion3" = "Wat is je favoriete film?";
"passwordRecovery_SecondaryEmail" = "Secundair e-mailadres";
"passwordRecovery_Disabled" = "Disabled";
"passwordRecovery_SecretQuestion" = "Secret question";
"passwordRecovery_SecretQuestion1" = "What is the name of your first pet ?";
"passwordRecovery_SecretQuestion2" = "What was your first car ?";
"passwordRecovery_SecretQuestion3" = "What is your favorite movie ?";
"passwordRecovery_SecondaryEmail" = "Secondary E-mail";
/* Password */
"POLICY_MIN_LOWERCASE_LETTER" = "Minimaal %{0} kleine letter";
"POLICY_MIN_UPPERCASE_LETTER" = "Minimaal %{0} hoofdletter";
"POLICY_MIN_DIGIT" = "Minimaal %{0} cijfer";
"POLICY_MIN_SPECIAL_SYMBOLS" = "Minimaal %{0} speciale symbolen";
"POLICY_MIN_LENGTH" = "Minimale lengte van %{0} tekens";
"POLICY_MIN_LOWERCASE_LETTER" = "Minimum of %{0} lowercase letter";
"POLICY_MIN_UPPERCASE_LETTER" = "Minimum of %{0} uppercase letter";
"POLICY_MIN_DIGIT" = "Minimum of %{0} digit";
"POLICY_MIN_SPECIAL_SYMBOLS" = "Minimum of %{0} special symbols";
"POLICY_MIN_LENGTH" = "Minimum length of %{0} characters";
@@ -235,8 +235,8 @@
"passwordRecovery_SecondaryEmail" = "İkincil e-posta";
/* Password */
"POLICY_MIN_LOWERCASE_LETTER" = "En az %{0} küçük harf";
"POLICY_MIN_UPPERCASE_LETTER" = "En az %{0} büyük harf";
"POLICY_MIN_DIGIT" = "En az %{0} rakam";
"POLICY_MIN_SPECIAL_SYMBOLS" = "En az %{0} özel simge";
"POLICY_MIN_LENGTH" = "En az %{0} karakter uzunluğunda";
"POLICY_MIN_LOWERCASE_LETTER" = "Minimum of %{0} lowercase letter";
"POLICY_MIN_UPPERCASE_LETTER" = "Minimum of %{0} uppercase letter";
"POLICY_MIN_DIGIT" = "Minimum of %{0} digit";
"POLICY_MIN_SPECIAL_SYMBOLS" = "Minimum of %{0} special symbols";
"POLICY_MIN_LENGTH" = "Minimum length of %{0} characters";
+1 -1
View File
@@ -193,7 +193,7 @@
"Work" = "Werk";
"Mobile" = "Mobiel";
"Pager" = "Pieper";
"Download iOS - MacOS configuration profile" = "Download iOS - MacOS configuratieprofiel";
"Download iOS - MacOS configuration profile" = "Download iOS - MacOS configuration profile";
/* categories */
"contacts_category_labels" = "Collega, Concurrent, Klant, Vriend, Familie, Zakenpartner, Leverancier, Pers, VIP";
@@ -47,4 +47,4 @@ reply_info = "Dit is een antwoord op een door u verstuurde uitnodiging.";
"OK" = "OK";
"Comment" = "Commentaar:";
"Description" = "Omschrijving";
"Location" = "Locatie";
"Location" = "Location";
+33 -33
View File
@@ -143,23 +143,23 @@
"This mail is being sent from an unsecure network!" = "Deze e-mail wordt verzonden vanaf een onveilig netwerk!";
"Address Book" = "Adresboek";
"Search For" = "Zoek naar";
"Contains" = "bevat";
"Does not contains" = "bevat niet";
"Advanced search" = "Geavanceerd zoeken";
"Anytime" = "Altijd";
"Last 7 days" = "Laatste 7 dagen";
"Last 30 days" = "Laatste 30 dagen";
"Last 6 month" = "Laatste 6 maanden";
"Before" = "Voor";
"After" = "Na";
"Between" = "Tussen";
"and" = "en";
"With attachments" = "Met bijlage";
"In favorites" = "In favorieten";
"Unseen only" = "Alleen ongelezen ";
"Show more" = "Meer weergeven";
"Contains" = "Contains";
"Does not contains" = "Does not contains";
"Advanced search" = "Advanced search";
"Anytime" = "Anytime";
"Last 7 days" = "Last 7 days";
"Last 30 days" = "Last 30 days";
"Last 6 month" = "Last 6 month";
"Before" = "Before";
"After" = "After";
"Between" = "Between";
"and" = "and";
"With attachments" = "With attachments";
"In favorites" = "In favorites";
"Unseen only" = "Unseen only";
"Show more" = "Show more";
"Reset" = "Reset";
"Message size" = "Berichtgrootte";
"Message size" = "Message size";
/* Popup "show" */
"all" = "alle";
@@ -171,7 +171,7 @@
/* MailListView */
"Sender" = "Afzender";
"Subject or Sender" = "Onderwerp of afzender";
"Subject or Recipient" = "Onderwerp of ontvanger";
"Subject or Recipient" = "Subject or Recipient";
"To or Cc" = "Ontvanger (Aan of Cc)";
"Entire Message" = "Volledig bericht";
"Date" = "Datum";
@@ -257,7 +257,7 @@
"Save As..." = "Opslaan als...";
"Print Preview" = "Afdrukvoorbeeld";
"View Message Source" = "Bron bekijken";
"View raw message" = "Bekijk onbewerkt bericht";
"View raw message" = "View raw message";
/* Message view "more" menu: create an event from message */
"Convert To Event" = "Omzetten naar afspraak";
@@ -464,7 +464,7 @@
"Copy messages" = "Kopieer berichten";
"More messages options" = "Meer berichtopties";
"Flag" = "Met vlag";
"Unflag" = "Vlag verwijderen";
"Unflag" = "Unflag";
"Mark as Unread" = "Als ongelezen markeren";
"Mark as Read" = "Markeren als gelezen";
"Closing Window ..." = "Venster sluiten ...";
@@ -478,7 +478,7 @@
"Your email has been sent" = "Uw email is verzonden";
"Folder compacted" = "Map gecomprimeerd";
"More Options" = "Meer opties";
"More Options" = "More Options";
"New draft" = "Nieuw concept";
"Create new draft with this template" = "Maak een nieuw concept met dit sjabloon";
@@ -517,16 +517,16 @@
"hotkey_forward" = "f";
/* Email deletion */
"Clean folder" = "Map opschonen";
"Clean mailbox" = "Mailbox opschonen";
"Delete permanently (do not use trash)" = "Permanent verwijderen (niet in de prullenbak gebruiken)";
"Apply to subfolders" = "Toepassen op submappen";
"Delete e-mails older than" = "Verwijder e-mails die ouder zijn dan";
"3 months" = "3 maanden";
"6 months" = "6 maanden";
"9 months" = "9 maanden";
"1 year" = "1 jaar";
"Custom" = "Aangepast";
"You are about to permanently delete some messages. Are you sure you want to proceed with this action?" = "U staat op het punt om enkele berichten definitief te verwijderen. Weet u zeker dat u hiermee wilt doorgaan?";
"Apply" = "Toepassen";
"%{0} message(s) deleted" = "%{0} bericht(en) verwijderd";
"Clean folder" = "Clean folder";
"Clean mailbox" = "Clean mailbox";
"Delete permanently (do not use trash)" = "Delete permanently (do not use trash)";
"Apply to subfolders" = "Apply to subfolders";
"Delete e-mails older than" = "Delete e-mails older than";
"3 months" = "3 months";
"6 months" = "6 months";
"9 months" = "9 months";
"1 year" = "1 year";
"Custom" = "Custom";
"You are about to permanently delete some messages. Are you sure you want to proceed with this action?" = "You are about to permanently delete some messages. Are you sure you want to proceed with this action?";
"Apply" = "Apply";
"%{0} message(s) deleted" = "%{0} message(s) deleted";
@@ -171,7 +171,7 @@
/* MailListView */
"Sender" = "Gönderici";
"Subject or Sender" = "Konu ya da Gönderici";
"Subject or Recipient" = "Konu ya da alıcı";
"Subject or Recipient" = "Subject or Recipient";
"To or Cc" = "Alıcı veya Kopya";
"Entire Message" = "Tüm ileti";
"Date" = "Tarih";
@@ -517,16 +517,16 @@
"hotkey_forward" = "f";
/* Email deletion */
"Clean folder" = "Klasörü temizle";
"Clean mailbox" = "E-posta kutusunu temizle";
"Delete permanently (do not use trash)" = "Kalıcı olarak sil (çöpe atmadan)";
"Apply to subfolders" = "Alt klasörlere uygula";
"Delete e-mails older than" = "Şundan eski e-postaları sil";
"3 months" = "3 ay";
"6 months" = "6 ay";
"9 months" = "9 ay";
"1 year" = "1 yıl";
"Custom" = "Özel";
"You are about to permanently delete some messages. Are you sure you want to proceed with this action?" = "Bazı iletileri kalıcı olarak silmek üzeresiniz. Bunu yapmak istediğinize emin misiniz?";
"Apply" = "Uygula";
"%{0} message(s) deleted" = "%{0} ileti silindi";
"Clean folder" = "Clean folder";
"Clean mailbox" = "Clean mailbox";
"Delete permanently (do not use trash)" = "Delete permanently (do not use trash)";
"Apply to subfolders" = "Apply to subfolders";
"Delete e-mails older than" = "Delete e-mails older than";
"3 months" = "3 months";
"6 months" = "6 months";
"9 months" = "9 months";
"1 year" = "1 year";
"Custom" = "Custom";
"You are about to permanently delete some messages. Are you sure you want to proceed with this action?" = "You are about to permanently delete some messages. Are you sure you want to proceed with this action?";
"Apply" = "Apply";
"%{0} message(s) deleted" = "%{0} message(s) deleted";
+2 -5
View File
@@ -62,7 +62,7 @@
@implementation UIxMailAccountActions
- (NSArray *)sortChildrenRecursively: (NSArray *)children {
NSInteger i, j, nbSpecial;
NSInteger i, j;
NSMutableArray *sortedArray;
NSArray *unsortedChildren, *sortedChildren;
NSDictionary *child;
@@ -75,18 +75,15 @@
sortedArray = [NSMutableArray array];
nbSpecial = 0;
for (child in children) {
unsortedChildren = [child objectForKey:@"children"];
sortedChildren = [self sortChildrenRecursively:unsortedChildren];
mutableChild = [child mutableCopy];
[mutableChild setObject:sortedChildren forKey:@"children"];
[sortedArray addObject:mutableChild];
if(![[mutableChild objectForKey:@"type"] isEqualToString: @"folder"])
nbSpecial++;
}
for (i = nbSpecial; i < [sortedArray count] - 1; i++) {
for (i = 0; i < [sortedArray count] - 1; i++) {
for (j = i + 1; j < [sortedArray count]; j++) {
name1 = [[sortedArray objectAtIndex:i] objectForKey:@"name"];
name2 = [[sortedArray objectAtIndex:j] objectForKey:@"name"];
+1 -1
View File
@@ -376,7 +376,7 @@
}
NS_HANDLER
{
[self logWithFormat: @"Error while parsing attachments for rendering bracket"];
[self logWithFormat: @"Error while parsing attachements for rendering bracket"];
}
NS_ENDHANDLER;
+16 -16
View File
@@ -77,14 +77,14 @@
"Welsh" = "Cymraeg";
"About" = "Over";
"AboutBox" = "SOGO is een volledig uitgeruste groupware server met focus op schaalbaarheid en eenvoud ontwikkeld door Inverse.<br/><br/>SOGO biedt een rijke AJAX-gebaseerde web-interface en ondersteunt meerdere native clients door gebruik van standaard protocollen als CalDAV en CardDAV.<br/><br/>SOGO wordt gedistribueerd onder de <a href=\"http://gnu.org/licenses/gpl.html\">GNU GPL</a> versie 2 of hoger en onderdelen worden verspreid onder de GNU LGPL versie 2. Dit is vrije software: je bent vrij om het te veranderen en verspreiden. Er is GEEN GARANTIE, voor zover toegestaan ​​door de wet.<br/><br/>Zie <a href=\"http://www.sogo.nu/en/support/community.html\">deze pagina</a> voor diverse support opties.";
"AboutBox" = "Developed by Inverse and Alinto, SOGo is a fully-featured groupware server with a focus on scalability and simplicity.<br/><br/>\nSOGo provides a rich AJAX-based Web interface and supports multiple native clients through the use of standard protocols such as CalDAV and CardDAV.<br/><br/>\nSOGo is distributed under the <a href=\"http://gnu.org/licenses/gpl.html\">GNU GPL</a> version 2 or later and parts are distributed under the GNU LGPL version 2. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.<br/><br/>\nSee <a href=\"http://www.sogo.nu/en/support/community.html\">this page</a> for various support options.";
"Your account was locked due to too many failed attempts." = "Uw account is geblokkeerd wegens te veel mislukte pogingen.";
"Your account was locked due to an expired password." = "Uw account is geblokkeerd wegens een verlopen wachtwoord.";
"Login failed due to unhandled error case" = "Inloggen mislukt wegens onverwerkte fout";
"Change your Password" = "Verander uw wachtwoord";
"The password was changed successfully." = "Het wachtwoord is met succes veranderd.";
"Your password has expired, please enter a new one below" = "Uw wachtwoord is verlopen, vul hieronder een nieuw wachtwoord in";
"Your password is too weak. Please choose a stronger password to enhance your security" = "Uw wachtwoord is te zwak. Kies een sterker wachtwoord om uw veiligheid te verbeteren.";
"Your password is too weak. Please choose a stronger password to enhance your security" = "Your password is too weak. Please choose a stronger password to enhance your security";
"Password must not be empty." = "Wachtwoord mag niet leeg zijn.";
"The passwords do not match. Please try again." = "De wachtwoorden komen niet overeen. Probeer het opnieuw.";
"Password Grace Period" = "Wachtwoord-respijtperiode";
@@ -114,17 +114,17 @@
"Missing type parameter" = "Ontbrekende typeparameter";
/* Password Recovery */
"Secondary e-mail" = "Secundair e-mailadres";
"Answer" = "Beantwoord";
"Password lost" = "Wachtwoord verloren";
"No password recovery method has been defined for this user" = "Er is geen wachtwoordherstelmethode gedefinieerd voor deze gebruiker";
"Invalid secret question answer" = "Ongeldig antwoord op geheime vraag";
"Next" = "Volgende";
"Back" = "Terug";
"Please enter a new password below" = "Voer hieronder een nieuw wachtwoord in";
"A link will be sent to %{0}" = "Er wordt een link verzonden naar %{0}";
"A password reset link has been sent, please check your recovery e-mail mailbox and click on the link" = "Er is een link verzonden om uw wachtwoord opnieuw in te stellen. Controleer uw herstel-e-mailbox en klik op de link.";
"Invalid configuration for email password recovery" = "Ongeldige configuratie voor e-mailwachtwoordherstel";
"Password recovery email in error" = "Wachtwoordherstel-e-mail is foutief verzonden";
"Password reset" = "Wachtwoord opnieuw instellen";
"Hi %{0},\nThere was a request to change your password!\n\nIf you did not make this request then please ignore this email.\n\nOtherwise, please click this link to change your password: %{1}" = "Hallo %{0},\nEr is een verzoek ingediend om je wachtwoord te wijzigen!\n\nAls je dit verzoek niet hebt ingediend, negeer dan deze e-mail.\n\nKlik anders op deze link om je wachtwoord te wijzigen: %{1}";
"Secondary e-mail" = "Secondary e-mail";
"Answer" = "Answer";
"Password lost" = "Password lost";
"No password recovery method has been defined for this user" = "No password recovery method has been defined for this user";
"Invalid secret question answer" = "Invalid secret question answer";
"Next" = "Next";
"Back" = "Back";
"Please enter a new password below" = "Please enter a new password below";
"A link will be sent to %{0}" = "A link will be sent to %{0}";
"A password reset link has been sent, please check your recovery e-mail mailbox and click on the link" = "A password reset link has been sent, please check your recovery e-mail mailbox and click on the link";
"Invalid configuration for email password recovery" = "Invalid configuration for email password recovery";
"Password recovery email in error" = "Password recovery email in error";
"Password reset" = "Password reset";
"Hi %{0},\nThere was a request to change your password!\n\nIf you did not make this request then please ignore this email.\n\nOtherwise, please click this link to change your password: %{1}" = "Hi %{0},\nThere was a request to change your password!\n\nIf you did not make this request then please ignore this email.\n\nOtherwise, please click this link to change your password: %{1}";
-1
View File
@@ -14,7 +14,6 @@ MainUI_OBJC_FILES += \
SOGoUserHomePage.m \
SOGoBrowsersPanel.m \
SOGoMicrosoftActiveSyncActions.m \
SOGoAPIActions.m \
ifeq ($(saml2_config), yes)
MainUI_OBJC_FILES += SOGoSAML2Actions.m
-73
View File
@@ -1,73 +0,0 @@
/*
Copyright (C) 2014-2016 Inverse inc.
This file is part of SOGo.
SOGo is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
SOGo is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with SOGo; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#import <SOGo/SOGoCache.h>
#import <SOGo/NSObject+Utilities.h>
#import <NGObjWeb/WOContext.h>
#import <NGObjWeb/WODirectAction.h>
#import <NGObjWeb/NSException+HTTP.h>
#import <NGObjWeb/WOResponse.h>
#import <API/SOGoAPIDispatcher.h>
@interface SOGoAPIActions : WODirectAction
@end
@implementation SOGoAPIActions
- (WOResponse *) sogoAPIAction
{
WOResponse *response;
WORequest *request;
NSBundle *bundle;
NSException *ex;
id dispatcher;
Class clazz;
request = (WORequest *)[context request];
response = (WOResponse *)[context response];
[response setStatus: 200];
[response setHeader: @"application/json; charset=utf-8" forKey: @"content-type"];
bundle = [NSBundle bundleForClass: NSClassFromString(@"SOGoAPIProduct")];
clazz = [bundle classNamed: @"SOGoAPIDispatcher"];
dispatcher = [[clazz alloc] init];
ex = [dispatcher dispatchRequest: request inResponse: response context: context];
//[[self class] memoryStatistics];
if (ex)
{
return [NSException exceptionWithHTTPStatus: 500];
}
RELEASE(dispatcher);
//[[SOGoCache sharedCache] killCache];
return response;
}
@end
+4 -5
View File
@@ -92,8 +92,7 @@
// We check if we must write the Sieve scripts to the server
// upon first login if no user preferences are found, and the SOGo
// admin has defined SOGoSieveFilters in the domain or system settings
//count = 1 because values will be {CDefaultsSize = 16777215; } in this case.
if ([dd sieveScriptsEnabled] && [[[ud source] values] count] == 1 &&
if ([dd sieveScriptsEnabled] && [[[ud source] values] count] == 0 &&
((filters = [[dd source] objectForKey: @"SOGoSieveFilters"]) || (filters = [[sd source] objectForKey: @"SOGoSieveFilters"])))
{
SOGoMailAccount *account;
@@ -447,9 +446,9 @@
}
else if ([authType isEqualToString: @"openid"])
{
SOGoOpenIdSession* sessionOidc;
sessionOidc = [SOGoOpenIdSession OpenIdSession: loginDomain];
redirectURL = [sessionOidc logoutUrl];
SOGoOpenIdSession* session;
session = [SOGoOpenIdSession OpenIdSession: loginDomain];
redirectURL = [session logoutUrl];
}
#if defined(SAML2_CONFIG)
else if ([authType isEqualToString: @"saml2"])
@@ -84,7 +84,7 @@
"Change your Password" = "Parolanızı değiştirin";
"The password was changed successfully." = "Parola değiştirildi.";
"Your password has expired, please enter a new one below" = "Parolanızın süresi dolmuş. Lütfen aşağıya yeni bir parola yazın";
"Your password is too weak. Please choose a stronger password to enhance your security" = "Parolanız çok zayıf. Lütfen güvenliğinizi artırmak için daha güçlü bir parola seçin";
"Your password is too weak. Please choose a stronger password to enhance your security" = "Your password is too weak. Please choose a stronger password to enhance your security";
"Password must not be empty." = "Parola boş olamaz.";
"The passwords do not match. Please try again." = "Parola ile onayı aynı değil. Lütfen yeniden deneyin.";
"Password Grace Period" = "Parola geçerlilik süresi";
-5
View File
@@ -118,11 +118,6 @@
actionClass = "SOGoMicrosoftActiveSyncActions";
actionName = "microsoftServerActiveSync";
};
SOGoAPI = {
protectedBy = "<public>";
actionClass = "SOGoAPIActions";
actionName = "sogoAPI";
};
casProxy = {
protectedBy = "<public>";
pageName = "SOGoRootPage";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Default font size";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Default font size";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Standardna veličina fonta";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Размер на шрифта по подразбиране";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Mida per defecte del tipus de lletra";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "默认字体大小";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Default font size";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Zadana veličina slova";
@@ -24,7 +24,7 @@
"Vacation" = "Afwezigheid";
"Forward" = "Doorsturen";
"Password" = "Wachtwoord";
"Notification" = "Notificatie";
"Notification" = "Notification";
"Categories" = "Categorieën";
"Appointments invitations" = "Uitnodigingen voor afspraken";
"Name" = "Naam";
@@ -46,10 +46,10 @@
"Days between responses" = "Dagen tussen reacties";
"Do not send responses to mailing lists" = "Geen reacties naar maillinglijsten sturen";
"Activation Constraints" = "Activatiebeperkingen";
"Customize day and hour ranges independently and optionally combine them with specific weekdays to tailor your vacation filters to your preferences" = "Pas de dag- en uur bereiken onafhankelijk van elkaar aan en combineer ze eventueel met specifieke weekdagen om uw vakantiefilters aan te passen aan uw voorkeuren";
"Customize day and hour ranges independently and optionally combine them with specific weekdays to tailor your vacation filters to your preferences" = "Customize day and hour ranges independently and optionally combine them with specific weekdays to tailor your vacation filters to your preferences";
"Enable auto reply on" = "Automatisch beantwoorden inschakelen";
"First day of vacation" = "Eerste vakantiedag";
"Disable auto reply after" = "Automatisch antwoord uitschakelen na";
"Disable auto reply after" = "Disable auto reply after";
"Last day of vacation" = "Laatste vakantiedag";
"Enter date" = "Voer datum in";
/* Enable auto reply at this time of the day */
@@ -82,9 +82,9 @@
"You are not allowed to forward your messages to this domain:" = "U mag uw berichten niet doorsturen naar dit domein:";
/* notification */
"Notify incoming messsages" = "Meld binnenkomende berichten";
"Notification Message Sent" = "Meldingsbericht verzonden";
"Notification Message" = "Melding van nieuw bericht op %{0}";
"Notify incoming messsages" = "Notify incoming messsages";
"Notification Message Sent" = "Notification message sent";
"Notification Message" = "Notification of new message on %{0}";
/* d & t */
"Time Zone" = "Tijd Zone";
@@ -152,7 +152,7 @@
"Contacts Names" = "Contactnamen";
"Duplicate name" = "Dubbele naam";
"Calendar categories must have unique names." = "Kalendercategorieën moeten unieke namen hebben.";
"Disable e-mail notifications on CalDAV" = "E-mailmeldingen op CalDAV uitschakelen";
"Disable e-mail notifications on CalDAV" = "Disable e-mail notifications on CalDAV";
/* Default Calendar */
"Default calendar" = "Standaardagenda";
@@ -202,11 +202,11 @@
"Compose messages in" = "Berichten opstellen in";
"composemessagestype_html" = "HTML";
"composemessagestype_text" = "Platte tekst";
"Insert signature on new message" = "Handtekening invoegen bij nieuw bericht";
"Insert signature on reply" = "Handtekening invoegen bij antwoord";
"Insert signature on forward" = "Handtekening bij doorsturen invoegen";
"Show recipients or sender full email in mailboxes" = "Toon ontvangers of afzenders volledige e-mail in mailboxen";
"Hide attachements for inline images" = "Bijlagen voor inline-afbeeldingen verbergen";
"Insert signature on new message" = "Insert signature on new message";
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Standaard lettergrootte";
@@ -232,11 +232,11 @@
"Mail Account" = "Mailaccount";
"New Mail Account" = "Nieuw mailaccount";
"Server Name" = "Servernaam";
"Outgoing Server Name (SMTP)" = "Uitgaande servernaam (SMTP)";
"Smtp Auth" = "Smtp-authenticatie";
"Outgoing Server Name (SMTP)" = "Outgoing Server Name (SMTP)";
"Smtp Auth" = "Smtp Auth";
"Port" = "Poort";
"Encryption" = "Encryptie";
"Outgoing Encryption" = "Uitgaande encryptie";
"Outgoing Encryption" = "Outgoing Encryption";
"None" = "Geen";
"User Name" = "Gebruikersnaam";
"Full Name" = "Naam";
@@ -263,7 +263,7 @@
"Digitally sign the message by default" = "Standaard digitaal ondertekenen van het bericht";
"Always try to encrypt the message" = "Probeer altijd het bericht te versleutelen";
"An error occurred while importing the certificate. Verify your password." = "Er is een fout opgetreden tijdens het importeren van het certificaat. Controleer je wachtwoord.";
"Data too big. Please contact technical support." = "Gegevens te groot. Neem contact op met de technische ondersteuning.";
"Data too big. Please contact technical support." = "Data too big. Please contact technical support.";
/* Additional Parameters */
"Additional Parameters" = "Extra Parameters";
@@ -418,7 +418,7 @@
"Keep the message" = "Bewaar het bericht";
"Forward the message to" = "Stuur het bericht door naar";
"Notify the message to" = "Geef het bericht door aan";
"Notify the message to" = "Notify the message to";
/* Input field label of "forward" mail filter action */
"Email" = "E-mail";
@@ -499,8 +499,8 @@
"Enable two-factor authentication using a TOTP application" = "Twee-factor authenticatie met TOTP programma inschakelen";
"You must enter this key into your TOTP application." = "U moet deze sleutel in uw TOTP programma invoeren.";
"If you do not and you log out you will not be able to login again." = "Als u dit niet doet en uitlogt, zal u niet meer terug kunnen inloggen.";
"Enter TOTP verification code :" = "Voer de TOTP-verificatiecode in:";
"Invalid TOTP verification code" = "Ongeldige TOTP-verificatiecode";
"Enter TOTP verification code :" = "Enter TOTP verification code :";
"Invalid TOTP verification code" = "Invalid TOTP verification code";
/* External Sieve scripts */
"An external Sieve script is active" = "Een extern Sieve script is actief";
@@ -508,9 +508,9 @@
"Let SOGo handle everything" = "Laat SOGo alles beheren";
/* Password Recovery */
"Password recovery mode" = "Wachtwoordherstelmodus";
"Question" = "Vraag";
"Secondary e-mail" = "Secundair e-mailadres";
"Answer" = "Beantwoord";
"Password recovery" = "Wachtwoordherstelmodus";
"Password change" = "Wachtwoord wijzigen mislukt";
"Password recovery mode" = "Password recovery mode";
"Question" = "Question";
"Secondary e-mail" = "Secondary e-mail";
"Answer" = "Answer";
"Password recovery" = "Password recovery";
"Password change" = "Password change";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Default font size";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Oletuskirjasinkoko";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "ברירת מחדל גודל גופן";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Aláírás beszúrása válasz esetén";
"Insert signature on forward" = "Aláírás beszúrása továbbítás esetén";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Alapértelmezett betűméret";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Default font size";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Ukuran font default";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Grandezza carattere predefinita";
@@ -304,7 +304,7 @@
"SOGo Version" = "SOGoバージョン";
/* Confirmation asked when changing the language */
"Save preferences and reload page now?" = "ユーザー設定を保存してページを再読み込みしますか? / Save preferences and reload page now? (Yes -> はい)";
"Save preferences and reload page now?" = "ユーザー設定を保存してページを再読み込みしますか? / Save preferences and reload page now?";
"Language" = "言語";
"choose" = "選択...";
"Arabic" = "العربية";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Әдепкі қаріп өлшемі";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Noklusējuma fonta lielums";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Parašas po atsakymu";
"Insert signature on forward" = "Parašas po persiunčiamu laišku";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Numatytasis teksto dydis";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Стандардна големина на фонтот";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Podrazumijevana veličina fonta";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Default font size";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Marime font implicită";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Подразуевана величина фонта";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Podrazuevana veličina fonta";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Predvolená veľkosť písma";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Privzeta velikost črk";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Tamaño de fuente por defecto";
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Standardteckenstorlek";
+2 -4
View File
@@ -334,14 +334,12 @@ static SoProduct *preferencesProduct = nil;
[defaults setCalendarCategoriesColors: colors];
}
}
// Add the jitsi link if needed
// Add the jisti link if needed
sd = [SOGoSystemDefaults sharedSystemDefaults];
if([sd isCalendarJitsiLinkEnabled])
{
if (![[defaults source] objectForKey: @"SOGoCalendarJitsiBaseUrl"])
[[defaults source] setObject: [domainDefaults calendarJitsiBaseUrl] forKey: @"SOGoCalendarJitsiBaseUrl"];
if (![[defaults source] objectForKey: @"SOGoCalendarJitsiRoomPrefix"])
[[defaults source] setObject: [domainDefaults calendarJitsiRoomPrefix] forKey: @"SOGoCalendarJitsiRoomPrefix"];
[[defaults source] setObject: [domainDefaults calendarJistiBaseUrl] forKey: @"SOGoCalendarJitsiBaseUrl"];
}
//
@@ -206,7 +206,7 @@
"Insert signature on reply" = "Insert signature on reply";
"Insert signature on forward" = "Insert signature on forward";
"Show recipients or sender full email in mailboxes" = "Show recipients or sender full email in mailboxes";
"Hide attachements for inline images" = "Hide attachments for inline images";
"Hide attachements for inline images" = "Hide attachements for inline images";
/* Base font size for messages composed in HTML */
"Default font size" = "Maint ffont diofyn";
+7 -7
View File
@@ -65,7 +65,7 @@
"A total of %{0} events were imported in the calendar." = "Een totaal van %{0} afspraken is geïmporteerd naar de kalender.";
"Compose E-Mail to All Attendees" = "E-mail aan alle deelnemers opstellen";
"Compose E-Mail to Undecided Attendees" = "E-mail opstellen aan deelnemers die nog niet hebben gereageerd";
"Download iOS - MacOS configuration profile" = "Download iOS - MacOS configuratieprofiel";
"Download iOS - MacOS configuration profile" = "Download iOS - MacOS configuration profile";
/* Relative dates */
"Yesterday" = "Gisteren";
@@ -117,7 +117,7 @@
"Save and Close" = "Opslaan en sluiten";
"Close" = "Sluiten";
"Invite Attendees" = "Deelnemers uitnodigen";
"Create Jitsi Meeting" = "Jitsi-vergadering aanmaken";
"Create Jitsi Meeting" = "Create Jitsi Meeting";
"Attach" = "Koppelen";
"Update" = "Opslaan";
"Cancel" = "Annuleren";
@@ -378,7 +378,7 @@
"Show an Alert" = "Toon een waarschuwing";
"Send an E-mail" = "Stuur een E-mail";
"Email Organizer" = "E-mail organisator";
"Email Attendees (internal users)" = "E-mail deelnemers (interne gebruikers)";
"Email Attendees (internal users)" = "Email Attendees (internal users)";
"zoom_400" = "400%";
"zoom_200" = "200%";
"zoom_100" = "100%";
@@ -403,8 +403,8 @@
"To" = "Tot";
/* dates */
"DateFrom" = "Van";
"DateTo" = "Aan";
"DateFrom" = "From";
"DateTo" = "To";
/* validation errors */
validate_notitle = "U heeft geen titel opgegeven. Wilt u doorgaan?";
@@ -567,7 +567,7 @@ vtodo_class2 = "(Vertrouwelijke taak)";
"CalDAV URL" = "CalDAV-URL";
"WebDAV ICS URL" = "WebDAV ICS URL";
"WebDAV XML URL" = "WebDAV XML URL";
"Copy to clipboard" = "Kopiëren naar klembord";
"Copy to clipboard" = "Copy to clipboard";
/* Error messages */
"dayFieldInvalid" = "Vul een numerieke waarde in het veld Dagen in groter dan of gelijk aan 1.";
@@ -632,7 +632,7 @@ vtodo_class2 = "(Vertrouwelijke taak)";
"Rename" = "Hernoem";
"Import Calendar" = "Agenda Importeren";
"Select an ICS file." = "Selecteer een ICS bestand.";
"You have modified data unsaved. Do you want to close popup and loose data ?" = "U heeft gewijzigde gegevens die niet zijn opgeslagen. Wilt u de pop-up sluiten en uw gegevens verliezen?";
"You have modified data unsaved. Do you want to close popup and loose data ?" = "You have modified data unsaved. Do you want to close popup and loose data ?";
/* Notification when user subscribes to a calendar */
"Successfully subscribed to calendar" = "Abonneren op agenda succesvol";
@@ -341,7 +341,7 @@
/* Appointment categories */
"category_none" = "なし";
"category_labels" = "記念日,誕生日,ビジネス,訪問,顧客,コンテスト,得意先,お気に入り,フォローアップ,ギフト,休日,計画,ミーティング,発行,色々,私事,プロジェクト,祝日,状態,配達,旅行,休暇";
"category_labels" = "記念日,誕生日,ビジネス,業務,呼び出し,顧客,競合,取引先,お気に入り,フォローアップ,贈り物,休日,アイデア,打ち合わせ,問題,その他,個人,プロジェクト,祝日,状態,供給者,旅行,休暇";
"repeat_NEVER" = "繰り返さない";
"repeat_DAILY" = "毎日";
"repeat_WEEKLY" = "毎週";
@@ -117,7 +117,7 @@
"Save and Close" = "Guardar e Fechar";
"Close" = "Fechar";
"Invite Attendees" = "Convidar Participantes";
"Create Jitsi Meeting" = "Criar reunião no Jitsi";
"Create Jitsi Meeting" = "Create Jitsi Meeting";
"Attach" = "Anexar";
"Update" = "Atualizar";
"Cancel" = "Cancelar";
@@ -117,7 +117,7 @@
"Save and Close" = "Kaydet ve Kapat";
"Close" = "Kapat";
"Invite Attendees" = "Katılımcı davet et";
"Create Jitsi Meeting" = "Jitsi görüşmesi oluştur";
"Create Jitsi Meeting" = "Create Jitsi Meeting";
"Attach" = "Ekle";
"Update" = "Güncelle";
"Cancel" = "İptal";
+1 -18
View File
@@ -19,7 +19,6 @@
*/
#import <Foundation/NSValue.h>
#import <Foundation/NSURL.h>
#import <NGCards/iCalToDo.h>
#import <NGCards/iCalTrigger.h>
@@ -597,7 +596,6 @@ static NSArray *reminderValues = nil;
NSMutableArray *attachUrls;
NSArray *values;
NSString *attachUrl;
NSURL *url;
NSUInteger count, max;
values = [component attach];
@@ -615,19 +613,12 @@ static NSArray *reminderValues = nil;
else
attachUrls = nil;
url = [component url];
if(url && attachUrls)
[attachUrls addObject: [NSDictionary dictionaryWithObject: [url absoluteString] forKey: @"value"]];
else
attachUrls = [NSArray arrayWithObjects: [NSDictionary dictionaryWithObject: [url absoluteString] forKey: @"value"], nil];
return attachUrls;
}
- (void) setAttributes: (NSDictionary *) data
{
NSArray *values;
NSURL *url;
NSCalendarDate *now;
NSMutableArray *attachUrls;
NSMutableDictionary *dataWithOwner;
@@ -657,26 +648,18 @@ static NSArray *reminderValues = nil;
[self _handleOrganizer];
//Be careful. The way sogo works, it only uses the property ATTACH for the url.
//But the other property URL, in the ics, will also be seen as an ATTACH in the UI.
//To avoid having both ATTACH and URL with the same uri, check the presence and value of URL first.
if ([[data objectForKey: @"attachUrls"] isKindOfClass: [NSArray class]])
{
values = [component childrenWithTag: @"attach"];
[component removeChildren: values];
values = [data objectForKey: @"attachUrls"];
url = [component url];
attachUrls = [NSMutableArray arrayWithCapacity: [values count]];
for (i = 0; i < [values count]; i++)
{
o = [values objectAtIndex: i];
if ([o isKindOfClass: [NSDictionary class]])
{
if(url && [[url absoluteString] isEqualToString: [o objectForKey: @"value"]])
continue; //this uri is already in URL property
else
[attachUrls addObject: [o objectForKey: @"value"]];
[attachUrls addObject: [o objectForKey: @"value"]];
}
}
}
@@ -716,7 +716,7 @@
ng-model="app.preferences.defaults.SOGoMailHideInlineAttachments"
ng-true-value="1"
ng-false-value="0"
label:aria-label="Hide attachments for inline images">
label:aria-label="Hide attachements for inline images">
<var:string label:value="Hide attachements for inline images"/>
</md-checkbox>
</div>
@@ -748,7 +748,7 @@
</div>
</div>
<div layout="row" layout-align="start center" flex="50" flex-xs="100">
<div class="hide-xs" layout="row" layout-align="start center" flex="50">
<md-checkbox
class="md-align-top-left"
ng-model="app.preferences.defaults.SOGoMailComposeWindowEnabled"
@@ -756,7 +756,7 @@
<!-- SOGoMailComposeWindow -->
</md-checkbox>
<md-input-container class="md-block md-flex">
<md-input-container class="md-block md-flex hide-xs">
<label><var:string label:value="Always open mail composer"/></label>
<md-select
ng-disabled="!app.preferences.defaults.SOGoMailComposeWindowEnabled"
Loaded 100 of 119 files, more files were not shown because too many files have changed in this diff. Show more