| 139 | } |
| 140 | |
| 141 | restinio::request_handling_status_t authorization_handler( |
| 142 | const restinio::generic_request_handle_t< per_request_data_t > & req ) |
| 143 | { |
| 144 | // Authorization required if user asks for '/admin' or '/stats'. |
| 145 | if( "/admin" == req->header().path() || "/stats" == req->header().path() ) |
| 146 | { |
| 147 | const auto & ud = req->extra_data(); |
| 148 | if( !ud.m_auth_result.m_credentials_provided ) |
| 149 | { |
| 150 | // User should provide credentials. |
| 151 | init_resp( req->create_response( restinio::status_unauthorized() ) ) |
| 152 | .append_header( |
| 153 | restinio::http_field::content_type, |
| 154 | "text/plain; charset=utf-8" ) |
| 155 | .append_header( |
| 156 | restinio::http_field::www_authenticate, |
| 157 | R"(Basic realm="Username/Password required", charset="utf-8")" ) |
| 158 | .set_body( "Unauthorized access forbidden") |
| 159 | .done(); |
| 160 | |
| 161 | // Mark the request as processed. |
| 162 | return restinio::request_accepted(); |
| 163 | } |
| 164 | |
| 165 | bool has_permission = [&req]( const auto & permissions ) { |
| 166 | if( "/admin" == req->header().path() ) |
| 167 | return permissions.m_admin_view; |
| 168 | if( "/stats" == req->header().path() ) |
| 169 | return permissions.m_stats_view; |
| 170 | return false; |
| 171 | }( ud.m_auth_result.m_identity.m_permissions ); |
| 172 | |
| 173 | if( !has_permission ) |
| 174 | { |
| 175 | init_resp( req->create_response( restinio::status_unauthorized() ) ) |
| 176 | .append_header( |
| 177 | restinio::http_field::content_type, |
| 178 | "text/plain; charset=utf-8" ) |
| 179 | .set_body( "Access without permissions prohibited") |
| 180 | .done(); |
| 181 | |
| 182 | // Mark the request as processed. |
| 183 | return restinio::request_accepted(); |
| 184 | } |
| 185 | } |
| 186 | |
| 187 | return restinio::request_not_handled(); |
| 188 | } |
| 189 | |
| 190 | auto create_request_handler() |
| 191 | { |
nothing calls this directly
no test coverage detected