annotate packages/net/athttpd/current/src/auth.c @ 2863:7d8c61e6225c default tip

* Added execute permissions to files missed in conversion from CVS
author alexs
date Thu, 26 Mar 2009 20:39:18 +0000
parents 74dbf4c3f2e1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
1 /* =================================================================
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
2 *
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
3 * auth.c
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
4 *
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
5 * Handles basic authentication.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
6 *
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
7 * =================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
8 * ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
9 * -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
10 * This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
11 * Copyright (C) 2005 Free Software Foundation, Inc.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
12 *
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
13 * eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
14 * the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
15 * Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
16 * version.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
17 *
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
18 * eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
19 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
20 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
21 * for more details.
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
22 *
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
23 * You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
24 * along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
25 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
26 *
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
27 * As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
28 * macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
29 * and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
30 * this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
31 * the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
32 * must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
33 * General Public License v2.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
34 *
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
35 * This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
36 * on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
37 * -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2485
diff changeset
38 * ####ECOSGPLCOPYRIGHTEND####
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
39 * =================================================================
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
40 * #####DESCRIPTIONBEGIN####
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
41 *
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
42 * Author(s): Anthony Tonizzo (atonizzo@gmail.com)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
43 * Contributors:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
44 * Date: 2006-06-12
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
45 * Purpose:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
46 * Description:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
47 *
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
48 * ####DESCRIPTIONEND####
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
49 *
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
50 * =================================================================
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
51 */
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
52 #include <pkgconf/hal.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
53 #include <pkgconf/kernel.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
54 #include <cyg/kernel/kapi.h> // Kernel API.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
55 #include <cyg/hal/hal_tables.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
56
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
57 #include <stdio.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
58
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
59 #include <network.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
60 #include <string.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
61
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
62 #include <cyg/athttpd/http.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
63 #include <cyg/athttpd/md5.h>
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
64
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
65 // This is a string that contains the domain that is currently authorized.
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
66 cyg_uint8 *cyg_httpd_current_authName;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
67
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
68 CYG_HAL_TABLE_BEGIN(cyg_httpd_auth_table, httpd_auth_table );
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
69 CYG_HAL_TABLE_END(cyg_httpd_auth_table_end, httpd_auth_table );
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
70
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
71 __externC cyg_httpd_auth_table_entry cyg_httpd_auth_table[];
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
72 __externC cyg_httpd_auth_table_entry cyg_httpd_auth_table_end[];
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
73
2485
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
74 // Variables used for authorization. The header parsing code will only copy
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
75 // up to AUTH_STORAGE_BUFFER_LENGTH bytes into cyg_httpd_md5_response to
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
76 // avoid overflow.
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
77 char cyg_httpd_md5_response[AUTH_STORAGE_BUFFER_LENGTH + 1];
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
78 char cyg_httpd_md5_digest[AUTH_STORAGE_BUFFER_LENGTH + 1];
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
79 char cyg_httpd_md5_nonce[33];
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
80 char cyg_httpd_md5_cnonce[33];
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
81 char cyg_httpd_md5_noncecount[9];
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
82 char cyg_httpd_md5_ha2[HASHHEXLEN+1] = {'\0'};
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
83 char cyg_httpd_md5_ha1[HASHHEXLEN+1];
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
84
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
85 char b64string[] =
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
86 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
87
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
88 cyg_httpd_auth_table_entry*
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
89 cyg_httpd_auth_entry_from_path(char *authPath)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
90 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
91 cyg_httpd_auth_table_entry *entry = cyg_httpd_auth_table;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
92 if (strcmp(authPath, "/") != 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
93 while (entry != cyg_httpd_auth_table_end)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
94 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
95 if (strncmp(entry->auth_dirname,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
96 authPath,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
97 strlen(entry->auth_dirname)) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
98 return entry;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
99 entry++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
100 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
101 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
102 while (entry != cyg_httpd_auth_table_end)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
103 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
104 if (strcmp(entry->auth_dirname, authPath) == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
105 return entry;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
106 entry++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
107 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
108
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
109 return (cyg_httpd_auth_table_entry *)0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
110 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
111
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
112 cyg_httpd_auth_table_entry*
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
113 cyg_httpd_auth_entry_from_domain(char *authDomain)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
114 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
115 cyg_httpd_auth_table_entry *entry = cyg_httpd_auth_table;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
116 while (entry != cyg_httpd_auth_table_end)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
117 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
118 if (!strncmp((const char*)authDomain,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
119 entry->auth_domainname,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
120 strlen(entry->auth_domainname)))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
121 return entry;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
122 entry++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
123 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
124
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
125 return (cyg_httpd_auth_table_entry *)0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
126 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
127
2485
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
128 static cyg_int32
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
129 cyg_httpd_base64_decode(char* to, char* from, cyg_uint32 len )
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
130 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
131 char *fromp = from;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
132 char *top = to;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
133 char *p;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
134 char cbyte;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
135 char obyte;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
136 cyg_int32 padding = 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
137
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
138 for (; len >= 4; len -= 4)
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
139 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
140 if ((cbyte = *fromp++) == '=')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
141 cbyte = 0;
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
142 else
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
143 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
144 if (badchar(cbyte, p ) )
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
145 return -1;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
146 cbyte = (p - b64string);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
147 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
148 obyte = cbyte << 2;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
149
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
150 if ((cbyte = *fromp++) == '=')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
151 cbyte = 0;
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
152 else
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
153 {
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
154 if (badchar(cbyte, p))
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
155 return -1;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
156 cbyte = p - b64string;
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
157 }
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
158 obyte |= cbyte >> 4;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
159 *top++ = obyte;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
160
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
161 obyte = cbyte << 4;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
162 if ((cbyte = *fromp++) == '=')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
163 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
164 cbyte = 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
165 padding++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
166 }
2265
b5670f3c40f2 * cdl/httpd.cdl:
jlarmour
parents: 2250
diff changeset
167 else
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
168 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
169 padding = 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
170 if (badchar(cbyte, p))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
171 return -1;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
172 cbyte = p - b64string;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
173 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
174 obyte |= cbyte >> 2;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
175 *top++ = obyte;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
176
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
177 obyte = cbyte << 6;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
178 if ((cbyte = *fromp++) == '=')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
179 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
180 cbyte = 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
181 padding++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
182 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
183 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
184 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
185 padding = 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
186 if (badchar(cbyte, p))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
187 return -1;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
188 cbyte = p - b64string;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
189 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
190 obyte |= cbyte;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
191 *top++ = obyte;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
192 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
193
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
194 *top = 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
195 if (len)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
196 return -1;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
197 return (top - to) - padding;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
198 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
199
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
200 // The following code is a slightly modified version of those available at the
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
201 // end of RFC1270.
2485
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
202 static void cyg_httpd_cvthex(HASH Bin, HASHHEX Hex)
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
203 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
204 unsigned short i;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
205 unsigned char j;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
206
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
207 for (i = 0; i < HASHLEN; i++)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
208 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
209 j = (Bin[i] >> 4) & 0xf;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
210 if (j <= 9)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
211 Hex[i*2] = (j + '0');
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
212 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
213 Hex[i*2] = (j + 'a' - 10);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
214 j = Bin[i] & 0xf;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
215 if (j <= 9)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
216 Hex[i*2+1] = (j + '0');
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
217 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
218 Hex[i*2+1] = (j + 'a' - 10);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
219 };
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
220 Hex[HASHHEXLEN] = '\0';
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
221 };
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
222
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
223 // Calculate H(A1) as per spec.
2485
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
224 static void
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
225 cyg_httpd_digest_calc_HA1( char *pszAlg,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
226 char *pszUserName,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
227 char *pszRealm,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
228 char *pszPassword,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
229 char *pszNonce,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
230 char *pszCNonce,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
231 HASHHEX SessionKey )
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
232 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
233 MD5_CTX Md5Ctx;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
234 HASH HA1;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
235
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
236 MD5Init(&Md5Ctx);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
237 MD5Update(&Md5Ctx, (unsigned char*)pszUserName, strlen(pszUserName));
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
238 MD5Update(&Md5Ctx, (unsigned char*)":", 1);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
239 MD5Update(&Md5Ctx, (unsigned char*)pszRealm, strlen(pszRealm));
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
240 MD5Update(&Md5Ctx, (unsigned char*)":", 1);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
241 MD5Update(&Md5Ctx, (unsigned char*)pszPassword, strlen(pszPassword));
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
242 MD5Final((unsigned char*)HA1, &Md5Ctx);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
243 if (strcmp(pszAlg, "md5-sess") == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
244 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
245 MD5Init(&Md5Ctx);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
246 MD5Update(&Md5Ctx, (unsigned char*)HA1, HASHLEN);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
247 MD5Update(&Md5Ctx, (unsigned char*)":", 1);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
248 MD5Update(&Md5Ctx, (unsigned char*)pszNonce, strlen(pszNonce));
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
249 MD5Update(&Md5Ctx, (unsigned char*)":", 1);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
250 MD5Update(&Md5Ctx, (unsigned char*)pszCNonce, strlen(pszCNonce));
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
251 MD5Final((unsigned char*)HA1, &Md5Ctx);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
252 };
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
253 cyg_httpd_cvthex(HA1, SessionKey);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
254 };
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
255
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
256 // Calculate request-digest/response-digest as per HTTP Digest spec.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
257 void
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
258 cyg_httpd_digest_calc_response(HASHHEX HA1,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
259 char *pszNonce,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
260 char *pszNonceCount,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
261 char *pszCNonce,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
262 char *pszQop,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
263 char *pszMethod,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
264 char *pszDigestUri,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
265 HASHHEX HEntity,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
266 HASHHEX Response)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
267 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
268 MD5_CTX Md5Ctx;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
269 HASH HA2;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
270 HASH RespHash;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
271 HASHHEX HA2Hex;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
272
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
273 // Calculate H(A2).
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
274 MD5Init(&Md5Ctx);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
275 MD5Update(&Md5Ctx, (unsigned char*)pszMethod, strlen(pszMethod));
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
276 MD5Update(&Md5Ctx, (unsigned char*)":", 1);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
277 MD5Update(&Md5Ctx, (unsigned char*)pszDigestUri, strlen(pszDigestUri));
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
278 if (strcmp(pszQop, "auth-int") == 0) {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
279 MD5Update(&Md5Ctx, (unsigned char*)":", 1);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
280 MD5Update(&Md5Ctx, (unsigned char*)HEntity, HASHHEXLEN);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
281 };
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
282 MD5Final((unsigned char*)HA2, &Md5Ctx);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
283 cyg_httpd_cvthex(HA2, HA2Hex);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
284
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
285 // calculate response
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
286 MD5Init(&Md5Ctx);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
287 MD5Update(&Md5Ctx, (unsigned char*)HA1, HASHHEXLEN);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
288 MD5Update(&Md5Ctx, (unsigned char*)":", 1);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
289 MD5Update(&Md5Ctx, (unsigned char*)pszNonce, strlen(pszNonce));
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
290 MD5Update(&Md5Ctx, (unsigned char*)":", 1);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
291 if (*pszQop)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
292 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
293 MD5Update(&Md5Ctx, (unsigned char*)pszNonceCount, strlen(pszNonceCount));
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
294 MD5Update(&Md5Ctx, (unsigned char*)":", 1);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
295 MD5Update(&Md5Ctx, (unsigned char*)pszCNonce, strlen(pszCNonce));
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
296 MD5Update(&Md5Ctx, (unsigned char*)":", 1);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
297 MD5Update(&Md5Ctx, (unsigned char*)pszQop, strlen(pszQop));
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
298 MD5Update(&Md5Ctx, (unsigned char*)":", 1);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
299 };
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
300 MD5Update(&Md5Ctx, (unsigned char*)HA2Hex, HASHHEXLEN);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
301 MD5Final((unsigned char*)RespHash, &Md5Ctx);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
302 cyg_httpd_cvthex(RespHash, Response);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
303 };
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
304
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
305 cyg_httpd_auth_table_entry*
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
306 cyg_httpd_is_authenticated(char* fname)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
307 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
308 // Let's check if the directory access needs authorization. The
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
309 // authentication is done on the directory name.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
310 cyg_httpd_auth_table_entry* entry =
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
311 cyg_httpd_auth_entry_from_path(fname);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
312 if (entry != 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
313 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
314 if (entry->auth_mode == CYG_HTTPD_AUTH_BASIC)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
315 {
2485
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
316 cyg_httpd_base64_decode(cyg_httpd_md5_digest,
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
317 cyg_httpd_md5_response,
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
318 strlen(cyg_httpd_md5_response));
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
319 char *colon = rindex(cyg_httpd_md5_digest, ':');
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
320 if (colon == NULL)
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
321 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
322 return (httpstate.needs_auth = entry);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
323 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
324 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
325 {
2485
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
326 *colon = '\0'; // Crypto now has the username.
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
327
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
328 // In the case of a 'Basic" authentication, the HTTP header
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
329 // did not return to us the domain name that we sent when we
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
330 // challenged the request: The only things that are returned
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
331 // are the username:password duo. In this case I will just
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
332 // compare the entry's username/password to those read from
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
333 // the header.
2485
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
334 if ((strcmp(entry->auth_username,cyg_httpd_md5_digest) != 0) ||
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
335 (strcmp(entry->auth_password, ++colon) != 0))
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
336 return (httpstate.needs_auth = entry);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
337 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
338 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
339 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
340 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
341 char *cyg_httpd_md5_method;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
342
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
343 switch (httpstate.method)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
344 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
345 case CYG_HTTPD_METHOD_GET:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
346 cyg_httpd_md5_method = "GET";
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
347 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
348 case CYG_HTTPD_METHOD_POST:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
349 cyg_httpd_md5_method = "POST";
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
350 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
351 default:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
352 cyg_httpd_md5_method = "HEAD";
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
353 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
354 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
355 cyg_httpd_digest_calc_HA1(CYG_HTTPD_MD5_AUTH_NAME,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
356 entry->auth_username,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
357 entry->auth_domainname,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
358 entry->auth_password,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
359 cyg_httpd_md5_nonce,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
360 cyg_httpd_md5_cnonce,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
361 cyg_httpd_md5_ha1);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
362 cyg_httpd_digest_calc_response(cyg_httpd_md5_ha1,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
363 cyg_httpd_md5_nonce,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
364 cyg_httpd_md5_noncecount,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
365 cyg_httpd_md5_cnonce,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
366 CYG_HTTPD_MD5_AUTH_QOP,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
367 cyg_httpd_md5_method,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
368 httpstate.url,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
369 cyg_httpd_md5_ha2,
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
370 cyg_httpd_md5_digest);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
371 if (strcmp(cyg_httpd_md5_response, cyg_httpd_md5_digest) != 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
372 return (httpstate.needs_auth = entry);
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
373 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
374 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
375 // No need for authentication...
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
376 return (cyg_httpd_auth_table_entry*)0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
377 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
378
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
379 char*
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
380 cyg_httpd_digest_data(char *dest, char *src)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
381 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
382 int exit = 0;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
383 while (exit == 0)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
384 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
385 switch (*src )
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
386 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
387 case '\r':
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
388 case '\n':
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
389 *dest = '\0';
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
390 exit = 1;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
391 break;
2485
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
392 case ',':
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
393 // If it is a comma there might or might not be a blank space
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
394 // following it (IE7 inserts no spaces, everyone else does...)
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
395 // so before exiting the loop remove any blank space that follows.
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
396 if (src[1] == ' ')
0e9d1d1df4a0 * src/jim-aio.c (JimAioHandlerCommand): GCC 4.3.1 pointed out a
asl
parents: 2265
diff changeset
397 src++;
2250
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
398 case ' ':
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
399 src++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
400 *dest = '\0';
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
401 exit = 1;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
402 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
403 case '"':
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
404 src++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
405 break;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
406 default:
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
407 *dest++ = *src++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
408 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
409 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
410 return src;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
411 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
412
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
413 // Skips through fields we do not need.
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
414 char*
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
415 cyg_httpd_digest_skip(char *p)
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
416 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
417 if (*p == '"')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
418 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
419 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
420 while ((*p != '"') && (*p != '\n'))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
421 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
422 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
423 if (*p == ',')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
424 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
425 if (*p == ' ')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
426 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
427 if (*p == '\n')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
428 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
429 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
430 else
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
431 {
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
432 while ((*p != ' ') && (*p != '\n'))
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
433 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
434 if (*p == ',')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
435 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
436 if (*p == ' ')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
437 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
438 if (*p == '\n')
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
439 p++;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
440 }
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
441 return p;
0830ae6acddc Add ATHTTPD server from Anthony Tonizzo.
jlarmour
parents:
diff changeset
442 }