Class ::xo::oauth::Signature (public)
::xotcl::Class ::xo::oauth::Signature\ [ -protocol_parameters protocol_parameters ]
Defined in /var/www/openacs.org/packages/xooauth/tcl/oauth-procs.tcl
- Switches:
- -protocol_parameters (optional)
- Expects a list of key-value pairs representing parameters of different sources.
- Testcases:
- No testcase defined.
Source code: namespace eval ::xo::oauth {} ::nsf::object::alloc ::xotcl::Class ::xo::oauth::Signature {set :__default_metaclass ::xotcl::Class set :__default_superclass ::xotcl::Object} ::xo::oauth::Signature proc base_string_from_url uri { set info [uri::split $uri] set base_string_uri [uri::join scheme [dict get $info scheme] host [dict get $info host] port [dict get $info port] path [dict get $info path]] return $base_string_uri } ::xo::oauth::Signature instproc normalize_parameters {} { set parameter_pair_list [:signature_parameters] set encoded_parameter_pair_list {} foreach pair $parameter_pair_list { lassign $pair key value if {[string match "*secret" $key]} continue lappend encoded_parameter_pair_list [list [:encode $key] [:encode $value]] } #ns_log notice "encoded_parameter_pair_list $encoded_parameter_pair_list" foreach pair $encoded_parameter_pair_list { lassign $pair key value lappend concatenated_parameter_list [list ${key}=${value}] } # Note: OAuth requires the parameters to be sorted first by name and then, # if two parameters have the same name, by value. So instead of sorting # twice here, we just sort the concatenated value (e.g. a=b) as a whole. # I hope I have no error in reasoning here... # set sorted_parameter_pair_list [lsort -index 0 $encoded_parameter_pair_list] set sorted_concatenated_parameter_list [lsort $concatenated_parameter_list] #:log "Sorted Concatenated Parameters" #foreach pair $sorted_concatenated_parameter_list { # foreach {key value} $pair { # :log "Name: $key Value: $value" # } #} set normalized_parameters [join $sorted_concatenated_parameter_list &] set encoded_normalized_parameters [:encode $normalized_parameters] return $encoded_normalized_parameters } ::xo::oauth::Signature instproc construct_base_string {} { # @see http://tools.ietf.org/html/rfc3986#section-3.1 append sbs [:encode [string toupper [:request_method]]] append sbs "&" append sbs [:encode [:base_string_uri]] append sbs "&" append sbs [:normalize_parameters] #:log "Signature Base String:\n$sbs" return $sbs } ::xo::oauth::Signature instproc encode s { #return [::xowiki::utility urlencode $s] return [::xo::oauth::utility urlencode $s] } ::xo::oauth::Signature instproc generate {} { set signature [ns_crypto::hmac string -binary -digest sha1 -encoding base64 [:encode ${:client_secret}]&[:encode ${:token_secret}] [:construct_base_string] ] return $signature } ::xo::oauth::Signature instparametercmd base_string_uri ::xo::oauth::Signature instparametercmd client_secret ::xo::oauth::Signature instparametercmd signature_parameters ::xo::oauth::Signature instparametercmd request_method ::xo::oauth::Signature instparametercmd token_secret ::nx::slotObj -container slot ::xo::oauth::Signature ::xo::oauth::Signature::slot eval {set :__parameter { {request_method "POST"} base_string_uri signature_parameters client_secret {token_secret ""} }} ::nsf::object::alloc ::xotcl::Attribute ::xo::oauth::Signature::slot::client_secret {set :accessor public set :configurable true set :convert false set :defaultmethods {} set :disposition alias set :domain ::xo::oauth::Signature set :incremental 0 set :manager ::xo::oauth::Signature::slot::client_secret set :methodname client_secret set :multiplicity 1..1 set :name client_secret set :per-object false set :position 0 set :required false set :trace none : init} ::nsf::object::alloc ::xotcl::Attribute ::xo::oauth::Signature::slot::base_string_uri {set :accessor public set :configurable true set :convert false set :defaultmethods {} set :disposition alias set :domain ::xo::oauth::Signature set :incremental 0 set :manager ::xo::oauth::Signature::slot::base_string_uri set :methodname base_string_uri set :multiplicity 1..1 set :name base_string_uri set :per-object false set :position 0 set :required false set :trace none : init} ::nsf::object::alloc ::xotcl::Attribute ::xo::oauth::Signature::slot::request_method {set :accessor public set :configurable true set :convert false set :default POST set :defaultmethods {} set :disposition alias set :domain ::xo::oauth::Signature set :incremental 0 set :manager ::xo::oauth::Signature::slot::request_method set :methodname request_method set :multiplicity 1..1 set :name request_method set :per-object false set :position 0 set :required false set :substdefault 0b111 set :trace none : init} ::nsf::object::alloc ::xotcl::Attribute ::xo::oauth::Signature::slot::signature_parameters {set :accessor public set :configurable true set :convert false set :defaultmethods {} set :disposition alias set :domain ::xo::oauth::Signature set :incremental 0 set :manager ::xo::oauth::Signature::slot::signature_parameters set :methodname signature_parameters set :multiplicity 1..1 set :name signature_parameters set :per-object false set :position 0 set :required false set :trace none : init} ::nsf::object::alloc ::xotcl::Attribute ::xo::oauth::Signature::slot::token_secret {set :accessor public set :configurable true set :convert false set :default {} set :defaultmethods {} set :disposition alias set :domain ::xo::oauth::Signature set :incremental 0 set :manager ::xo::oauth::Signature::slot::token_secret set :methodname token_secret set :multiplicity 1..1 set :name token_secret set :per-object false set :position 0 set :required false set :substdefault 0b111 set :trace none : init}XQL Not present: Generic, PostgreSQL, Oracle