2017-02-19 17 views
0

Для проекта мне нужна аутентификация HMAC на уровне apache. Таким образом, я продлил mod_example объяснил here до этого момента:Сделать пользовательский apache-модуль в каждом запросе?

module AP_MODULE_DECLARE_DATA hmac_module = 
     { 
       STANDARD20_MODULE_STUFF, 
       NULL,   // Per-directory configuration handler 
       NULL,   // Merge handler for per-directory configurations 
       NULL,   // Per-server configuration handler 
       NULL,   // Merge handler for per-server configurations 
       NULL,   // Any directives we may have for httpd 
       register_hooks // Our hook registering function 
     }; 


/* register_hooks: Adds a hook to the httpd process */ 
static void register_hooks(apr_pool_t *pool) 
{ 

    /* Hook the request handler */ 
    ap_hook_handler(hmac_handler, NULL, NULL,APR_HOOK_REALLY_FIRST); 
} 

static int hmac_handler(request_rec *r) 
{ 
    // ... 
    // some variable definition 
    // ... 

    // Check that the "hmac-handler" handler is being called. 
    if (!r->handler || strcmp(r->handler, "hmac-handler")) return (DECLINED); 

    ap_args_to_table(r, &GET); 
    ap_parse_form_data(r, NULL, &POST, -1, 8192); 

    timestamp = apr_table_get(r->headers_in, "X-EPOCH"); 
    claimedHash = apr_table_get(r->headers_in, "X-HMAC"); 
    if (!timestamp){ 
     ap_log_rerror(APLOG_MARK,APLOG_ERR,HTTP_FORBIDDEN,r,"Timestamp does not exits in request"); 
     return HTTP_FORBIDDEN; 
    } 
    if(!claimedHash){ 
     ap_log_rerror(APLOG_MARK,APLOG_ERR,HTTP_FORBIDDEN,r,"There is no claimed hash in the request!"); 
     return HTTP_FORBIDDEN; 
    } 

    //... 
    // calculate timestamp's sha1 hash 
    //... 

    if(strcmp(claimedHash,encoded)){ 
     ap_log_rerror(APLOG_MARK,APLOG_ERR,HTTP_FORBIDDEN,r,"Claimed hash and digested values does not match,Claimed:%s , Target:%s",claimedHash,encoded); 
     return HTTP_FORBIDDEN; 
    } 

    // Let Apache know that we responded to this request. 
    return OK; 
} 

Теперь, мне нужно подключить этот модуль в Apache, прежде чем обрабатывать его дальше, чтобы проверить этот запрос авторизован или нет.

Я знаю, что параметр APR_HOOK_REALLY_FIRST в ap_hook_handler Функция make apache выполняет этот обработчик перед любыми другими обработчиками.

Но мне нужно знать, как заставить этого обработчика выполнить до ЛЮБЫХ запросов, которые происходят в определенном каталоге.

ответ

0

Я, наконец, понял это самостоятельно. Вместо того, чтобы регистрировать хук на этапе обработчика, я должен был зарегистрировать свой модуль на более ранней стадии: access_checker.

Окончательный код доступен по адресу github, если кому-то это интересно.