@@ -1202,6 +1202,135 @@ int ssl_hook_Fixup(request_rec *r)
12021202 return DECLINED ;
12031203}
12041204
1205+ /* _________________________________________________________________
1206+ **
1207+ ** Authz providers for use with mod_authz_core
1208+ ** _________________________________________________________________
1209+ */
1210+
1211+ static authz_status ssl_authz_require_ssl_check (request_rec * r ,
1212+ const char * require_line ,
1213+ const void * parsed )
1214+ {
1215+ SSLConnRec * sslconn = myConnConfig (r -> connection );
1216+ SSL * ssl = sslconn ? sslconn -> ssl : NULL ;
1217+
1218+ if (ssl )
1219+ return AUTHZ_GRANTED ;
1220+ else
1221+ return AUTHZ_DENIED ;
1222+ }
1223+
1224+ static const char * ssl_authz_require_ssl_parse (cmd_parms * cmd ,
1225+ const char * require_line ,
1226+ const void * * parsed )
1227+ {
1228+ if (require_line && require_line [0 ])
1229+ return "'Require ssl' does not take arguments" ;
1230+
1231+ return NULL ;
1232+ }
1233+
1234+ const authz_provider ssl_authz_provider_require_ssl =
1235+ {
1236+ & ssl_authz_require_ssl_check ,
1237+ & ssl_authz_require_ssl_parse ,
1238+ };
1239+
1240+ static authz_status ssl_authz_verify_client_check (request_rec * r ,
1241+ const char * require_line ,
1242+ const void * parsed )
1243+ {
1244+ SSLConnRec * sslconn = myConnConfig (r -> connection );
1245+ SSL * ssl = sslconn ? sslconn -> ssl : NULL ;
1246+
1247+ if (!ssl )
1248+ return AUTHZ_DENIED ;
1249+
1250+ if (sslconn -> verify_error == NULL &&
1251+ sslconn -> verify_info == NULL &&
1252+ SSL_get_verify_result (ssl ) == X509_V_OK )
1253+ {
1254+ X509 * xs = SSL_get_peer_certificate (ssl );
1255+
1256+ if (xs ) {
1257+ X509_free (xs );
1258+ return AUTHZ_GRANTED ;
1259+ }
1260+ else {
1261+ X509_free (xs );
1262+ }
1263+ }
1264+
1265+ return AUTHZ_DENIED ;
1266+ }
1267+
1268+ static const char * ssl_authz_verify_client_parse (cmd_parms * cmd ,
1269+ const char * require_line ,
1270+ const void * * parsed )
1271+ {
1272+ if (require_line && require_line [0 ])
1273+ return "'Require ssl-verify-client' does not take arguments" ;
1274+
1275+ return NULL ;
1276+ }
1277+
1278+ const authz_provider ssl_authz_provider_verify_client =
1279+ {
1280+ & ssl_authz_verify_client_check ,
1281+ & ssl_authz_verify_client_parse ,
1282+ };
1283+
1284+
1285+ static authz_status ssl_authz_sslrequire_check (request_rec * r ,
1286+ const char * require_line ,
1287+ const void * parsed )
1288+ {
1289+ const ssl_expr * expr = parsed ;
1290+ const char * errstring ;
1291+ int ok = ssl_expr_exec (r , expr , & errstring );
1292+
1293+ if (ok < 0 ) {
1294+ ap_log_rerror (APLOG_MARK , APLOG_ERR , 0 , r ,
1295+ "Failed to execute SSL requirement expression in "
1296+ "'Require ssl-require': %s" ,
1297+ errstring );
1298+ return AUTHZ_DENIED ;
1299+ }
1300+
1301+ if (ok != 1 ) {
1302+ ap_log_rerror (APLOG_MARK , APLOG_TRACE1 , 0 , r ,
1303+ "SSL requirement expression in 'Require ssl-require' "
1304+ "not fulfilled" );
1305+ return AUTHZ_DENIED ;
1306+ }
1307+
1308+ return AUTHZ_GRANTED ;
1309+ }
1310+
1311+ static const char * ssl_authz_sslrequire_parse (cmd_parms * cmd ,
1312+ const char * require_line ,
1313+ const void * * parsed )
1314+ {
1315+ const char * errstring ;
1316+ ssl_expr * expr = ssl_expr_comp (cmd -> pool , require_line , & errstring );
1317+
1318+ if (!expr )
1319+ return apr_psprintf (cmd -> pool , "Error in 'Require require-ssl': %s" ,
1320+ errstring );
1321+
1322+ * parsed = expr ;
1323+
1324+ return NULL ;
1325+ }
1326+
1327+ const authz_provider ssl_authz_provider_sslrequire =
1328+ {
1329+ & ssl_authz_sslrequire_check ,
1330+ & ssl_authz_sslrequire_parse ,
1331+ };
1332+
1333+
12051334/* _________________________________________________________________
12061335**
12071336** OpenSSL Callback Functions
0 commit comments