]> err.no Git - scalable-opengroupware.org/blob - SoObjects/SOGo/SOGoUser.m
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1101 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / SoObjects / SOGo / SOGoUser.m
1 /*
2   Copyright (C) 2005 SKYRIX Software AG
3
4   This file is part of OpenGroupware.org.
5
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
9   later version.
10
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.
15
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
19   02111-1307, USA.
20 */
21
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>
29
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"
36
37 #import "SOGoUser.h"
38
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;
45
46 NSString *SOGoWeekStartHideWeekNumbers = @"HideWeekNumbers";
47 NSString *SOGoWeekStartJanuary1 = @"January1";
48 NSString *SOGoWeekStartFirst4DayWeek = @"First4DayWeek";
49 NSString *SOGoWeekStartFirstFullWeek = @"FirstFullWeek";
50
51 @interface NSObject (SOGoRoles)
52
53 - (NSArray *) rolesOfUser: (NSString *) uid;
54
55 @end
56
57 @implementation SOGoUser
58
59 + (void) initialize
60 {
61   NSString *tzName, *nsUsername;
62   NSUserDefaults *ud;
63   NSString *profileURL;
64
65   ud = [NSUserDefaults standardUserDefaults];
66   if (!serverTimeZone)
67     {
68       tzName = [ud stringForKey: @"SOGoServerTimeZone"];
69       if (!tzName)
70         tzName = @"UTC";
71       serverTimeZone = [NSTimeZone timeZoneWithName: tzName];
72       [serverTimeZone retain];
73     }
74   if (!AgenorProfileURL)
75     {
76       profileURL = [ud stringForKey: @"AgenorProfileURL"];
77       AgenorProfileURL = [[NSURL alloc] initWithString: profileURL];
78     }
79   if (!fallbackIMAP4Server)
80     ASSIGN (fallbackIMAP4Server,
81             [ud stringForKey: @"SOGoFallbackIMAP4Server"]);
82   if (!defaultLanguage)
83     {
84       ASSIGN (defaultLanguage, [ud stringForKey: @"SOGoDefaultLanguage"]);
85       if (!defaultLanguage)
86         ASSIGN (defaultLanguage, @"English");
87     }
88   if (!superUsername)
89     {
90       nsUsername = [ud stringForKey: @"SOGoSuperUsername"];
91       if ([nsUsername length] > 0)
92         ASSIGN (superUsername, nsUsername);
93     }
94
95   acceptAnyUser = (![ud stringForKey: @"AuthentificationMethod"]);
96 }
97
98 + (SOGoUser *) userWithLogin: (NSString *) newLogin
99                        roles: (NSArray *) newRoles
100 {
101   SOGoUser *user;
102
103   user = [[self alloc] initWithLogin: newLogin roles: newRoles];
104   [user autorelease];
105
106   return user;
107 }
108
109 - (id) init
110 {
111   if ((self = [super init]))
112     {
113       userDefaults = nil;
114       userSettings = nil;
115       allEmails = nil;
116       language = nil;
117       currentPassword = nil;
118       dateFormatter = nil;
119     }
120
121   return self;
122 }
123
124 - (id) initWithLogin: (NSString *) newLogin
125                roles: (NSArray *) newRoles
126 {
127   LDAPUserManager *um;
128   NSString *realUID;
129
130   if (acceptAnyUser
131       || [newLogin isEqualToString: @"anonymous"]
132       || [newLogin isEqualToString: @"freebusy"])
133     realUID = newLogin;
134   else
135     {
136       um = [LDAPUserManager sharedUserManager];
137       realUID = [[um contactInfosForUserWithUIDorEmail: newLogin]
138                   objectForKey: @"c_uid"];
139     }
140   self = [super initWithLogin: realUID roles: newRoles];
141
142   return self;
143 }
144
145 - (void) dealloc
146 {
147   [currentPassword release];
148   [userDefaults release];
149   [userSettings release];
150   [allEmails release];
151   [language release];
152   [dateFormatter release];
153   [super dealloc];
154 }
155
156 - (void) setCurrentPassword: (NSString *) newPassword
157 {
158   ASSIGN (currentPassword, newPassword);
159 }
160
161 - (NSString *) currentPassword
162 {
163   return currentPassword;
164 }
165
166 - (id) _fetchFieldForUser: (NSString *) field
167 {
168   NSDictionary *contactInfos;
169   LDAPUserManager *um;
170
171   um = [LDAPUserManager sharedUserManager];
172   contactInfos = [um contactInfosForUserWithUIDorEmail: login];
173
174   return [contactInfos objectForKey: field];
175 }
176
177 - (void) _fetchAllEmails
178 {
179   allEmails = [self _fetchFieldForUser: @"emails"];
180   [allEmails retain];
181 }
182
183 - (void) _fetchCN
184 {
185   cn = [self _fetchFieldForUser: @"cn"];
186   [cn retain];
187 }
188
189 /* properties */
190
191 - (NSString *) fullEmail
192 {
193   return [[LDAPUserManager sharedUserManager] getFullEmailForUID: login];
194 }
195
196 - (NSString *) primaryEmail
197 {
198   if (!allEmails)
199     [self _fetchAllEmails];
200
201   return [allEmails objectAtIndex: 0];
202 }
203
204 - (NSString *) systemEmail
205 {
206   if (!allEmails)
207     [self _fetchAllEmails];
208
209   return [allEmails lastObject];
210 }
211
212 - (NSArray *) allEmails
213 {
214   if (!allEmails)
215     [self _fetchAllEmails];
216
217   return allEmails;  
218 }
219
220 - (BOOL) hasEmail: (NSString *) email
221 {
222   if (!allEmails)
223     [self _fetchAllEmails];
224   
225   return [allEmails containsCaseInsensitiveString: email];
226 }
227
228 - (NSString *) cn
229 {
230   if (!cn)
231     [self _fetchCN];
232
233   return cn;
234 }
235
236 - (NSString *) primaryIMAP4AccountString
237 {
238   return [NSString stringWithFormat: @"%@@%@", login, fallbackIMAP4Server];
239 }
240
241 // - (NSString *) primaryMailServer
242 // {
243 //   return [[self userManager] getServerForUID: [self login]];
244 // }
245
246 // - (NSArray *) additionalIMAP4AccountStrings
247 // {
248 //   return [[self userManager]getSharedMailboxAccountStringsForUID: [self login]];
249 // }
250
251 // - (NSArray *) additionalEMailAddresses
252 // {
253 //   return [[self userManager] getSharedMailboxEMailsForUID: [self login]];
254 // }
255
256 // - (NSDictionary *) additionalIMAP4AccountsAndEMails
257 // {
258 //   return [[self userManager] getSharedMailboxesAndEMailsForUID: [self login]];
259 // }
260
261 - (NSURL *) freeBusyURL
262 {
263   return nil;
264 }
265
266 - (SOGoDateFormatter *) dateFormatterInContext: (WOContext *) context
267 {
268   NSString *format;
269   NSUserDefaults *ud;
270
271   if (!dateFormatter)
272     {
273       dateFormatter = [SOGoDateFormatter new];
274       [dateFormatter setLocale: [context valueForKey: @"locale"]];
275       ud = [self userDefaults];
276       format = [ud stringForKey: @"ShortDateFormat"];
277       if (format)
278         [dateFormatter setShortDateFormat: format];
279       format = [ud stringForKey: @"LongDateFormat"];
280       if (format)
281         [dateFormatter setLongDateFormat: format];
282       format = [ud stringForKey: @"TimeFormat"];
283       if (format)
284         [dateFormatter setTimeFormat: format];
285     }
286
287   return dateFormatter;
288 }
289
290 /* defaults */
291
292 - (NSUserDefaults *) userDefaults
293 {
294   if (!userDefaults)
295     userDefaults
296       = [[AgenorUserDefaults alloc] initWithTableURL: AgenorProfileURL
297                                     uid: login
298                                     fieldName: @"defaults"];
299
300   return userDefaults;
301 }
302
303 - (NSUserDefaults *) userSettings
304 {
305   if (!userSettings)
306     userSettings
307       = [[AgenorUserDefaults alloc] initWithTableURL: AgenorProfileURL
308                                     uid: login
309                                     fieldName: @"settings"];
310
311   return userSettings;
312 }
313
314 - (NSString *) language
315 {
316   if (!language)
317     {
318       language = [[self userDefaults] stringForKey: @"Language"];
319       if (!language)
320         language = defaultLanguage;
321       [language retain];
322     }
323
324   return language;
325 }
326
327 - (NSTimeZone *) timeZone
328 {
329   NSString *timeZoneName;
330
331   if (!userTimeZone)
332     {
333       timeZoneName = [[self userDefaults] stringForKey: @"TimeZone"];
334       if ([timeZoneName length] > 0)
335         userTimeZone = [NSTimeZone timeZoneWithName: timeZoneName];
336       if (!userTimeZone)
337         userTimeZone = serverTimeZone;
338       [userTimeZone retain];
339     }
340
341   return userTimeZone;
342 }
343
344 - (NSTimeZone *) serverTimeZone
345 {
346   return serverTimeZone;
347 }
348
349 /* folders */
350
351 // TODO: those methods should check whether the traversal stack in the context
352 //       already contains proper folders to improve caching behaviour
353
354 - (id) homeFolderInContext: (id) _ctx
355 {
356   /* Note: watch out for cyclic references */
357   // TODO: maybe we should add an [activeUser reset] method to SOPE
358   id folder;
359   
360   folder = [(WOContext *)_ctx objectForKey:@"ActiveUserHomeFolder"];
361   if (folder != nil)
362     return [folder isNotNull] ? folder : nil;
363   
364   folder = [[WOApplication application] lookupName: [self login]
365                                         inContext: _ctx
366                                         acquire: NO];
367   if ([folder isKindOfClass:[NSException class]])
368     return folder;
369   
370   [(WOContext *)_ctx setObject: ((folder)
371                                  ? folder
372                                  : [NSNull null])
373                 forKey: @"ActiveUserHomeFolder"];
374   return folder;
375 }
376
377 // - (id) schedulingCalendarInContext: (id) _ctx
378 // {
379 //   /* Note: watch out for cyclic references */
380 //   id folder;
381
382 //   folder = [(WOContext *)_ctx objectForKey:@"ActiveUserCalendar"];
383 //   if (folder != nil)
384 //     return [folder isNotNull] ? folder : nil;
385
386 //   folder = [self homeFolderInContext:_ctx];
387 //   if ([folder isKindOfClass:[NSException class]])
388 //     return folder;
389   
390 //   folder = [folder lookupName:@"Calendar" inContext:_ctx acquire:NO];
391 //   if ([folder isKindOfClass:[NSException class]])
392 //     return folder;
393   
394 //   [(WOContext *)_ctx setObject:folder ? folder : [NSNull null] 
395 //                 forKey:@"ActiveUserCalendar"];
396 //   return folder;
397 // }
398
399 - (NSArray *) rolesForObject: (NSObject *) object
400                    inContext: (WOContext *) context
401 {
402   NSMutableArray *rolesForObject;
403   NSArray *sogoRoles;
404
405   rolesForObject = [NSMutableArray new];
406   [rolesForObject autorelease];
407
408   sogoRoles = [super rolesForObject: object inContext: context];
409   if (sogoRoles)
410     [rolesForObject addObjectsFromArray: sogoRoles];
411
412   if ((superUsername && [login isEqualToString: superUsername])
413       || [[object ownerInContext: context] isEqualToString: login])
414     [rolesForObject addObject: SoRole_Owner];
415   if ([object isKindOfClass: [SOGoObject class]])
416     {
417       sogoRoles = [(SOGoObject *) object aclsForUser: login];
418       if (sogoRoles)
419         [rolesForObject addObjectsFromArray: sogoRoles];
420     }
421
422   return rolesForObject;
423 }
424
425 @end /* SOGoUser */