######################################################################
#
# EPrints Register Account
#
######################################################################
#
# This file is part of GNU EPrints 2.
#
# Copyright (c) 2000-2004 University of Southampton, UK. SO17 1BJ.
#
# EPrints 2 is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# EPrints 2 is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with EPrints 2; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
######################################################################
use EPrints;
use strict;
my $session = new EPrints::Session;
exit( 0 ) unless( defined $session );
my( $page, $title ) = make_page( $session );
$session->build_page( $title, $page, "register" );
$session->send_page();
$session->terminate();
sub make_page
{
my( $session ) = @_;
my $min = 0;
my $signup_style = $session->get_repository->get_conf( "signup_style" );
if( defined $signup_style && $signup_style eq "minimal" )
{
$min = 1;
}
unless( $session->get_repository->get_conf("allow_web_signup") )
{
return mk_err_page(
$session,
"cgi/register:no_web_signup" );
}
my $user_ds = $session->get_repository->get_dataset( "user" );
my $extrafields = $session->get_repository->get_conf( "extra_reg_fields" );
my $default_type = $session->get_repository->get_conf( "default_user_type" );
my $extrafields = $session->get_repository->get_conf( "user_registration_fields" ) if !$min;
$extrafields = [] if( !defined $extrafields );
my $fieldlist = [];
my( $f ) = {};
foreach my $fieldid ( @{$extrafields} )
{
$f->{$fieldid} = $user_ds->get_field( $fieldid )->clone();
push @{$fieldlist}, $f->{$fieldid};
}
my @sysfields;
unless( $min )
{
@sysfields = ( "email", "username", "newpassword" );
}
else
{
@sysfields = ( "email", "newpassword" );
}
foreach my $fieldid ( @sysfields )
{
$f->{$fieldid} = $user_ds->get_field( $fieldid )->clone();
$f->{$fieldid}->set_property( "confid" , "register" );
$f->{$fieldid}->set_property( "required", 1 );
push @{$fieldlist}, $f->{$fieldid};
}
if( !$session->have_parameters() )
{
my $page = $session->make_doc_fragment;
unless( $min )
{
$page->appendChild( $session->html_phrase( "cgi/register:intro" ) );
}
else
{
$page->appendChild( $session->html_phrase( "cgi/register:intro_minimal" ) );
}
my $defaults = { lang => $session->get_langid() };
$page->appendChild( make_reg_form( $session, $fieldlist, $defaults ));
my $title = $session->html_phrase( "cgi/register:title" );
return( $page, $title );
}
if( $session->have_parameters() )
{
}
# Process the form.
my $v = { lang => $session->get_langid() };
foreach my $field ( @{$fieldlist} )
{
$v->{$field->get_name} = $field->form_value( $session );
}
$v->{username} = $v->{email} if $min;
foreach my $field ( @{$fieldlist} )
{
if( !EPrints::Utils::is_set( $v->{$field->get_name} )
&& $field->get_property( "required" ) )
{
return mk_err_page(
$session,
"cgi/register:missing_field",
$fieldlist,
$v,
{fieldname=>$field->render_name($session)} );
}
}
if( defined EPrints::DataObj::User::user_with_email( $session, $v->{email} ) )
{
return mk_err_page(
$session,
"cgi/register:email_exists",
$fieldlist,
$v,
{email=>$session->make_text( $v->{email} )} );
}
if( defined EPrints::DataObj::User::user_with_username( $session, $v->{username} ) )
{
return mk_err_page(
$session,
"cgi/register:username_exists",
$fieldlist,
$v,
{username=>$session->make_text( $v->{username} )} );
}
my $pin = sprintf( "%04X%04X%04X%04X",int rand 0xffff,int rand 0xffff,int rand 0xffff,int rand 0xffff );
my $user_data = {
usertype => $default_type,
newemail => undef,
pin => $pin,
pinsettime => time(),
};
foreach my $fieldid ( keys %{$f} )
{
$user_data->{$fieldid} = $v->{$fieldid};
}
if( $min )
{
$user_data->{username} = $v->{email};
}
my $user_dataset = $session->get_repository->get_dataset( "user" );
my $user = $user_dataset->create_object( $session, $user_data );
my $page = $session->make_doc_fragment;
$page->appendChild( $session->html_phrase(
"cgi/register:created_new_user",
email=>$session->make_text( $v->{email} ),
username=>$session->make_text( $v->{username} ) ) );
my $maxdelta = EPrints::Time::human_delay(
$session->get_repository->get_conf( "pin_timeout" ) );
# If email fails then we should abort
my $rc = $user->mail(
"cgi/register:account",
$session->html_phrase(
"mail_password_pin",
confirmurl => $session->render_link( $session->get_repository->get_conf( "perl_url" )."/confirm?userid=".$user->get_value( "userid" )."&pin=".$pin ),
username => $user->render_value( "username" ),
maxdelta => $session->make_text( $maxdelta ) ) );
if( !$rc )
{
# couldn't send email, so remove the user object again
# and apologise
$user->remove();
return mk_err_page(
$session,
"general:email_failed",
$fieldlist,
$v,
{} );
}
#` $page->appendChild( $session->html_phrase( "general:frontpage_link" ) );
my $title = $session->html_phrase( "cgi/register:title" );
return( $page, $title );
}
sub mk_err_page
{
my( $session, $phrase, $fieldlist, $defaults, $opts ) = @_;
my $page = $session->make_doc_fragment;
$page->appendChild( $session->render_message( "error",
$session->html_phrase( $phrase, %{$opts} ) ) );
# $page->appendChild( $session->html_phrase( "general:frontpage_link" ) );
if( defined $fieldlist )
{
#$page->appendChild( $session->render_ruler );
$page->appendChild( make_reg_form( $session, $fieldlist, $defaults ) );
}
return(
$page,
$session->html_phrase( "cgi/register:error" ) );
}
sub make_reg_form
{
my( $session, $fieldlist, $defaults ) = @_;
$defaults->{newpassword} = undef;
return $session->render_input_form(
fields=>$fieldlist,
values=>$defaults,
show_help=>1,
show_names=>1,
comments=>{above_buttons=>$session->html_phrase( "cgi/register:register_agreement" )},
default_action=>"submit",
buttons=>{
submit=>$session->phrase( "cgi/register:action_submit" )
},
dest=>"register" );
}