Skip to content

Commit

Permalink
Bug 1141440: OPTION response for CORS requests to REST doesn't allow …
Browse files Browse the repository at this point in the history
…X-Bugzilla headers

r=glob,a=glob
  • Loading branch information
dklawren committed Mar 11, 2015
1 parent 74fb163 commit c3b984a
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 11 deletions.
12 changes: 12 additions & 0 deletions Bugzilla/WebService/Constants.pm
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@ our @EXPORT = qw(
REST_CONTENT_TYPE_WHITELIST
WS_DISPATCH
API_AUTH_HEADERS
);

# This maps the error names in global/*-error.html.tmpl to numbers.
Expand Down Expand Up @@ -313,6 +315,16 @@ sub WS_DISPATCH {
return $dispatch;
};

# Custom HTTP headers that can be used for API authentication rather than
# passing as URL parameters. This is useful if you do not want sensitive
# information to show up in webserver log files.
use constant API_AUTH_HEADERS => {
X_BUGZILLA_LOGIN => 'Bugzilla_login',
X_BUGZILLA_PASSWORD => 'Bugzilla_password',
X_BUGZILLA_API_KEY => 'Bugzilla_api_key',
X_BUGZILLA_TOKEN => 'Bugzilla_token',
};

1;

=head1 B<Methods in need of POD>
Expand Down
4 changes: 3 additions & 1 deletion Bugzilla/WebService/Server/REST.pm
Original file line number Diff line number Diff line change
Expand Up @@ -134,8 +134,10 @@ sub response {
{ rpc => $self, result => \$result, response => $response });

# Access Control
my @allowed_headers = (qw(accept content-type origin x-requested-with),
map { tr/A-Z_/a-z\-/r } keys API_AUTH_HEADERS());
$response->header("Access-Control-Allow-Origin", "*");
$response->header("Access-Control-Allow-Headers", "origin, content-type, accept, x-requested-with");
$response->header("Access-Control-Allow-Headers", join(', ', @allowed_headers));

# ETag support
my $etag = $self->bz_etag;
Expand Down
14 changes: 4 additions & 10 deletions Bugzilla/WebService/Util.pm
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ use warnings;
use Bugzilla::Flag;
use Bugzilla::FlagType;
use Bugzilla::Error;
use Bugzilla::WebService::Constants;

use Storable qw(dclone);
use URI::Escape qw(uri_unescape);
Expand Down Expand Up @@ -261,22 +262,15 @@ sub params_to_objects {
return \@objects;
}

use constant X_HEADERS => {
X_BUGZILLA_LOGIN => 'Bugzilla_login',
X_BUGZILLA_PASSWORD => 'Bugzilla_password',
X_BUGZILLA_API_KEY => 'Bugzilla_api_key',
X_BUGZILLA_TOKEN => 'Bugzilla_token',
};

sub fix_credentials {
my ($params, $cgi) = @_;

# Allow user to pass in authentication details in X-Headers
# This allows callers to keep credentials out of GET request query-strings
if ($cgi) {
foreach my $field (keys %{ X_HEADERS() }) {
next if exists $params->{X_HEADERS->{$field}} || $cgi->http($field) // '' eq '';
$params->{X_HEADERS->{$field}} = uri_unescape($cgi->http($field));
foreach my $field (keys %{ API_AUTH_HEADERS() }) {
next if exists $params->{API_AUTH_HEADERS->{$field}} || ($cgi->http($field) // '') eq '';
$params->{API_AUTH_HEADERS->{$field}} = uri_unescape($cgi->http($field));
}
}

Expand Down

0 comments on commit c3b984a

Please sign in to comment.