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 <Foundation/NSValue.h>
27 #import <NGObjWeb/WOApplication.h>
28 #import <NGObjWeb/WOContext.h>
29 #import <NGObjWeb/WORequest.h>
30 #import <NGObjWeb/SoObject.h>
31 #import <NGExtensions/NSNull+misc.h>
33 #import "AgenorUserDefaults.h"
34 #import "LDAPUserManager.h"
35 #import "SOGoDateFormatter.h"
36 #import "SOGoObject.h"
37 #import "SOGoPermissions.h"
38 #import "NSArray+Utilities.h"
42 static NSTimeZone *serverTimeZone = nil;
43 static NSString *fallbackIMAP4Server = nil;
44 static NSString *defaultLanguage = nil;
45 static NSArray *superUsernames = nil;
46 static NSURL *AgenorProfileURL = nil;
47 static BOOL acceptAnyUser = NO;
49 NSString *SOGoWeekStartHideWeekNumbers = @"HideWeekNumbers";
50 NSString *SOGoWeekStartJanuary1 = @"January1";
51 NSString *SOGoWeekStartFirst4DayWeek = @"First4DayWeek";
52 NSString *SOGoWeekStartFirstFullWeek = @"FirstFullWeek";
54 @interface NSObject (SOGoRoles)
56 - (NSArray *) rolesOfUser: (NSString *) uid;
60 @implementation SoUser (SOGoExtension)
62 - (NSString *) language
64 return [SOGoUser language];
69 @implementation SOGoUser
77 ud = [NSUserDefaults standardUserDefaults];
80 tzName = [ud stringForKey: @"SOGoServerTimeZone"];
83 serverTimeZone = [NSTimeZone timeZoneWithName: tzName];
84 [serverTimeZone retain];
86 if (!AgenorProfileURL)
88 profileURL = [ud stringForKey: @"AgenorProfileURL"];
89 AgenorProfileURL = [[NSURL alloc] initWithString: profileURL];
91 if (!fallbackIMAP4Server)
92 ASSIGN (fallbackIMAP4Server,
93 [ud stringForKey: @"SOGoFallbackIMAP4Server"]);
96 ASSIGN (defaultLanguage, [ud stringForKey: @"SOGoDefaultLanguage"]);
98 ASSIGN (defaultLanguage, @"English");
101 ASSIGN (superUsernames, [ud arrayForKey: @"SOGoSuperUsernames"]);
103 acceptAnyUser = ([[ud stringForKey: @"SOGoAuthentificationMethod"]
104 isEqualToString: @"bypass"]);
107 + (NSString *) language
113 context = [[WOApplication application] context];
114 bLanguages = [[context request] browserLanguages];
115 if ([bLanguages count] > 0)
116 lng = [bLanguages objectAtIndex: 0];
119 lng = defaultLanguage;
124 + (SOGoUser *) userWithLogin: (NSString *) newLogin
125 roles: (NSArray *) newRoles
129 user = [[self alloc] initWithLogin: newLogin roles: newRoles];
137 if ((self = [super init]))
143 currentPassword = nil;
151 - (id) initWithLogin: (NSString *) newLogin
152 roles: (NSArray *) newRoles
158 || [newLogin isEqualToString: @"anonymous"]
159 || [newLogin isEqualToString: @"freebusy"])
163 um = [LDAPUserManager sharedUserManager];
164 realUID = [[um contactInfosForUserWithUIDorEmail: newLogin]
165 objectForKey: @"c_uid"];
167 self = [super initWithLogin: realUID roles: newRoles];
174 [currentPassword release];
175 [userDefaults release];
176 [userSettings release];
179 [dateFormatter release];
180 [homeFolder release];
184 - (void) setCurrentPassword: (NSString *) newPassword
186 ASSIGN (currentPassword, newPassword);
189 - (NSString *) currentPassword
191 return currentPassword;
194 - (id) _fetchFieldForUser: (NSString *) field
196 NSDictionary *contactInfos;
199 um = [LDAPUserManager sharedUserManager];
200 contactInfos = [um contactInfosForUserWithUIDorEmail: login];
202 return [contactInfos objectForKey: field];
205 - (void) _fetchAllEmails
207 allEmails = [self _fetchFieldForUser: @"emails"];
213 cn = [self _fetchFieldForUser: @"cn"];
219 // - (NSString *) fullEmail
221 // return [[LDAPUserManager sharedUserManager] getFullEmailForUID: login];
224 // - (NSString *) primaryEmail
227 // [self _fetchAllEmails];
229 // return [allEmails objectAtIndex: 0];
232 - (NSArray *) allEmails
235 [self _fetchAllEmails];
240 - (NSString *) systemEmail
243 [self _fetchAllEmails];
245 return [allEmails lastObject];
248 - (BOOL) hasEmail: (NSString *) email
251 [self _fetchAllEmails];
253 return [allEmails containsCaseInsensitiveString: email];
264 // - (NSString *) primaryMailServer
266 // return [[self userManager] getServerForUID: [self login]];
269 // - (NSArray *) additionalIMAP4AccountStrings
271 // return [[self userManager]getSharedMailboxAccountStringsForUID: [self login]];
274 // - (NSArray *) additionalEMailAddresses
276 // return [[self userManager] getSharedMailboxEMailsForUID: [self login]];
279 // - (NSDictionary *) additionalIMAP4AccountsAndEMails
281 // return [[self userManager] getSharedMailboxesAndEMailsForUID: [self login]];
284 - (NSURL *) freeBusyURL
289 - (SOGoDateFormatter *) dateFormatterInContext: (WOContext *) context
296 dateFormatter = [SOGoDateFormatter new];
297 [dateFormatter setLocale: [context valueForKey: @"locale"]];
298 ud = [self userDefaults];
299 format = [ud stringForKey: @"ShortDateFormat"];
301 [dateFormatter setShortDateFormat: format];
302 format = [ud stringForKey: @"LongDateFormat"];
304 [dateFormatter setLongDateFormat: format];
305 format = [ud stringForKey: @"TimeFormat"];
307 [dateFormatter setTimeFormat: format];
310 return dateFormatter;
315 - (NSUserDefaults *) userDefaults
319 = [[AgenorUserDefaults alloc] initWithTableURL: AgenorProfileURL
321 fieldName: @"c_defaults"];
326 - (NSUserDefaults *) userSettings
330 = [[AgenorUserDefaults alloc] initWithTableURL: AgenorProfileURL
332 fieldName: @"c_settings"];
337 - (NSString *) language
341 language = [[self userDefaults] stringForKey: @"Language"];
342 if (![language length])
343 language = [SOGoUser language];
350 - (NSTimeZone *) timeZone
352 NSString *timeZoneName;
356 timeZoneName = [[self userDefaults] stringForKey: @"TimeZone"];
357 if ([timeZoneName length] > 0)
358 userTimeZone = [NSTimeZone timeZoneWithName: timeZoneName];
360 userTimeZone = serverTimeZone;
361 [userTimeZone retain];
367 - (NSTimeZone *) serverTimeZone
369 return serverTimeZone;
373 - (void) _prepareDefaultMailAccounts
375 NSMutableDictionary *mailAccount, *identity;
376 NSMutableArray *identities;
377 NSString *name, *fullName;
379 unsigned int count, max;
381 mailAccount = [NSMutableDictionary dictionary];
382 name = [NSString stringWithFormat: @"%@@%@",
383 login, fallbackIMAP4Server];
384 [mailAccount setObject: login forKey: @"userName"];
385 [mailAccount setObject: fallbackIMAP4Server forKey: @"serverName"];
386 [mailAccount setObject: name forKey: @"name"];
388 identities = [NSMutableArray array];
389 mails = [self allEmails];
394 for (count = 0; count < max; count++)
396 identity = [NSMutableDictionary dictionary];
397 fullName = [self cn];
398 if (![fullName length])
400 [identity setObject: fullName forKey: @"fullName"];
401 [identity setObject: [mails objectAtIndex: count] forKey: @"email"];
402 [identities addObject: identity];
404 [[identities objectAtIndex: 0] setObject: [NSNumber numberWithBool: YES]
405 forKey: @"isDefault"];
407 [mailAccount setObject: identities forKey: @"identities"];
409 mailAccounts = [NSMutableArray new];
410 [mailAccounts addObject: mailAccount];
413 - (NSArray *) mailAccounts
419 ud = [self userDefaults];
420 mailAccounts = [ud objectForKey: @"MailAccounts"];
422 [mailAccounts retain];
424 [self _prepareDefaultMailAccounts];
431 @interface SOGoMailIdentity : NSObject
436 NSString *organization;
439 NSString *sentFolderName;
441 NSString *draftsFolderName;
442 NSString *templatesFolderName;
450 - (void) setName: (NSString *) _value;
453 - (void) setEmail: (NSString *) _value;
454 - (NSString *) email;
456 - (void) setReplyTo: (NSString *) _value;
457 - (NSString *) replyTo;
459 - (void) setOrganization: (NSString *) _value;
460 - (NSString *) organization;
462 - (void) setSignature: (NSString *) _value;
463 - (NSString *) signature;
464 - (BOOL) hasSignature;
466 - (void) setVCard: (NSString *) _value;
467 - (NSString *) vCard;
470 - (void) setSentFolderName: (NSString *) _value;
471 - (NSString *) sentFolderName;
473 - (void) setSentBCC: (NSString *) _value;
474 - (NSString *) sentBCC;
476 - (void) setDraftsFolderName: (NSString *) _value;
477 - (NSString *) draftsFolderName;
479 - (void) setTemplatesFolderName: (NSString *) _value;
480 - (NSString *) templatesFolderName;
484 - (NSArray *) allIdentities
489 identities = [mailAccounts objectsForKey: @"identities"];
491 return [identities flattenedArray];
494 - (NSDictionary *) primaryIdentity
496 NSDictionary *defaultAccount;
499 defaultAccount = [mailAccounts objectAtIndex: 0];
501 return [[defaultAccount objectForKey: @"identities"] objectAtIndex: 0];
504 - (NSString *) messageForwarding
506 NSString *messageForwarding;
509 = [[self userDefaults] stringForKey: @"MessageForwarding"];
510 if (![messageForwarding length])
511 messageForwarding = @"inline";
513 return messageForwarding;
516 - (NSString *) messageCheck
518 NSString *messageCheck;
521 = [[self userDefaults] stringForKey: @"MessageCheck"];
522 if (![messageCheck length])
523 messageCheck = @"manually";
530 // TODO: those methods should check whether the traversal stack in the context
531 // already contains proper folders to improve caching behaviour
533 - (SOGoUserFolder *) homeFolderInContext: (id) context
537 homeFolder = [[WOApplication application] lookupName: [self login]
546 - (SOGoAppointmentFolders *) calendarsFolderInContext: (WOContext *) context
548 return [[self homeFolderInContext: context] lookupName: @"Calendar"
553 - (SOGoAppointmentFolder *)
554 personalCalendarFolderInContext: (WOContext *) context
556 return [[self calendarsFolderInContext: context] lookupName: @"personal"
561 // - (id) schedulingCalendarInContext: (id) _ctx
563 // /* Note: watch out for cyclic references */
566 // folder = [(WOContext *)_ctx objectForKey:@"ActiveUserCalendar"];
567 // if (folder != nil)
568 // return [folder isNotNull] ? folder : nil;
570 // folder = [self homeFolderInContext:_ctx];
571 // if ([folder isKindOfClass:[NSException class]])
574 // folder = [folder lookupName:@"Calendar" inContext:_ctx acquire:NO];
575 // if ([folder isKindOfClass:[NSException class]])
578 // [(WOContext *)_ctx setObject:folder ? folder : [NSNull null]
579 // forKey:@"ActiveUserCalendar"];
583 - (NSArray *) rolesForObject: (NSObject *) object
584 inContext: (WOContext *) context
586 NSMutableArray *rolesForObject;
589 rolesForObject = [NSMutableArray new];
590 [rolesForObject autorelease];
592 sogoRoles = [super rolesForObject: object inContext: context];
594 [rolesForObject addObjectsFromArray: sogoRoles];
596 if ((superUsernames && [superUsernames containsObject: login])
597 || [[object ownerInContext: context] isEqualToString: login])
598 [rolesForObject addObject: SoRole_Owner];
599 if ([object isKindOfClass: [SOGoObject class]])
601 sogoRoles = [(SOGoObject *) object aclsForUser: login];
603 [rolesForObject addObjectsFromArray: sogoRoles];
606 return rolesForObject;