our
$VERSION
=
'2.0.0'
;
*_push_url_arg
=
(
$Net::OpenID::Server::VERSION
>= 1.09 )
?
*OpenID::util::push_url_arg
:
*Net::OpenID::Server::_push_url_arg
;
sub
new {
my
$class
=
shift
;
my
$self
= fields::new(
$class
);
my
%opts
=
@_
;
$self
->
$_
(
delete
$opts
{
$_
} )
foreach
(
qw(extensions)
);
$self
->SUPER::new(
%opts
);
}
sub
extensions {
my
$self
=
shift
;
$self
->{_extensions} =
shift
;
}
sub
_mode_checkid {
my
Lemonldap::NG::Portal::Lib::OpenID::Server
$self
=
shift
;
my
(
$mode
,
$redirect_for_setup
) =
@_
;
my
$return_to
=
$self
->args(
"openid.return_to"
);
return
$self
->_fail(
"no_return_to"
)
unless
(
$return_to
and
$return_to
=~ m!^https?://! );
my
$trust_root
=
$self
->args(
"openid.trust_root"
) ||
$return_to
;
$trust_root
=
$self
->args(
"openid.realm"
)
if
$self
->args(
'openid.ns'
) eq OPENID2_NS;
return
$self
->_fail(
"invalid_trust_root"
)
unless
(
$trust_root
=~ Lemonldap::NG::Common::Regexp::HTTP_URI
and Net::OpenID::Server::_url_is_under(
$trust_root
,
$return_to
) );
my
$identity
=
$self
->args(
"openid.identity"
);
$trust_root
=~ s/\?.*//;
my
$u
=
$self
->_proxy(
"get_user"
);
if
(
$self
->args(
'openid.ns'
) eq OPENID2_NS
&&
$identity
eq OPENID2_ID_SELECT )
{
$identity
=
$self
->_proxy(
"get_identity"
,
$u
,
$identity
);
}
my
$is_identity
=
$self
->_proxy(
"is_identity"
,
$u
,
$identity
);
my
$is_trusted
=
$self
->_proxy(
"is_trusted"
,
$u
,
$trust_root
,
$is_identity
);
my
(
%extVars
,
%is_ext_trusted
);
my
$is_exts_trusted
= 1;
if
(
ref
(
$self
->{_extensions} ) ) {
my
@list
=
$self
->args->();
my
%extArgs
;
foreach
my
$arg
(
@list
) {
next
unless
(
$arg
=~ /^openid\.(\w+)\.([\w\.]+)?/ );
my
$tmp
= $1;
my
$val
= $2;
$extArgs
{
$tmp
}->{
$val
} =
scalar
$self
->args->(
$arg
);
}
foreach
my
$ns
(
keys
%{
$self
->{_extensions} } ) {
print
STDERR
"Launching OpenIP $ns hook\n"
if
(DEBUG);
my
$h
;
(
$is_ext_trusted
{
$ns
},
$h
) =
$self
->{_extensions}->{
$ns
}->(
$u
,
$trust_root
,
$is_identity
,
$is_trusted
,
delete
(
$extArgs
{
$ns
} ) || {}
);
if
(
$h
) {
while
(
my
(
$k
,
$v
) =
each
%$h
) {
print
STDERR
"$ns returned data: $k => $v\n"
if
(DEBUG);
$extVars
{
"$ns.$k"
} =
$v
;
}
}
$is_exts_trusted
&&=
$is_ext_trusted
{
$ns
};
}
}
if
(
$is_identity
&&
$is_trusted
&&
$is_exts_trusted
) {
my
%sArgs
= (
identity
=>
$identity
,
claimed_id
=>
$self
->args(
'openid.claimed_id'
),
return_to
=>
$return_to
,
assoc_handle
=>
$self
->args(
"openid.assoc_handle"
),
ns
=>
$self
->args(
'openid.ns'
),
);
$sArgs
{additional_fields} = \
%extVars
if
(
%extVars
);
my
$ret_url
=
$self
->signed_return_url(
%sArgs
);
return
(
"redirect"
,
$ret_url
);
}
my
%setup_args
= (
$self
->_setup_map(
"trust_root"
),
$trust_root
,
$self
->_setup_map(
"realm"
),
$trust_root
,
$self
->_setup_map(
"return_to"
),
$return_to
,
$self
->_setup_map(
"identity"
),
$identity
,
$self
->_setup_map(
"assoc_handle"
),
$self
->args(
"openid.assoc_handle"
),
%extVars
,
);
$setup_args
{
$self
->_setup_map(
'ns'
) } =
$self
->args(
'openid.ns'
)
if
$self
->args(
'openid.ns'
);
my
$setup_url
=
$self
->{setup_url}
or Carp::croak(
"No setup_url defined."
);
_push_url_arg( \
$setup_url
,
%setup_args
);
if
(
$mode
eq
"checkid_immediate"
) {
my
$ret_url
=
$return_to
;
if
(
$self
->args(
'openid.ns'
) eq OPENID2_NS ) {
_push_url_arg( \
$ret_url
,
"openid.ns"
,
$self
->args(
'openid.ns'
) );
_push_url_arg( \
$ret_url
,
"openid.mode"
,
"setup_needed"
);
}
else
{
_push_url_arg( \
$ret_url
,
"openid.mode"
,
"id_res"
);
_push_url_arg( \
$ret_url
,
"openid.user_setup_url"
,
$setup_url
);
}
return
(
"redirect"
,
$ret_url
);
}
else
{
if
(
$redirect_for_setup
) {
return
(
"redirect"
,
$setup_url
);
}
else
{
return
(
"setup"
, \
%setup_args
);
}
}
}
1;