This commit was manufactured by cvs2svn to create branch 'freeside_import'.
[freeside.git] / site_perl / UID.pm
1 package FS::UID;
2
3 use strict;
4 use vars qw(
5   @ISA @EXPORT_OK $cgi $dbh $freeside_uid $conf $datasrc $db_user $db_pass
6 );
7 use Exporter;
8 use Carp;
9 use DBI;
10 use FS::Conf;
11
12 @ISA = qw(Exporter);
13 @EXPORT_OK = qw(checkeuid checkruid swapuid cgisuidsetup
14                 adminsuidsetup getotaker dbh datasrc);
15
16 $freeside_uid = scalar(getpwnam('freeside'));
17
18 my $conf = new FS::Conf;
19 ($datasrc, $db_user, $db_pass) = $conf->config('secrets')
20   or die "Can't get secrets: $!";
21
22 =head1 NAME
23
24 FS::UID - Subroutines for database login and assorted other stuff
25
26 =head1 SYNOPSIS
27
28   use FS::UID qw(adminsuidsetup cgisuidsetup dbh datasrc getotaker
29   checkeuid checkruid swapuid);
30
31   adminsuidsetup;
32
33   $cgi = new CGI::Base;
34   $cgi->get;
35   $dbh = cgisuidsetup($cgi);
36
37   $dbh = dbh;
38
39   $datasrc = datasrc;
40
41 =head1 DESCRIPTION
42
43 Provides a hodgepodge of subroutines. 
44
45 =head1 SUBROUTINES
46
47 =over 4
48
49 =item adminsuidsetup
50
51 Cleans the environment.
52 Make sure the script is running as freeside, or setuid freeside.
53 Opens a connection to the database.
54 Swaps real and effective UIDs.
55 Returns the DBI database handle (usually you don't need this).
56
57 =cut
58
59 sub adminsuidsetup {
60
61   $ENV{'PATH'} ='/usr/local/bin:/usr/bin:/usr/ucb:/bin';
62   $ENV{'SHELL'} = '/bin/sh';
63   $ENV{'IFS'} = " \t\n";
64   $ENV{'CDPATH'} = '';
65   $ENV{'ENV'} = '';
66   $ENV{'BASH_ENV'} = '';
67
68   croak "Not running uid freeside!" unless checkeuid();
69   $dbh = DBI->connect($datasrc,$db_user,$db_pass, {
70         # hack for web demo
71         #  my($user)=getotaker();
72         #  $dbh = DBI->connect("$datasrc:$user",$db_user,$db_pass, {
73                           'AutoCommit' => 'true',
74                           'ChopBlanks' => 'true',
75   } ) or die "DBI->connect error: $DBI::errstr\n";;
76
77   swapuid(); #go to non-privledged user if running setuid freeside
78
79   $dbh;
80 }
81 =item cgisuidsetup CGI::Base_OBJECT
82
83 Stores the CGI::Base_OBJECT for later use.
84 Runs adminsuidsetup.
85
86 =cut
87
88 sub cgisuidsetup {
89   $cgi=$_[0];
90   adminsuidsetup;
91 }
92
93 =item dbh
94
95 Returns the DBI database handle.
96
97 =cut
98
99 sub dbh {
100   $dbh;
101 }
102
103 =item datasrc
104
105 Returns the DBI data source.
106
107 =cut
108
109 sub datasrc {
110   $datasrc;
111 }
112
113 #hack for web demo
114 #sub setdbh {
115 #  $dbh=$_[0];
116 #}
117
118 sub suidsetup {
119   croak "suidsetup depriciated";
120 }
121
122 =item getotaker
123
124 Returns the current Freeside user.  Currently that means the CGI REMOTE_USER,
125 or 'freeside'.
126
127 =cut
128
129 sub getotaker {
130   if ($cgi && defined $cgi->var('REMOTE_USER')) {
131     return $cgi->var('REMOTE_USER'); #for now
132   } else {
133     'freeside';
134   }
135 }
136
137 =item checkeuid
138
139 Returns true if effective UID is that of the freeside user.
140
141 =cut
142
143 sub checkeuid {
144   ( $> == $freeside_uid );
145 }
146
147 =item checkruid
148
149 Returns true if the real UID is that of the freeside user.
150
151 =cut
152
153 sub checkruid {
154   ( $< == $freeside_uid );
155 }
156
157 =item swapuid
158
159 Swaps real and effective UIDs.
160
161 =cut
162
163 sub swapuid {
164   ($<,$>) = ($>,$<);
165 }
166
167 =back
168
169 =head1 BUGS
170
171 Not OO.
172
173 No capabilities yet.  When mod_perl and Authen::DBI are implemented, 
174 cgisuidsetup will go away as well.
175
176 =head1 SEE ALSO
177
178 L<FS::Record>,  L<CGI::Base>, L<DBI>
179
180 =head1 HISTORY
181
182 ivan@voicenet.com 97-jun-4 - 9
183  
184 untaint otaker ivan@voicenet.com 97-jul-7
185
186 generalize and auto-get uid (getotaker still needs to be db'ed)
187 ivan@sisd.com 97-nov-10
188
189 &cgisuidsetup logs into database.  other cleaning.
190 ivan@sisd.com 97-nov-22,23
191
192 &adminsuidsetup logs into database with otaker='freeside' (for
193 automated tasks like billing)
194 ivan@sisd.com 97-dec-13
195
196 added sub datasrc for fs-setup ivan@sisd.com 98-feb-21
197
198 datasrc, user and pass now come from conf/secrets ivan@sisd.com 98-jun-28
199
200 added ChopBlanks to DBI call (see man DBI) ivan@sisd.com 98-aug-16
201
202 pod, use FS::Conf, implemented cgisuidsetup as adminsuidsetup,
203 inlined suidsetup
204 ivan@sisd.com 98-sep-12
205
206 =cut
207
208 1;
209