]> err.no Git - scalable-opengroupware.org/blob - SoObjects/Contacts/SOGoContactFolders.m
initial sync
[scalable-opengroupware.org] / SoObjects / Contacts / SOGoContactFolders.m
1 /* SOGoContactFolders.m - this file is part of SOGo
2  *
3  * Copyright (C) 2006 Inverse groupe conseil
4  *
5  * Author: Wolfgang Sourdeau <wsourdeau@inverse.ca>
6  *
7  * This file is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2, or (at your option)
10  * any later version.
11  *
12  * This file is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; see the file COPYING.  If not, write to
19  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */
22
23 /* exchange folder types:                   */
24 /* MailItems                IPF.Note
25    ContactItems             IPF.Contact
26    AppointmentItems         IPF.Appointment
27    NoteItems                IPF.StickyNote
28    TaskItems                IPF.Task
29    JournalItems             IPF.Journal     */
30
31 #import <Foundation/NSDictionary.h>
32 #import <Foundation/NSString.h>
33
34 #import <NGObjWeb/WOApplication.h>
35 #import <NGObjWeb/WOContext.h>
36 #import <NGObjWeb/WOContext+SoObjects.h>
37 #import <NGObjWeb/SoUser.h>
38
39 #import <SoObjects/SOGo/SOGoPermissions.h>
40
41 #import "common.h"
42
43 #import "SOGoContactGCSFolder.h"
44 #import "SOGoContactLDAPFolder.h"
45 #import "SOGoContactFolders.h"
46
47 @implementation SOGoContactFolders
48
49 - (id) init
50 {
51   if ((self = [super init]))
52     {
53       contactFolders = nil;
54       OCSPath = nil;
55     }
56
57   return self;
58 }
59
60 - (void) dealloc
61 {
62   if (contactFolders)
63     [contactFolders release];
64   if (OCSPath)
65     [OCSPath release];
66   [super dealloc];
67 }
68
69 - (void) appendPersonalSourcesInContext: (WOContext *) context;
70 {
71   SOGoContactGCSFolder *ab;
72
73   ab = [SOGoContactGCSFolder contactFolderWithName: @"personal"
74                              andDisplayName: @"Personal Addressbook"
75                              inContainer: self];
76   [ab setOCSPath: [NSString stringWithFormat: @"%@/%@",
77                             OCSPath, @"personal"]];
78   [contactFolders setObject: ab forKey: @"personal"];
79 }
80
81 - (void) appendSystemSourcesInContext: (WOContext *) context;
82 {
83   NSUserDefaults *ud;
84   NSEnumerator *ldapABs;
85   NSDictionary *udAB;
86   SOGoContactLDAPFolder *ab;
87
88   ud = [NSUserDefaults standardUserDefaults];
89   ldapABs = [[ud objectForKey: @"SOGoLDAPAddressBooks"] objectEnumerator];
90   udAB = [ldapABs nextObject];
91   while (udAB)
92     {
93       ab = [SOGoContactLDAPFolder contactFolderWithName:
94                                     [udAB objectForKey: @"id"]
95                                   andDisplayName:
96                                     [udAB objectForKey: @"displayName"]
97                                   inContainer: self];
98       [ab LDAPSetHostname: [udAB objectForKey: @"hostname"]
99           setPort: [[udAB objectForKey: @"port"] intValue]
100           setBindDN: [udAB objectForKey: @"bindDN"]
101           setBindPW: [udAB objectForKey: @"bindPW"]
102           setContactIdentifier: [udAB objectForKey: @"idField"]
103           setUserIdentifier: [udAB objectForKey: @"userIdField"]
104           setRootDN: [udAB objectForKey: @"rootDN"]];
105       [contactFolders setObject: ab forKey: [udAB objectForKey: @"id"]];
106       udAB = [ldapABs nextObject];
107     }
108 }
109
110 - (void) initContactSourcesInContext: (WOContext *) context;
111 {
112   if (!contactFolders)
113     {
114       contactFolders = [NSMutableDictionary new];
115       [self appendPersonalSourcesInContext: context];
116       [self appendSystemSourcesInContext: context];
117     }
118 }
119
120 - (id) lookupName: (NSString *) name
121         inContext: (WOContext *) context
122           acquire: (BOOL) acquire
123 {
124   id obj;
125   id folder;
126
127   /* first check attributes directly bound to the application */
128   obj = [super lookupName: name inContext: context acquire: NO];
129   if (!obj)
130     {
131       if (!contactFolders)
132         [self initContactSourcesInContext: context];
133
134       folder = [contactFolders objectForKey: name];
135       obj = ((folder)
136              ? folder
137              : [NSException exceptionWithHTTPStatus: 404]);
138     }
139
140   return obj;
141 }
142
143 - (NSArray *) toManyRelationshipKeys
144 {
145   WOContext *context;
146
147   if (!contactFolders)
148     {
149       context = [[WOApplication application] context];
150       [self initContactSourcesInContext: context];
151     }
152
153   return [contactFolders allKeys];
154 }
155
156 - (NSArray *) contactFolders
157 {
158   WOContext *context;
159
160   if (!contactFolders)
161     {
162       context = [[WOApplication application] context];
163       [self initContactSourcesInContext: context];
164     }
165
166   return [contactFolders allValues];
167 }
168
169 - (NSString *) roleOfUser: (NSString *) uid
170                 inContext: (WOContext *) context
171 {
172   NSArray *roles, *traversalPath;
173   NSString *objectName, *role;
174
175   role = nil;
176   traversalPath = [context objectForKey: @"SoRequestTraversalPath"];
177   if ([traversalPath count] > 2)
178     {
179       objectName = [traversalPath objectAtIndex: 2];
180       if ([objectName isEqualToString: @"personal"])
181         {
182           roles = [[context activeUser]
183                     rolesForObject: [self lookupName: objectName
184                                           inContext: context
185                                           acquire: NO]
186                     inContext: context];
187           if ([roles containsObject: SOGoRole_Assistant]
188               || [roles containsObject: SOGoRole_Delegate])
189             role = SOGoRole_Assistant;
190         }
191     }
192
193   return role;
194 }
195
196 - (BOOL) davIsCollection
197 {
198   return YES;
199 }
200
201 - (void) setBaseOCSPath: (NSString *) newOCSPath
202 {
203   if (OCSPath)
204     [OCSPath release];
205   OCSPath = newOCSPath;
206   if (OCSPath)
207     [OCSPath retain];
208 }
209
210 /* web interface */
211 - (NSString *) defaultSourceName
212 {
213   return @"personal";
214 }
215
216 @end