File: //usr/share/perl5/Net/OpenID/Extension/SimpleRegistration.pm
package Net::OpenID::Extension::SimpleRegistration;
$Net::OpenID::Extension::SimpleRegistration::VERSION = '1.20';
use base qw(Net::OpenID::Extension);
use strict;
use Carp;
use constant namespace_uris => {
'http://openid.net/extensions/sreg/1.1' => 'sreg',
};
sub new_request {
my ($class, %opts) = @_;
return Net::OpenID::Extension::SimpleRegistration::Request->new(%opts);
}
sub received_request {
my ($class, $args) = @_;
return Net::OpenID::Extension::SimpleRegistration::Request->received($args);
}
sub new_response {
my ($class, %opts) = @_;
return Net::OpenID::Extension::SimpleRegistration::Request->new(%opts);
}
sub received_response {
my ($class, $args) = @_;
return Net::OpenID::Extension::SimpleRegistration::Request->received($args);
}
package Net::OpenID::Extension::SimpleRegistration::Request;
$Net::OpenID::Extension::SimpleRegistration::Request::VERSION = '1.20';
use base qw(Net::OpenID::ExtensionMessage);
use strict;
sub new {
my ($class, %opts) = @_;
my $self = bless {}, $class;
$self->required_fields(delete $opts{required_fields});
$self->optional_fields(delete $opts{optional_fields});
$self->policy_url(delete $opts{policy_url});
$self->{required_fields} = [ split(',', $self->{required_fields}) ] unless ref $self->{required_fields};
$self->{optional_fields} = [ split(',', $self->{optional_fields}) ] unless ref $self->{optional_fields};
Carp::croak("Unsupported options: ".join(',', keys %opts)) if %opts;
return $self;
}
sub received {
my ($class, $args) = @_;
my $self = $class->new();
$args = $args->{sreg} || {};
$self->required_fields($args->{required});
$self->optional_fields($args->{optional});
return $self;
}
sub extension_arguments {
my ($self) = @_;
my $ret = {};
$ret->{required} = join(',', @{$self->required_fields}) if @{$self->required_fields};
$ret->{optional} = join(',', @{$self->optional_fields}) if @{$self->optional_fields};
$ret->{policy_url} = $self->policy_url if $self->policy_url;
return {
sreg => $ret,
};
}
sub required_fields {
my ($self, $value) = @_;
if (defined $value) {
$value = [] unless $value;
$value = [ split(',', $value) ] unless ref $value;
$self->{required_fields} = $value;
}
else {
return $self->{required_fields};
}
}
sub optional_fields {
my ($self, $value) = @_;
if (defined $value) {
$value = [] unless $value;
$value = [ split(',', $value) ] unless ref $value;
$self->{optional_fields} = $value;
}
else {
return $self->{optional_fields};
}
}
sub add_required_field {
my ($self, $value) = @_;
push @{$self->{required_fields}}, $value;
}
sub add_optional_field {
my ($self, $value) = @_;
push @{$self->{optional_fields}}, $value;
}
sub policy_url {
my ($self, $value) = @_;
if (defined $value) {
$self->{policy_url} = $value;
}
else {
return $self->{optional_fields};
}
}
package Net::OpenID::Extension::SimpleRegistration::Response;
$Net::OpenID::Extension::SimpleRegistration::Response::VERSION = '1.20';
use base qw(Net::OpenID::ExtensionMessage);
use strict;
use constant FIELDS => [qw(nickname email fullname dob gender postcode country language timezone)];
use fields FIELDS();
BEGIN {
# Create an accessor for each of the fields
foreach my $field_name (@{FIELDS()}) {
no strict qw(refs);
*{'Net::OpenID::Extension::SimpleRegistration::Response::'.$field_name} = sub {
my ($self, $value) = @_;
if (defined $value) {
$self->{$field_name} = $value;
}
else {
return $self->{$field_name};
}
};
}
}
sub new {
my ($class, %opts) = @_;
my $self = fields::new($class);
foreach my $field_name (@{FIELDS()}) {
$self->{$field_name} = delete $opts{$field_name};
}
Carp::croak("Unrecognised options: ".join(',', %opts)) if %opts;
return $self;
}
sub received {
my ($class, $args) = @_;
$args = $args->{sreg} || {};
my %opts = ();
foreach my $field_name (@{FIELDS()}) {
$opts{$field_name} = $args->{$field_name} if $args->{$field_name};
}
return $class->new(%opts);
}
sub extension_arguments {
my ($self) = @_;
# De-reference and then re-reference the hash to shake off the blessedness
my $ret = { %$self };
return {
sreg => $ret,
};
}
=pod
=head1 NAME
Net::OpenID::Extension::SimpleRegistration - Support for the Simple Registration extension (SREG)
=head1 VERSION
version 1.20
=head1 SYNOPSIS
In Consumer...
my $sreg_req = $claimed_identity->add_extension_request('Net::OpenID::Extension::SimpleRegistration', (
required_fields => [qw(nickname email)],
optional_fields => [qw(country language timezone)],
policy_url => "http://example.com/policy.html",
));
Then, in Server, when handling the authentication request...
# FIXME: What object do we have in ::Server that can hold this method?
my $sreg_req = $something->get_extension_request('Net::OpenID::Extension::SimpleRegistration');
my $required_fields = $sreg_req->required_fields;
my $optional_fields = $sreg_req->optional_fields;
my $policy_url = $sreg_req->policy_url;
When Server sends back its response...
# FIXME: Again, what object do we have to hold this method?
my $sreg_res = $something->add_extension_response('Net::OpenID::Extension::SimpleRegistration', (
nickname => $nickname,
email => $email,
));
And finally, when back in Consumer receiving the response:
my $sreg_res = $verified_identity->get_extension_response('Net::OpenID::Extension::SimpleRegistration');
my $nickname = $sreg_res->nickname;
my $email = $sreg_res->email;
my $country = $sreg_res->country;
my $language = $sreg_res->language;
my $timezone = $sreg_res->timezone;
=cut
1;