Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F5970593
OAuthRequest.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
8 KB
Referenced Files
None
Subscribers
None
OAuthRequest.php
View Options
<?php
// vim: foldmethod=marker
/**
* The MIT License
*
* Copyright (c) 2007 Andy Smith
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files ( the "Software" ), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace
MediaWiki\Extension\OAuth\Lib
;
use
MediaWiki\Extension\OAuth\Lib\OAuthException
;
use
MediaWiki\Extension\OAuth\Lib\OAuthUtil
;
use
MediaWiki\Logger\LoggerFactory
;
use
Psr\Log\LoggerInterface
;
class
OAuthRequest
{
protected
$parameters
;
protected
$http_method
;
protected
$http_url
;
// for debug purposes
public
$base_string
;
public
static
$version
=
'1.0'
;
public
static
$POST_INPUT
=
'php://input'
;
/** @var LoggerInterface */
protected
$logger
;
function
__construct
(
$http_method
,
$http_url
,
$parameters
=
null
)
{
$parameters
=
$parameters
?:
array
();
$parameters
=
array_merge
(
OAuthUtil
::
parse_parameters
(
parse_url
(
$http_url
,
PHP_URL_QUERY
)
),
$parameters
);
$this
->
parameters
=
$parameters
;
$this
->
http_method
=
$http_method
;
$this
->
http_url
=
$http_url
;
$this
->
logger
=
LoggerFactory
::
getInstance
(
'OAuth'
);
}
/**
* attempt to build up a request from what was passed to the server
*/
public
static
function
from_request
(
$http_method
=
null
,
$http_url
=
null
,
$parameters
=
null
)
{
$scheme
=
(
!
isset
(
$_SERVER
[
'HTTPS'
]
)
||
$_SERVER
[
'HTTPS'
]
!=
"on"
)
?
'http'
:
'https'
;
$http_url
=
$http_url
?:
$scheme
.
'://'
.
$_SERVER
[
'SERVER_NAME'
]
.
':'
.
$_SERVER
[
'SERVER_PORT'
]
.
$_SERVER
[
'REQUEST_URI'
];
$http_method
=
$http_method
?:
$_SERVER
[
'REQUEST_METHOD'
];
// We weren't handed any parameters, so let's find the ones relevant to
// this request.
// If you run XML-RPC or similar you should use this to provide your own
// parsed parameter-list
if
(
!
$parameters
)
{
// Find request headers
$request_headers
=
OAuthUtil
::
get_headers
();
// Parse the query-string to find GET parameters
$parameters
=
OAuthUtil
::
parse_parameters
(
$_SERVER
[
'QUERY_STRING'
]
);
// It's a POST request of the proper content-type, so parse POST
// parameters and add those overriding any duplicates from GET
if
(
$http_method
==
"POST"
&&
isset
(
$request_headers
[
'Content-Type'
]
)
&&
strstr
(
$request_headers
[
'Content-Type'
],
'application/x-www-form-urlencoded'
)
)
{
$post_data
=
OAuthUtil
::
parse_parameters
(
file_get_contents
(
self
::
$POST_INPUT
)
);
$parameters
=
array_merge
(
$parameters
,
$post_data
);
}
// We have a Authorization-header with OAuth data. Parse the header
// and add those overriding any duplicates from GET or POST
if
(
isset
(
$request_headers
[
'Authorization'
]
)
&&
substr
(
$request_headers
[
'Authorization'
],
0
,
6
)
==
'OAuth '
)
{
$header_parameters
=
OAuthUtil
::
split_header
(
$request_headers
[
'Authorization'
]
);
$parameters
=
array_merge
(
$parameters
,
$header_parameters
);
}
}
return
new
OAuthRequest
(
$http_method
,
$http_url
,
$parameters
);
}
/**
* pretty much a helper function to set up the request
*/
public
static
function
from_consumer_and_token
(
$consumer
,
$token
,
$http_method
,
$http_url
,
$parameters
=
null
)
{
$parameters
=
$parameters
?:
array
();
$defaults
=
array
(
"oauth_version"
=>
OAuthRequest
::
$version
,
"oauth_nonce"
=>
OAuthRequest
::
generate_nonce
(),
"oauth_timestamp"
=>
OAuthRequest
::
generate_timestamp
(),
"oauth_consumer_key"
=>
$consumer
->
key
);
if
(
$token
)
{
$defaults
[
'oauth_token'
]
=
$token
->
key
;
}
$parameters
=
array_merge
(
$defaults
,
$parameters
);
return
new
OAuthRequest
(
$http_method
,
$http_url
,
$parameters
);
}
public
function
set_parameter
(
$name
,
$value
,
$allow_duplicates
=
true
)
{
if
(
$allow_duplicates
&&
isset
(
$this
->
parameters
[
$name
]
)
)
{
// We have already added parameter( s ) with this name, so add to the list
if
(
is_scalar
(
$this
->
parameters
[
$name
]
)
)
{
// This is the first duplicate, so transform scalar ( string )
// into an array so we can add the duplicates
$this
->
parameters
[
$name
]
=
array
(
$this
->
parameters
[
$name
]
);
}
$this
->
parameters
[
$name
][]
=
$value
;
}
else
{
$this
->
parameters
[
$name
]
=
$value
;
}
}
public
function
get_parameter
(
$name
)
{
return
$this
->
parameters
[
$name
]
??
null
;
}
public
function
get_parameters
()
{
return
$this
->
parameters
;
}
public
function
unset_parameter
(
$name
)
{
unset
(
$this
->
parameters
[
$name
]
);
}
/**
* The request parameters, sorted and concatenated into a normalized string.
* @return string
*/
public
function
get_signable_parameters
()
{
// Grab all parameters
$params
=
$this
->
parameters
;
// Remove oauth_signature if present
// Ref: Spec: 9.1.1 ( "The oauth_signature parameter MUST be excluded." )
if
(
isset
(
$params
[
'oauth_signature'
]
)
)
{
unset
(
$params
[
'oauth_signature'
]
);
}
return
OAuthUtil
::
build_http_query
(
$params
);
}
/**
* Returns the base string of this request
*
* The base string defined as the method, the url
* and the parameters ( normalized ), each urlencoded
* and the concated with &.
*/
public
function
get_signature_base_string
()
{
$parts
=
array
(
$this
->
get_normalized_http_method
(),
$this
->
get_normalized_http_url
(),
$this
->
get_signable_parameters
()
);
$parts
=
OAuthUtil
::
urlencode_rfc3986
(
$parts
);
return
implode
(
'&'
,
$parts
);
}
/**
* just uppercases the http method
*/
public
function
get_normalized_http_method
()
{
return
strtoupper
(
$this
->
http_method
);
}
/**
* parses the url and rebuilds it to be
* scheme://host/path
*/
public
function
get_normalized_http_url
()
{
$parts
=
parse_url
(
$this
->
http_url
);
$scheme
=
$parts
[
'scheme'
]
??
'http'
;
$port
=
$parts
[
'port'
]
??
(
(
$scheme
==
'https'
)
?
'443'
:
'80'
);
$host
=
strtolower
(
$parts
[
'host'
]
??
''
);
$path
=
$parts
[
'path'
]
??
''
;
if
(
(
$scheme
==
'https'
&&
$port
!=
'443'
)
||
(
$scheme
==
'http'
&&
$port
!=
'80'
)
)
{
$host
=
"$host:$port"
;
}
return
"$scheme://$host$path"
;
}
/**
* builds a url usable for a GET request
*/
public
function
to_url
()
{
$post_data
=
$this
->
to_postdata
();
$out
=
$this
->
get_normalized_http_url
();
if
(
$post_data
)
{
$out
.=
'?'
.
$post_data
;
}
return
$out
;
}
/**
* builds the data one would send in a POST request
*/
public
function
to_postdata
()
{
return
OAuthUtil
::
build_http_query
(
$this
->
parameters
);
}
/**
* builds the Authorization: header
*/
public
function
to_header
(
$realm
=
null
)
{
$first
=
true
;
if
(
$realm
)
{
$out
=
'Authorization: OAuth realm="'
.
OAuthUtil
::
urlencode_rfc3986
(
$realm
)
.
'"'
;
$first
=
false
;
}
else
{
$out
=
'Authorization: OAuth'
;
}
$total
=
array
();
foreach
(
$this
->
parameters
as
$k
=>
$v
)
{
if
(
substr
(
$k
,
0
,
5
)
!=
"oauth"
)
{
continue
;
}
if
(
is_array
(
$v
)
)
{
throw
new
OAuthException
(
'Arrays not supported in headers'
);
}
$out
.=
(
$first
)
?
' '
:
','
;
$out
.=
OAuthUtil
::
urlencode_rfc3986
(
$k
)
.
'="'
.
OAuthUtil
::
urlencode_rfc3986
(
$v
)
.
'"'
;
$first
=
false
;
}
return
$out
;
}
public
function
__toString
()
{
return
$this
->
to_url
();
}
public
function
sign_request
(
$signature_method
,
$consumer
,
$token
)
{
$this
->
set_parameter
(
"oauth_signature_method"
,
$signature_method
->
get_name
(),
false
);
$signature
=
$this
->
build_signature
(
$signature_method
,
$consumer
,
$token
);
$this
->
set_parameter
(
"oauth_signature"
,
$signature
,
false
);
}
public
function
build_signature
(
$signature_method
,
$consumer
,
$token
)
{
$signature
=
$signature_method
->
build_signature
(
$this
,
$consumer
,
$token
);
return
$signature
;
}
/**
* util function: current timestamp
*/
private
static
function
generate_timestamp
()
{
return
time
();
}
/**
* util function: current nonce
*/
private
static
function
generate_nonce
()
{
$mt
=
microtime
();
$rand
=
mt_rand
();
return
md5
(
$mt
.
$rand
);
// md5s look nicer than numbers
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Sat, Oct 3, 14:35 (10 h, 33 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
dc/6f/d5b031b1da1295162196e00bf7ca
Default Alt Text
OAuthRequest.php (8 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment