]> err.no Git - scalable-opengroupware.org/blob - Misc/dbd/DSoAuthenticator.m
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1004 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / Misc / dbd / DSoAuthenticator.m
1 /*
2   Copyright (C) 2004 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 // $Id$
22
23 #include "DSoAuthenticator.h"
24 #include "common.h"
25 #include <GDLAccess/GDLAccess.h>
26
27 /*
28   Things to note:
29   - authenticators themselves are _not_ bound to a context or a SOPE
30     traversal path
31     - because of that we need to duplicate some stuff
32       => or use a separate layer which handles uniquing
33 */
34
35 @implementation DSoAuthenticator
36
37 static BOOL debugOn = NO;
38
39 // TODO: might want to cache authenticator objects ...
40
41 - (id)initWithHostName:(NSString *)_hostname port:(int)_port
42   databaseName:(NSString *)_dbname
43 {
44   if ((self = [super init])) {
45     self->hostname = [_hostname copy];
46     self->port     = _port;
47     self->dbname   = [_dbname copy];
48   }
49   return self;
50 }
51
52 + (id)authenticatorWithHostName:(NSString *)_hostname port:(int)_port {
53   return [[[self alloc] initWithHostName:_hostname port:_port 
54                         databaseName:nil] autorelease];
55 }
56 + (id)authenticatorWithHostName:(NSString *)_hostname port:(int)_port
57   databaseName:(NSString *)_dbname
58 {
59   return [[[self alloc] initWithHostName:_hostname port:_port 
60                         databaseName:_dbname] autorelease];
61 }
62
63 - (void)dealloc {
64   [self->hostname release];
65   [self->dbname   release];
66   [super dealloc];
67 }
68
69 /* realm */
70
71 - (NSString *)authRealm {
72   /* 
73      the HTTP authentication realm, we use the database info (default is the 
74      application name, but in our case we can be more specific)
75   */
76   if (self->dbname == nil)
77     return self->hostname;
78   
79   return [[self->dbname stringByAppendingString:@"@"]
80                         stringByAppendingString:self->hostname];
81 }
82
83 /* adaptor setup */
84
85 - (NSString *)defaultDatabase {
86   /* template1 is supposed to exist always (#postgresql channel ;-) */
87   return @"template1";
88 }
89
90 - (EOAdaptor *)adaptorForLogin:(NSString *)_login password:(NSString *)_pwd {
91   EOAdaptor    *adaptor;
92   NSDictionary *condict;
93   NSString     *dbn;
94   
95   if ((adaptor = [EOAdaptor adaptorWithName:@"PostgreSQL72"]) == nil)
96     return nil;
97
98   if (![_login isNotNull]) _login = @"";
99   if (![_pwd   isNotNull]) _pwd   = @"";
100
101   dbn = [self->dbname isNotNull] ? self->dbname : [self defaultDatabase];
102   
103   // TODO: ignores port
104   condict = [[NSDictionary alloc] initWithObjectsAndKeys:
105                                     self->hostname, @"hostName",
106                                     _login,         @"userName",
107                                     _pwd,           @"password",
108                                     dbn,            @"databaseName",
109                                   nil];
110   [adaptor setConnectionDictionary:condict];
111   [condict release];
112   return adaptor;
113 }
114
115 /* check credentials */
116
117 - (BOOL)checkLogin:(NSString *)_login password:(NSString *)_pwd {
118   EOAdaptor        *adaptor;
119   EOAdaptorContext *adctx;
120   EOAdaptorChannel *adch;
121   BOOL             ok;
122   
123   [self debugWithFormat:@"check login: %@", _login];
124   
125   /* create all necessary objects */
126   
127   adaptor = [self    adaptorForLogin:_login password:_pwd];
128   adctx   = [adaptor createAdaptorContext];
129   adch    = [adctx   createAdaptorChannel];
130   
131   [self debugWithFormat:@"  channel: %@", adch];
132   
133   /* open channel to check whether credentials are valid */
134   
135   if ((ok = [adch openChannel]))
136     [adch closeChannel];
137   else
138     [self debugWithFormat:@"could not open the channel."];
139   
140   return ok;
141 }
142
143 /* debugging */
144
145 - (BOOL)isDebuggingEnabled {
146   return debugOn;
147 }
148
149 @end /* DSoAuthenticator */