brian       96/06/12 20:49:22

  Modified:    src       mod_auth_msql.c
  Log:
  Submitted by: "Dirk.vanGulik" <[EMAIL PROTECTED]>
  
  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: [EMAIL PROTECTED]
     *
     * 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: [EMAIL PROTECTED]
     *
     * 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;
    }
  
  
  

Reply via email to