Changeset 740 for vendor/current/source3/web/cgi.c
- Timestamp:
- Nov 14, 2012, 12:59:34 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
vendor/current/source3/web/cgi.c
r615 r740 2 2 some simple CGI helper routines 3 3 Copyright (C) Andrew Tridgell 1997-1998 4 4 5 5 This program is free software; you can redistribute it and/or modify 6 6 it under the terms of the GNU General Public License as published by 7 7 the Free Software Foundation; either version 3 of the License, or 8 8 (at your option) any later version. 9 9 10 10 This program is distributed in the hope that it will be useful, 11 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 13 GNU General Public License for more details. 14 14 15 15 You should have received a copy of the GNU General Public License 16 16 along with this program. If not, see <http://www.gnu.org/licenses/>. … … 19 19 20 20 #include "includes.h" 21 #include "system/passwd.h" 22 #include "system/filesys.h" 21 23 #include "web/swat_proto.h" 24 #include "intl/lang_tdb.h" 25 #include "auth.h" 22 26 #include "secrets.h" 23 #include "../lib/util/util.h"24 27 25 28 #define MAX_VARIABLES 10000 … … 57 60 while ((*cl)) { 58 61 int c; 59 62 60 63 if (i == len) { 61 64 char *ret2; … … 66 69 ret = ret2; 67 70 } 68 71 69 72 c = fgetc(f); 70 73 (*cl)--; … … 74 77 break; 75 78 } 76 79 77 80 if (c == '\r') continue; 78 81 … … 82 85 83 86 } 84 87 85 88 if (ret) { 86 89 ret[i] = 0; … … 136 139 p = strchr_m(line,'='); 137 140 if (!p) continue; 138 141 139 142 *p = 0; 140 143 141 144 variables[num_variables].name = SMB_STRDUP(line); 142 145 variables[num_variables].value = SMB_STRDUP(p+1); 143 146 144 147 SAFE_FREE(line); 145 148 146 149 if (!variables[num_variables].name || 147 150 !variables[num_variables].value) … … 158 161 variables[num_variables].value); 159 162 #endif 160 163 161 164 num_variables++; 162 165 if (num_variables == MAX_VARIABLES) break; … … 173 176 p = strchr_m(tok,'='); 174 177 if (!p) continue; 175 178 176 179 *p = 0; 177 180 178 181 variables[num_variables].name = SMB_STRDUP(tok); 179 182 variables[num_variables].value = SMB_STRDUP(p+1); … … 318 321 } 319 322 320 pwd = Get_Pwnam_alloc(talloc_ autofree_context(), user);323 pwd = Get_Pwnam_alloc(talloc_tos(), user); 321 324 if (!pwd) { 322 325 printf("%sCannot find user %s<br>%s\n", head, user, tail); … … 330 333 if (C_pass == NULL) { 331 334 char *tmp_pass = NULL; 332 tmp_pass = generate_random_str(talloc_tos(), 16); 335 tmp_pass = generate_random_password(talloc_tos(), 336 16, 16); 333 337 if (tmp_pass == NULL) { 334 338 printf("%sFailed to create random nonce for " … … 359 363 fstring user, user_pass; 360 364 struct passwd *pass = NULL; 365 const char *rhost; 366 char addr[INET6_ADDRSTRLEN]; 361 367 362 368 if (!strnequal(line,"Basic ", 6)) { … … 386 392 * Try and get the user from the UNIX password file. 387 393 */ 388 389 pass = Get_Pwnam_alloc(talloc_autofree_context(), user); 390 394 395 pass = Get_Pwnam_alloc(talloc_tos(), user); 396 397 rhost = client_name(1); 398 if (strequal(rhost,"UNKNOWN")) 399 rhost = client_addr(1, addr, sizeof(addr)); 400 391 401 /* 392 402 * Validate the password they have given. 393 403 */ 394 395 if NT_STATUS_IS_OK(pass_check(pass, user, user_pass, 396 strlen(user_pass), NULL, False)) { 397 404 405 if NT_STATUS_IS_OK(pass_check(pass, user, rhost, user_pass, false)) { 398 406 if (pass) { 399 407 /* 400 408 * Password was ok. 401 409 */ 402 410 403 411 if ( initgroups(pass->pw_name, pass->pw_gid) != 0 ) 404 412 goto err; 405 413 406 414 become_user_permanently(pass->pw_uid, pass->pw_gid); 407 415 408 416 /* Save the users name */ 409 417 C_user = SMB_STRDUP(user); … … 413 421 } 414 422 } 415 423 416 424 err: 417 425 cgi_setup_error("401 Bad Authorization", … … 536 544 537 545 546 /* return true if the char* contains ip addrs only. Used to avoid 547 name lookup calls */ 548 549 static bool only_ipaddrs_in_list(const char **list) 550 { 551 bool only_ip = true; 552 553 if (!list) { 554 return true; 555 } 556 557 for (; *list ; list++) { 558 /* factor out the special strings */ 559 if (strequal(*list, "ALL") || strequal(*list, "FAIL") || 560 strequal(*list, "EXCEPT")) { 561 continue; 562 } 563 564 if (!is_ipaddress(*list)) { 565 /* 566 * If we failed, make sure that it was not because 567 * the token was a network/netmask pair. Only 568 * network/netmask pairs have a '/' in them. 569 */ 570 if ((strchr_m(*list, '/')) == NULL) { 571 only_ip = false; 572 DEBUG(3,("only_ipaddrs_in_list: list has " 573 "non-ip address (%s)\n", 574 *list)); 575 break; 576 } 577 } 578 } 579 580 return only_ip; 581 } 582 583 /* return true if access should be allowed to a service for a socket */ 584 static bool check_access(int sock, const char **allow_list, 585 const char **deny_list) 586 { 587 bool ret = false; 588 bool only_ip = false; 589 char addr[INET6_ADDRSTRLEN]; 590 591 if ((!deny_list || *deny_list==0) && (!allow_list || *allow_list==0)) { 592 return true; 593 } 594 595 /* Bypass name resolution calls if the lists 596 * only contain IP addrs */ 597 if (only_ipaddrs_in_list(allow_list) && 598 only_ipaddrs_in_list(deny_list)) { 599 only_ip = true; 600 DEBUG (3, ("check_access: no hostnames " 601 "in host allow/deny list.\n")); 602 ret = allow_access(deny_list, 603 allow_list, 604 "", 605 get_peer_addr(sock,addr,sizeof(addr))); 606 } else { 607 DEBUG (3, ("check_access: hostnames in " 608 "host allow/deny list.\n")); 609 ret = allow_access(deny_list, 610 allow_list, 611 get_peer_name(sock,true), 612 get_peer_addr(sock,addr,sizeof(addr))); 613 } 614 615 if (ret) { 616 DEBUG(2,("Allowed connection from %s (%s)\n", 617 only_ip ? "" : get_peer_name(sock,true), 618 get_peer_addr(sock,addr,sizeof(addr)))); 619 } else { 620 DEBUG(0,("Denied connection from %s (%s)\n", 621 only_ip ? "" : get_peer_name(sock,true), 622 get_peer_addr(sock,addr,sizeof(addr)))); 623 } 624 625 return(ret); 626 } 538 627 539 628 /**
Note:
See TracChangeset
for help on using the changeset viewer.