2 Copyright (C) 2005 SKYRIX Software AG
4 This file is part of OpenGroupware.org.
6 OGo is free software; you can redistribute it and/or modify it under
7 the terms of the GNU Lesser General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 OGo is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with OGo; see the file COPYING. If not, write to the
18 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 #import <Foundation/NSArray.h>
23 #import <Foundation/NSNull.h>
24 #import <Foundation/NSTimeZone.h>
25 #import <Foundation/NSUserDefaults.h>
26 #import <NGObjWeb/WOApplication.h>
27 #import <NGObjWeb/SoObject.h>
28 #import <NGExtensions/NSNull+misc.h>
30 #import "AgenorUserDefaults.h"
31 #import "LDAPUserManager.h"
32 #import "SOGoDateFormatter.h"
33 #import "SOGoObject.h"
34 #import "SOGoPermissions.h"
35 #import "NSArray+Utilities.h"
39 static NSTimeZone *serverTimeZone = nil;
40 static NSString *fallbackIMAP4Server = nil;
41 static NSString *defaultLanguage = nil;
42 static NSString *superUsername = nil;
43 static NSURL *AgenorProfileURL = nil;
44 static BOOL acceptAnyUser = NO;
46 NSString *SOGoWeekStartHideWeekNumbers = @"HideWeekNumbers";
47 NSString *SOGoWeekStartJanuary1 = @"January1";
48 NSString *SOGoWeekStartFirst4DayWeek = @"First4DayWeek";
49 NSString *SOGoWeekStartFirstFullWeek = @"FirstFullWeek";
51 @interface NSObject (SOGoRoles)
53 - (NSArray *) rolesOfUser: (NSString *) uid;
57 @implementation SOGoUser
61 NSString *tzName, *nsUsername;
65 ud = [NSUserDefaults standardUserDefaults];
68 tzName = [ud stringForKey: @"SOGoServerTimeZone"];
71 serverTimeZone = [NSTimeZone timeZoneWithName: tzName];
72 [serverTimeZone retain];
74 if (!AgenorProfileURL)
76 profileURL = [ud stringForKey: @"AgenorProfileURL"];
77 AgenorProfileURL = [[NSURL alloc] initWithString: profileURL];
79 if (!fallbackIMAP4Server)
80 ASSIGN (fallbackIMAP4Server,
81 [ud stringForKey: @"SOGoFallbackIMAP4Server"]);
84 ASSIGN (defaultLanguage, [ud stringForKey: @"SOGoDefaultLanguage"]);
86 ASSIGN (defaultLanguage, @"English");
90 nsUsername = [ud stringForKey: @"SOGoSuperUsername"];
91 if ([nsUsername length] > 0)
92 ASSIGN (superUsername, nsUsername);
95 acceptAnyUser = (![ud stringForKey: @"AuthentificationMethod"]);
98 + (SOGoUser *) userWithLogin: (NSString *) newLogin
99 roles: (NSArray *) newRoles
103 user = [[self alloc] initWithLogin: newLogin roles: newRoles];
111 if ((self = [super init]))
117 currentPassword = nil;
124 - (id) initWithLogin: (NSString *) newLogin
125 roles: (NSArray *) newRoles
131 || [newLogin isEqualToString: @"anonymous"]
132 || [newLogin isEqualToString: @"freebusy"])
136 um = [LDAPUserManager sharedUserManager];
137 realUID = [[um contactInfosForUserWithUIDorEmail: newLogin]
138 objectForKey: @"c_uid"];
140 self = [super initWithLogin: realUID roles: newRoles];
147 [currentPassword release];
148 [userDefaults release];
149 [userSettings release];
152 [dateFormatter release];
156 - (void) setCurrentPassword: (NSString *) newPassword
158 ASSIGN (currentPassword, newPassword);
161 - (NSString *) currentPassword
163 return currentPassword;
166 - (id) _fetchFieldForUser: (NSString *) field
168 NSDictionary *contactInfos;
171 um = [LDAPUserManager sharedUserManager];
172 contactInfos = [um contactInfosForUserWithUIDorEmail: login];
174 return [contactInfos objectForKey: field];
177 - (void) _fetchAllEmails
179 allEmails = [self _fetchFieldForUser: @"emails"];
185 cn = [self _fetchFieldForUser: @"cn"];
191 - (NSString *) fullEmail
193 return [[LDAPUserManager sharedUserManager] getFullEmailForUID: login];
196 - (NSString *) primaryEmail
199 [self _fetchAllEmails];
201 return [allEmails objectAtIndex: 0];
204 - (NSString *) systemEmail
207 [self _fetchAllEmails];
209 return [allEmails lastObject];
212 - (NSArray *) allEmails
215 [self _fetchAllEmails];
220 - (BOOL) hasEmail: (NSString *) email
223 [self _fetchAllEmails];
225 return [allEmails containsCaseInsensitiveString: email];
236 - (NSString *) primaryIMAP4AccountString
238 return [NSString stringWithFormat: @"%@@%@", login, fallbackIMAP4Server];
241 // - (NSString *) primaryMailServer
243 // return [[self userManager] getServerForUID: [self login]];
246 // - (NSArray *) additionalIMAP4AccountStrings
248 // return [[self userManager]getSharedMailboxAccountStringsForUID: [self login]];
251 // - (NSArray *) additionalEMailAddresses
253 // return [[self userManager] getSharedMailboxEMailsForUID: [self login]];
256 // - (NSDictionary *) additionalIMAP4AccountsAndEMails
258 // return [[self userManager] getSharedMailboxesAndEMailsForUID: [self login]];
261 - (NSURL *) freeBusyURL
266 - (SOGoDateFormatter *) dateFormatterInContext: (WOContext *) context
273 dateFormatter = [SOGoDateFormatter new];
274 [dateFormatter setLocale: [context valueForKey: @"locale"]];
275 ud = [self userDefaults];
276 format = [ud stringForKey: @"ShortDateFormat"];
278 [dateFormatter setShortDateFormat: format];
279 format = [ud stringForKey: @"LongDateFormat"];
281 [dateFormatter setLongDateFormat: format];
282 format = [ud stringForKey: @"TimeFormat"];
284 [dateFormatter setTimeFormat: format];
287 return dateFormatter;
292 - (NSUserDefaults *) userDefaults
296 = [[AgenorUserDefaults alloc] initWithTableURL: AgenorProfileURL
298 fieldName: @"defaults"];
303 - (NSUserDefaults *) userSettings
307 = [[AgenorUserDefaults alloc] initWithTableURL: AgenorProfileURL
309 fieldName: @"settings"];
314 - (NSString *) language
318 language = [[self userDefaults] stringForKey: @"Language"];
320 language = defaultLanguage;
327 - (NSTimeZone *) timeZone
329 NSString *timeZoneName;
333 timeZoneName = [[self userDefaults] stringForKey: @"TimeZone"];
334 if ([timeZoneName length] > 0)
335 userTimeZone = [NSTimeZone timeZoneWithName: timeZoneName];
337 userTimeZone = serverTimeZone;
338 [userTimeZone retain];
344 - (NSTimeZone *) serverTimeZone
346 return serverTimeZone;
351 // TODO: those methods should check whether the traversal stack in the context
352 // already contains proper folders to improve caching behaviour
354 - (id) homeFolderInContext: (id) _ctx
356 /* Note: watch out for cyclic references */
357 // TODO: maybe we should add an [activeUser reset] method to SOPE
360 folder = [(WOContext *)_ctx objectForKey:@"ActiveUserHomeFolder"];
362 return [folder isNotNull] ? folder : nil;
364 folder = [[WOApplication application] lookupName: [self login]
367 if ([folder isKindOfClass:[NSException class]])
370 [(WOContext *)_ctx setObject: ((folder)
373 forKey: @"ActiveUserHomeFolder"];
377 // - (id) schedulingCalendarInContext: (id) _ctx
379 // /* Note: watch out for cyclic references */
382 // folder = [(WOContext *)_ctx objectForKey:@"ActiveUserCalendar"];
383 // if (folder != nil)
384 // return [folder isNotNull] ? folder : nil;
386 // folder = [self homeFolderInContext:_ctx];
387 // if ([folder isKindOfClass:[NSException class]])
390 // folder = [folder lookupName:@"Calendar" inContext:_ctx acquire:NO];
391 // if ([folder isKindOfClass:[NSException class]])
394 // [(WOContext *)_ctx setObject:folder ? folder : [NSNull null]
395 // forKey:@"ActiveUserCalendar"];
399 - (NSArray *) rolesForObject: (NSObject *) object
400 inContext: (WOContext *) context
402 NSMutableArray *rolesForObject;
405 rolesForObject = [NSMutableArray new];
406 [rolesForObject autorelease];
408 sogoRoles = [super rolesForObject: object inContext: context];
410 [rolesForObject addObjectsFromArray: sogoRoles];
412 if ((superUsername && [login isEqualToString: superUsername])
413 || [[object ownerInContext: context] isEqualToString: login])
414 [rolesForObject addObject: SoRole_Owner];
415 if ([object isKindOfClass: [SOGoObject class]])
417 sogoRoles = [(SOGoObject *) object aclsForUser: login];
419 [rolesForObject addObjectsFromArray: sogoRoles];
422 return rolesForObject;