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