You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by Brian Behlendorf <br...@hyperreal.com> on 1996/06/13 05:49:23 UTC
cvs commit: apache/src mod_auth_msql.c
brian 96/06/12 20:49:22
Modified: src mod_auth_msql.c
Log:
Submitted by: "Dirk.vanGulik" <Di...@jrc.it>
Changes:
- Removed obsolete palloc checks, they get trapped in the
alloc.c
- Removed static msql-err string claim (to make future treading
easier; although the linked in libmsql still has quite a few)
- Be more strict on the group/user specifications; and output
some diagnostics to the error log file if the admin does not
specify a require (valid-)user with a group when the module
is authorative.
Revision Changes Path
1.7 +52 -43 apache/src/mod_auth_msql.c
Index: mod_auth_msql.c
===================================================================
RCS file: /export/home/cvs/apache/src/mod_auth_msql.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -C3 -r1.6 -r1.7
*** mod_auth_msql.c 1996/05/29 03:19:20 1.6
--- mod_auth_msql.c 1996/06/13 03:49:20 1.7
***************
*** 61,67 ****
* Addapted for use with the mSQL database
* (see ftp:/ftp.bond.edu.au/pub/Minerva/mSQL)
*
! * Version 0.9 May 1996 - Blame: Dirk.vanGulik@jrc.it.
*
* A (sometimes more up to date) version of the documentation
* can be found at the http://www.apache.org site or at
--- 61,67 ----
* Addapted for use with the mSQL database
* (see ftp:/ftp.bond.edu.au/pub/Minerva/mSQL)
*
! * Version 1.0 May 1996 - Blame: Dirk.vanGulik@jrc.it.
*
* A (sometimes more up to date) version of the documentation
* can be found at the http://www.apache.org site or at
***************
*** 282,287 ****
--- 282,289 ----
* msqlClose() statements added upon error. Support for persistent
* connections with the mSQL database (riscy). Escaping of ' and \.
* Replaced some MAX_STRING_LENGTH claims.
+ * 1.0 removed some error check as they where already done elsehwere
+ * NumFields -> NumRows (Thanks Vitek). More stack memory.
*/
***************
*** 390,395 ****
--- 392,398 ----
#include "http_log.h"
#include "http_protocol.h"
#include <msql.h>
+ #include <crypt.h>
typedef struct {
***************
*** 412,418 ****
void *create_msql_auth_dir_config (pool *p, char *d)
{
msql_auth_config_rec * sec= (msql_auth_config_rec *) pcalloc (p, sizeof(msql_auth_config_rec));
- if (!sec) return NULL; /* no memory... */
sec->auth_msql_host = NULL; /* just to enforce the default 'localhost' behaviour */
--- 415,420 ----
***************
*** 440,446 ****
return sec;
}
- static
char *set_passwd_flag (cmd_parms *cmd, msql_auth_config_rec *sec, int arg) {
sec->auth_msql_nopasswd=arg;
return NULL;
--- 442,447 ----
***************
*** 538,554 ****
module msql_auth_module;
- char msql_errstr[MAX_STRING_LEN];
- /* global errno to be able to handle config/sql
- * failures separately
- */
-
-
/* boring little routine which escapes the ' and \ in the
* SQL query. See the mSQL FAQ for more information :-) on
* this very popular subject in the msql-mailing list.
*/
! char *msql_escape(char *out, char *in) {
register int i=0,j=0;
--- 539,549 ----
module msql_auth_module;
/* boring little routine which escapes the ' and \ in the
* SQL query. See the mSQL FAQ for more information :-) on
* this very popular subject in the msql-mailing list.
*/
! char *msql_escape(char *out, char *in, char *msql_errstr) {
register int i=0,j=0;
***************
*** 557,563 ****
if ( (in[i] == '\'') || (in[i] == '\\')) {
/* does this fit ? */
! if (j >= (MAX_FIELD_LEN-1)) return NULL;
out[j++] = '\\'; /* insert that escaping slash for good measure */
};
--- 552,561 ----
if ( (in[i] == '\'') || (in[i] == '\\')) {
/* does this fit ? */
! if (j >= (MAX_FIELD_LEN-1)) {
! sprintf(msql_errstr,"Could not escape '%s', longer than %d",in,MAX_FIELD_LEN);
! return NULL;
! };
out[j++] = '\\'; /* insert that escaping slash for good measure */
};
***************
*** 574,580 ****
* into r. Assume that user is a string and stored
* as such in the mSQL database
*/
! char *do_msql_query(request_rec *r, char *query, msql_auth_config_rec *sec, int once ) {
static int sock=-1;
int hit;
--- 572,578 ----
* into r. Assume that user is a string and stored
* as such in the mSQL database
*/
! char *do_msql_query(request_rec *r, char *query, msql_auth_config_rec *sec, int once , char *msql_errstr) {
static int sock=-1;
int hit;
***************
*** 584,591 ****
char *result=NULL;
char *host=sec->auth_msql_host;
- msql_errstr[0]='\0';
-
#ifndef KEEP_MSQL_CONNECTION_OPEN
sock=-1;
#endif
--- 582,587 ----
***************
*** 640,646 ****
return NULL;
};
! hit=msqlNumFields(results);
if (( once ) && ( hit >1 )) {
/* complain if there are to many
--- 636,642 ----
return NULL;
};
! hit=msqlNumRows(results);
if (( once ) && ( hit >1 )) {
/* complain if there are to many
***************
*** 652,658 ****
/* if we have a it, try to get it
*/
if ( hit ) {
! if ((currow=msqlFetchRow(results))) {
/* copy the first matching field value */
if (!(result=palloc(r->pool,strlen(currow[0])+1))) {
sprintf (msql_errstr,"mSQL: Could not get memory for mSQL %s (%s) with [%s]",
--- 648,654 ----
/* if we have a it, try to get it
*/
if ( hit ) {
! if ( (currow=msqlFetchRow(results)) != NULL) {
/* copy the first matching field value */
if (!(result=palloc(r->pool,strlen(currow[0])+1))) {
sprintf (msql_errstr,"mSQL: Could not get memory for mSQL %s (%s) with [%s]",
***************
*** 682,688 ****
return result;
}
! char *get_msql_pw(request_rec *r, char *user, msql_auth_config_rec *sec) {
char query[MAX_QUERY_LEN];
char esc_user[MAX_FIELD_LEN];
--- 678,684 ----
return result;
}
! char *get_msql_pw(request_rec *r, char *user, msql_auth_config_rec *sec ,char *msql_errstr) {
char query[MAX_QUERY_LEN];
char esc_user[MAX_FIELD_LEN];
***************
*** 701,709 ****
return NULL;
};
! if (!(msql_escape(esc_user, user))) {
sprintf(msql_errstr,
! "mSQL: Could not cope/escape the '%s' user_id value",user);
return NULL;
};
sprintf(query,"select %s from %s where %s='%s'",
--- 697,705 ----
return NULL;
};
! if (!(msql_escape(esc_user, user, msql_errstr))) {
sprintf(msql_errstr,
! "mSQL: Could not cope/escape the '%s' user_id value; ",user);
return NULL;
};
sprintf(query,"select %s from %s where %s='%s'",
***************
*** 713,722 ****
esc_user
);
! return do_msql_query(r,query,sec,ONLY_ONCE);
}
! char *get_msql_grp(request_rec *r, char *group,char *user, msql_auth_config_rec *sec) {
char query[MAX_QUERY_LEN];
char esc_user[MAX_FIELD_LEN];
--- 709,718 ----
esc_user
);
! return do_msql_query(r,query,sec,ONLY_ONCE,msql_errstr);
}
! char *get_msql_grp(request_rec *r, char *group,char *user, msql_auth_config_rec *sec, char *msql_errstr) {
char query[MAX_QUERY_LEN];
char esc_user[MAX_FIELD_LEN];
***************
*** 737,749 ****
return NULL;
};
! if (!(msql_escape(esc_user, user))) {
sprintf(msql_errstr,
"mSQL: Could not cope/escape the '%s' user_id value",user);
return NULL;
};
! if (!(msql_escape(esc_group, group))) {
sprintf(msql_errstr,
"mSQL: Could not cope/escape the '%s' group_id value",group);
--- 733,745 ----
return NULL;
};
! if (!(msql_escape(esc_user, user,msql_errstr))) {
sprintf(msql_errstr,
"mSQL: Could not cope/escape the '%s' user_id value",user);
return NULL;
};
! if (!(msql_escape(esc_group, group,msql_errstr))) {
sprintf(msql_errstr,
"mSQL: Could not cope/escape the '%s' group_id value",group);
***************
*** 757,763 ****
sec->auth_msql_grp_field, esc_group
);
! return do_msql_query(r,query,sec,0);
}
--- 753,759 ----
sec->auth_msql_grp_field, esc_group
);
! return do_msql_query(r,query,sec,0,msql_errstr);
}
***************
*** 766,775 ****
msql_auth_config_rec *sec =
(msql_auth_config_rec *)get_module_config (r->per_dir_config,
&msql_auth_module);
conn_rec *c = r->connection;
char *sent_pw, *real_pw;
int res;
!
if ((res = get_basic_auth_pw (r, &sent_pw)))
return res;
--- 762,772 ----
msql_auth_config_rec *sec =
(msql_auth_config_rec *)get_module_config (r->per_dir_config,
&msql_auth_module);
+ char msql_errstr[MAX_STRING_LEN];
conn_rec *c = r->connection;
char *sent_pw, *real_pw;
int res;
! msql_errstr[0]='\0';
if ((res = get_basic_auth_pw (r, &sent_pw)))
return res;
***************
*** 785,792 ****
(!sec->auth_msql_pwd_field)
) return DECLINED;
! msql_errstr[0]='\0';
! if(!(real_pw = get_msql_pw(r, c->user, sec ))) {
if ( msql_errstr[0] ) {
res = SERVER_ERROR;
} else {
--- 782,788 ----
(!sec->auth_msql_pwd_field)
) return DECLINED;
! if(!(real_pw = get_msql_pw(r, c->user, sec,msql_errstr ))) {
if ( msql_errstr[0] ) {
res = SERVER_ERROR;
} else {
***************
*** 854,879 ****
msql_auth_config_rec *sec =
(msql_auth_config_rec *)get_module_config (r->per_dir_config,
&msql_auth_module);
char *user = r->connection->user;
int m = r->method_number;
-
-
array_header *reqs_arr = requires (r);
require_line *reqs = reqs_arr ? (require_line *)reqs_arr->elts : NULL;
register int x;
char *t, *w;
!
!
! /* if we cannot do it; leave it to some other guy,
! */
!
! if ((!sec->auth_msql_grp_table)&&(!sec->auth_msql_grp_field))
! return DECLINED;
if (!reqs_arr) {
if (sec->auth_msql_authorative) {
sprintf(msql_errstr,"user %s denied, no access rules specified (MSQL-Authorative) ",user);
note_basic_auth_failure(r);
return AUTH_REQUIRED;
};
--- 850,869 ----
msql_auth_config_rec *sec =
(msql_auth_config_rec *)get_module_config (r->per_dir_config,
&msql_auth_module);
+ char msql_errstr[MAX_STRING_LEN];
char *user = r->connection->user;
int m = r->method_number;
array_header *reqs_arr = requires (r);
require_line *reqs = reqs_arr ? (require_line *)reqs_arr->elts : NULL;
register int x;
char *t, *w;
! msql_errstr[0]='\0';
if (!reqs_arr) {
if (sec->auth_msql_authorative) {
sprintf(msql_errstr,"user %s denied, no access rules specified (MSQL-Authorative) ",user);
+ log_reason (msql_errstr, r->uri, r);
note_basic_auth_failure(r);
return AUTH_REQUIRED;
};
***************
*** 887,913 ****
t = reqs[x].requirement;
w = getword(r->pool, &t, ' ');
! if(!strcmp(w,"user")) {
while(t[0]) {
w = getword_conf (r->pool, &t);
! if (!strcmp(user,w))
user_result= OK;
}
if ((sec->auth_msql_authorative) && ( user_result != OK)) {
sprintf(msql_errstr,"User %s not found (MSQL-Auhtorative)",user);
note_basic_auth_failure(r);
return AUTH_REQUIRED;
};
}
! if (!strcmp(w,"group")) {
/* look up the membership for each of the groups in the table
*/
! msql_errstr[0]='\0';
!
while ( (t[0]) && (group_result != OK) && (!msql_errstr[0]) ) {
! if (get_msql_grp(r,getword(r->pool, &t, ' '),user,sec)) {
group_result= OK;
};
};
--- 877,911 ----
t = reqs[x].requirement;
w = getword(r->pool, &t, ' ');
! if ((user_result != OK) && (!strcmp(w,"user"))) {
! user_result=AUTH_REQUIRED;
while(t[0]) {
w = getword_conf (r->pool, &t);
! if (!strcmp(user,w)) {
user_result= OK;
+ break;
+ };
}
if ((sec->auth_msql_authorative) && ( user_result != OK)) {
sprintf(msql_errstr,"User %s not found (MSQL-Auhtorative)",user);
+ log_reason (msql_errstr, r->uri, r);
note_basic_auth_failure(r);
return AUTH_REQUIRED;
};
}
! if ( (group_result != OK) &&
! (!strcmp(w,"group")) &&
! (sec->auth_msql_grp_table) &&
! (sec->auth_msql_grp_field)
! ) {
/* look up the membership for each of the groups in the table
*/
! group_result=AUTH_REQUIRED;
while ( (t[0]) && (group_result != OK) && (!msql_errstr[0]) ) {
! if (get_msql_grp(r,getword(r->pool, &t, ' '),user,sec,msql_errstr)) {
group_result= OK;
+ break;
};
};
***************
*** 918,930 ****
if ( (sec->auth_msql_authorative) && (group_result != OK) ) {
sprintf(msql_errstr,"user %s not in right groups (MSQL-Authorative) ",user);
note_basic_auth_failure(r);
return AUTH_REQUIRED;
};
};
! if(!strcmp(w,"valid-user"))
user_result= OK;
}
/* we do not have to check the valid-ness of the group result as
--- 916,930 ----
if ( (sec->auth_msql_authorative) && (group_result != OK) ) {
sprintf(msql_errstr,"user %s not in right groups (MSQL-Authorative) ",user);
+ log_reason (msql_errstr, r->uri, r);
note_basic_auth_failure(r);
return AUTH_REQUIRED;
};
};
! if(!strcmp(w,"valid-user")) {
user_result= OK;
+ };
}
/* we do not have to check the valid-ness of the group result as
***************
*** 932,940 ****
--- 932,949 ----
*/
if ( (user_result != OK) && (sec->auth_msql_authorative) ) {
sprintf(msql_errstr,"User %s denied, no access rules applied (MSQL-Authorative) ",user);
+ log_reason (msql_errstr, r->uri, r);
note_basic_auth_failure(r);
return AUTH_REQUIRED;
};
+
+
+ /* if the user is DECLINED, it is up to the group_result to tip
+ * the balance. But if the group result is AUTH_REQUIRED it should
+ * always override. A SERVER_ERROR should not get here.
+ */
+ if ( (user_result == DECLINED) || (group_result == AUTH_REQUIRED))
+ return group_result;
return user_result;
}