~ubuntu-branches/ubuntu/lucid/kdebase/lucid

« back to all changes in this revision

Viewing changes to kdm/backend/policy.c

  • Committer: Bazaar Package Importer
  • Author(s): Ana Beatriz Guerrero Lopez
  • Date: 2009-04-05 05:22:13 UTC
  • mfrom: (0.4.2 experimental) (0.2.2 upstream)
  • mto: This revision was merged to the branch mainline in revision 235.
  • Revision ID: james.westby@ubuntu.com-20090405052213-39thr4l6p2ss07uj
Tags: 4:4.2.2-1
* New upstream release:
  - khtml fixes. (Closes: #290285, #359680)
  - Default konsole sessions can be deleted. (Closes: #286342)
  - Tag widget uses standard application palette. (Closes: #444800)
  - ... and surely many more but we have lost track...

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 
3
 
Copyright 1988, 1998  The Open Group
4
 
Copyright 2001 Oswald Buddenhagen <ossi@kde.org>
5
 
 
6
 
Permission to use, copy, modify, distribute, and sell this software and its
7
 
documentation for any purpose is hereby granted without fee, provided that
8
 
the above copyright notice appear in all copies and that both that
9
 
copyright notice and this permission notice appear in supporting
10
 
documentation.
11
 
 
12
 
The above copyright notice and this permission notice shall be included
13
 
in all copies or substantial portions of the Software.
14
 
 
15
 
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16
 
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
 
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18
 
IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19
 
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20
 
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21
 
OTHER DEALINGS IN THE SOFTWARE.
22
 
 
23
 
Except as contained in this notice, the name of a copyright holder shall
24
 
not be used in advertising or otherwise to promote the sale, use or
25
 
other dealings in this Software without prior written authorization
26
 
from the copyright holder.
27
 
 
28
 
*/
29
 
 
30
 
/*
31
 
 * xdm - display manager daemon
32
 
 * Author: Keith Packard, MIT X Consortium
33
 
 *
34
 
 * policy.c.  Implement site-dependent policy for XDMCP connections
35
 
 */
36
 
 
37
 
#include <config.h>
38
 
 
39
 
#ifdef XDMCP
40
 
 
41
 
#include "dm.h"
42
 
#include "dm_auth.h"
43
 
#include "dm_socket.h"
44
 
 
45
 
static ARRAY8 noAuthentication = { (CARD16)0, (CARD8Ptr) 0 };
46
 
 
47
 
typedef struct _XdmAuth {
48
 
        ARRAY8 authentication;
49
 
        ARRAY8 authorization;
50
 
} XdmAuthRec, *XdmAuthPtr;
51
 
 
52
 
static XdmAuthRec auth[] = {
53
 
#ifdef HASXDMAUTH
54
 
{ {(CARD16)20, (CARD8 *)"XDM-AUTHENTICATION-1"},
55
 
  {(CARD16)19, (CARD8 *)"XDM-AUTHORIZATION-1"},
56
 
},
57
 
#endif
58
 
{ {(CARD16)0, (CARD8 *)0},
59
 
  {(CARD16)0, (CARD8 *)0},
60
 
}
61
 
};
62
 
 
63
 
#define NumAuth as(auth)
64
 
 
65
 
ARRAY8Ptr
66
 
ChooseAuthentication( ARRAYofARRAY8Ptr authenticationNames )
67
 
{
68
 
        int i, j;
69
 
 
70
 
        for (i = 0; i < (int)authenticationNames->length; i++)
71
 
                for (j = 0; j < NumAuth; j++)
72
 
                        if (XdmcpARRAY8Equal( &authenticationNames->data[i],
73
 
                                              &auth[j].authentication ))
74
 
                                return &authenticationNames->data[i];
75
 
        return &noAuthentication;
76
 
}
77
 
 
78
 
int
79
 
CheckAuthentication(
80
 
                    struct protoDisplay *pdpy ATTR_UNUSED,
81
 
                    ARRAY8Ptr displayID ATTR_UNUSED,
82
 
                    ARRAY8Ptr name ATTR_UNUSED,
83
 
                    ARRAY8Ptr data ATTR_UNUSED )
84
 
{
85
 
#ifdef HASXDMAUTH
86
 
        if (name->length && !memcmp( (char *)name->data, "XDM-AUTHENTICATION-1", 20 ))
87
 
                return XdmCheckAuthentication( pdpy, displayID, name, data );
88
 
#endif
89
 
        return TRUE;
90
 
}
91
 
 
92
 
int
93
 
SelectAuthorizationTypeIndex( ARRAY8Ptr authenticationName,
94
 
                              ARRAYofARRAY8Ptr authorizationNames )
95
 
{
96
 
        int i, j;
97
 
 
98
 
        for (j = 0; j < NumAuth; j++)
99
 
                if (XdmcpARRAY8Equal( authenticationName,
100
 
                                      &auth[j].authentication ))
101
 
                        break;
102
 
        if (j < NumAuth)
103
 
                for (i = 0; i < (int)authorizationNames->length; i++)
104
 
                        if (XdmcpARRAY8Equal( &authorizationNames->data[i],
105
 
                                              &auth[j].authorization ))
106
 
                                return i;
107
 
        for (i = 0; i < (int)authorizationNames->length; i++)
108
 
                if (ValidAuthorization( authorizationNames->data[i].length,
109
 
                                        (char *)authorizationNames->data[i].data ))
110
 
                        return i;
111
 
        return -1;
112
 
}
113
 
 
114
 
 
115
 
/*#define WILLING_INTERNAL*/
116
 
 
117
 
#ifdef WILLING_INTERNAL
118
 
/* Report the loadavg to chooser. Nice feature ...
119
 
 *
120
 
 * Wed Mar 10 1999 -- Steffen Hansen
121
 
 */
122
 
static void
123
 
Willing_msg( char *mbuf )
124
 
{
125
 
#ifdef __linux__
126
 
        int fd;
127
 
        int numcpu;
128
 
        const char *fail_msg = "Willing to manage";
129
 
        FILE *f;
130
 
        float load[3];
131
 
        float mhz = 0.0;
132
 
        char buf[1024];
133
 
 
134
 
        fd = open( "/proc/loadavg", O_RDONLY );
135
 
        if (fd == -1) {
136
 
                sprintf( mbuf, fail_msg );
137
 
                return;
138
 
        } else if (read( fd, buf, 100 ) < 4) {
139
 
                close( fd );
140
 
                sprintf( mbuf, fail_msg );
141
 
                return;
142
 
        }
143
 
        close( fd );
144
 
 
145
 
        sscanf( buf, "%f %f %f", &load[0], &load[1], &load[2] );
146
 
        sprintf( mbuf, "Available (load: %0.2f, %0.2f, %0.2f)",
147
 
                 load[0], load[1], load[2] );
148
 
 
149
 
        numcpu = 0;
150
 
 
151
 
        if (!(f = fopen( "/proc/cpuinfo", "r" )))
152
 
                return;
153
 
 
154
 
        while (fGets( buf, sizeof(buf), f ) != -1) {
155
 
                float m;
156
 
                if (sscanf( buf, "cpu MHz : %f", &m )) {
157
 
                        numcpu++;
158
 
                        mhz = m;
159
 
                }
160
 
        }
161
 
 
162
 
        fclose( f );
163
 
 
164
 
        if (numcpu) {
165
 
                if (numcpu > 1)
166
 
                        sprintf( buf, " %d*%0.0f MHz", numcpu, mhz );
167
 
                else
168
 
                        sprintf( buf, " %0.0f MHz", mhz );
169
 
 
170
 
                strncat( mbuf, buf, 256 );
171
 
 
172
 
                mbuf[255] = 0;
173
 
        }
174
 
#elif HAVE_GETLOADAVG   /* !__linux__ */
175
 
#ifdef __GNUC__
176
 
# warning This code is untested...
177
 
#endif
178
 
        double load[3];
179
 
        getloadavg( load, 3 );
180
 
        sprintf( mbuf, "Available (load: %0.2f, %0.2f, %0.2f)", load[0],
181
 
                 load[1], load[2] );
182
 
#else   /* !__linux__ && !GETLOADAVG */
183
 
        strcpy( mbuf, "Willing to manage" );
184
 
#endif
185
 
}
186
 
#endif
187
 
 
188
 
/*ARGSUSED*/
189
 
int
190
 
Willing( ARRAY8Ptr addr, CARD16 connectionType,
191
 
         ARRAY8Ptr authenticationName ATTR_UNUSED,
192
 
         ARRAY8Ptr status, xdmOpCode type )
193
 
{
194
 
        int ret;
195
 
        char statusBuf[256];
196
 
        static time_t lastscan;
197
 
 
198
 
        if (autoRescan && lastscan + 15 < now) {
199
 
                lastscan = now;
200
 
                ScanAccessDatabase( FALSE );
201
 
        }
202
 
        ret = AcceptableDisplayAddress( addr, connectionType, type );
203
 
        if (!ret)
204
 
                sprintf( statusBuf, "Display not authorized to connect" );
205
 
        else {
206
 
                if (*willing) {
207
 
                        FILE *fd;
208
 
                        int len, ok = 0;
209
 
                        if ((fd = popen( willing, "r" ))) {
210
 
                                for (;;) {
211
 
                                        if ((len = fGets( statusBuf, sizeof(statusBuf), fd )) != -1) {
212
 
                                                if (len) {
213
 
                                                        ok = 1;
214
 
                                                        break;
215
 
                                                }
216
 
                                        }
217
 
                                        if (feof( fd ) || errno != EINTR)
218
 
                                                break;
219
 
                                }
220
 
                                pclose( fd );
221
 
                        }
222
 
                        if (!ok)
223
 
                                sprintf( statusBuf, "Willing, but %.*s failed",
224
 
                                         sizeof(statusBuf) - 21, willing );
225
 
                } else
226
 
#ifdef WILLING_INTERNAL
227
 
                        Willing_msg( statusBuf );
228
 
#else
229
 
                        strcpy( statusBuf, "Willing to manage" );
230
 
#endif
231
 
        }
232
 
        status->length = strlen( statusBuf );
233
 
        status->data = (CARD8Ptr) Malloc( status->length );
234
 
        if (!status->data)
235
 
                status->length = 0;
236
 
        else
237
 
                memmove( status->data, statusBuf, status->length );
238
 
        return ret;
239
 
}
240
 
 
241
 
/*ARGSUSED*/
242
 
ARRAY8Ptr
243
 
Accept( struct sockaddr *from ATTR_UNUSED, int fromlen ATTR_UNUSED,
244
 
        CARD16 displayNumber ATTR_UNUSED )
245
 
{
246
 
        return 0;
247
 
}
248
 
 
249
 
/*ARGSUSED*/
250
 
int
251
 
SelectConnectionTypeIndex( ARRAY16Ptr  connectionTypes,
252
 
                           ARRAYofARRAY8Ptr connectionAddresses ATTR_UNUSED )
253
 
{
254
 
        int i;
255
 
 
256
 
        /*
257
 
         * Select one supported connection type
258
 
         */
259
 
 
260
 
        for (i = 0; i < connectionTypes->length; i++) {
261
 
                switch (connectionTypes->data[i]) {
262
 
                  case FamilyLocal:
263
 
#if defined(TCPCONN)
264
 
                  case FamilyInternet:
265
 
# if defined(IPv6) && defined(AF_INET6)
266
 
                  case FamilyInternet6:
267
 
# endif /* IPv6 */
268
 
#endif /* TCPCONN */
269
 
#if defined(DNETCONN)
270
 
                  case FamilyDECnet:
271
 
#endif /* DNETCONN */
272
 
                        return i;
273
 
                }
274
 
        } /* for */
275
 
        return -1;
276
 
}
277
 
 
278
 
#endif /* XDMCP */