shell bypass 403
# Copyrights 2003-2023 by [Mark Overmeer <markov@cpan.org>].
# For other contributors see ChangeLog.
# See the manual pages for details on the licensing terms.
# Pod stripped from pm file by OODoc 2.03.
# This code is part of distribution Math-Polygon. Meta-POD processed with
# OODoc into POD and HTML manual-pages. See README.md
# Copyright Mark Overmeer. Licensed under the same terms as Perl itself.
package User::Identity;
use vars '$VERSION';
$VERSION = '1.02';
use base 'User::Identity::Item';
use strict;
use warnings;
use Carp;
use overload '""' => 'fullName';
#-----------------------------------------
my @attributes = qw/charset courtesy birth full_name formal_name
firstname gender initials language nickname prefix surname titles /;
sub init($)
{ my ($self, $args) = @_;
exists $args->{$_} && ($self->{'UI_'.$_} = delete $args->{$_})
foreach @attributes;
$self->SUPER::init($args);
}
sub type() { 'user' }
sub user() { shift }
sub charset() { shift->{UI_charset} || $ENV{LC_CTYPE} }
sub nickname()
{ my $self = shift;
$self->{UI_nickname} || $self->name;
# TBI: If OS-specific info exists, then username
}
sub firstname()
{ my $self = shift;
$self->{UI_firstname} || ucfirst $self->nickname;
}
sub initials()
{ my $self = shift;
return $self->{UI_initials}
if defined $self->{UI_initials};
if(my $firstname = $self->firstname)
{ my $i = '';
while( $firstname =~ m/(\w+)(\-)?/g )
{ my ($part, $connect) = ($1,$2);
$connect ||= '.';
$part =~ m/^(chr|th|\w)/i;
$i .= ucfirst(lc $1).$connect;
}
return $i;
}
}
sub prefix() { shift->{UI_prefix} }
sub surname() { shift->{UI_surname} }
sub fullName()
{ my $self = shift;
return $self->{UI_full_name}
if defined $self->{UI_full_name};
my ($first, $prefix, $surname)
= @$self{ qw/UI_firstname UI_prefix UI_surname/};
$surname = ucfirst $self->nickname if defined $first && ! defined $surname;
$first = $self->firstname if !defined $first && defined $surname;
my $full = join ' ', grep {defined $_} ($first,$prefix,$surname);
$full = $self->firstname unless length $full;
# TBI: if OS-specific knowledge, then unix GCOS?
$full;
}
sub formalName()
{ my $self = shift;
return $self->{UI_formal_name}
if defined $self->{UI_formal_name};
my $initials = $self->initials;
my $firstname = $self->{UI_firstname};
$firstname = "($firstname)" if defined $firstname;
my $full = join ' ', grep {defined $_}
$self->courtesy, $initials
, @$self{ qw/UI_prefix UI_surname UI_titles/ };
}
my %male_courtesy
= ( mister => 'en'
, mr => 'en'
, sir => 'en'
, 'de heer' => 'nl'
, mijnheer => 'nl'
, dhr => 'nl'
, herr => 'de'
);
my %male_courtesy_default
= ( en => 'Mr.'
, nl => 'De heer'
, de => 'Herr'
);
my %female_courtesy
= ( miss => 'en'
, ms => 'en'
, mrs => 'en'
, madam => 'en'
, mevr => 'nl'
, mevrouw => 'nl'
, frau => 'de'
);
my %female_courtesy_default
= ( en => 'Madam'
, nl => 'Mevrouw'
, de => 'Frau'
);
sub courtesy()
{ my $self = shift;
return $self->{UI_courtesy}
if defined $self->{UI_courtesy};
my $table
= $self->isMale ? \%male_courtesy_default
: $self->isFemale ? \%female_courtesy_default
: return undef;
my $lang = lc $self->language;
return $table->{$lang} if exists $table->{$lang};
$lang =~ s/\..*//; # "en_GB.utf8" --> "en-GB" and retry
return $table->{$lang} if exists $table->{$lang};
$lang =~ s/[-_].*//; # "en_GB.utf8" --> "en" and retry
$table->{$lang};
}
# TBI: if we have a courtesy, we may detect the language.
# TBI: when we have a postal address, we may derive the language from
# the country.
# TBI: if we have an e-mail addres, we may derive the language from
# that.
sub language() { shift->{UI_language} || 'en' }
sub gender() { shift->{UI_gender} }
sub isMale()
{ my $self = shift;
if(my $gender = $self->{UI_gender})
{ return $gender =~ m/^[mh]/i;
}
if(my $courtesy = $self->{UI_courtesy})
{ $courtesy = lc $courtesy;
$courtesy =~ s/[^\s\w]//g;
return 1 if exists $male_courtesy{$courtesy};
}
undef;
}
sub isFemale()
{ my $self = shift;
if(my $gender = $self->{UI_gender})
{ return $gender =~ m/^[vf]/i;
}
if(my $courtesy = $self->{UI_courtesy})
{ $courtesy = lc $courtesy;
$courtesy =~ s/[^\s\w]//g;
return 1 if exists $female_courtesy{$courtesy};
}
undef;
}
sub dateOfBirth() { shift->{UI_birth} }
sub birth()
{ my $birth = shift->dateOfBirth;
my $time;
if($birth =~ m/^\s*(\d{4})[-\s]*(\d{2})[-\s]*(\d{2})\s*$/)
{ # Pre-formatted.
return sprintf "%04d%02d%02d", $1, $2, $3;
}
eval "require Date::Parse";
unless($@)
{ my ($day,$month,$year) = (Date::Parse::strptime($birth))[3,4,5];
if(defined $year)
{ return sprintf "%04d%02d%02d"
, ($year + 1900)
, (defined $month ? $month+1 : 0)
, ($day || 0);
}
}
# TBI: Other date parsers
undef;
}
sub age()
{ my $birth = shift->birth or return;
my ($year, $month, $day) = $birth =~ m/^(\d{4})(\d\d)(\d\d)$/;
my ($today, $tomonth, $toyear) = (localtime)[3,4,5];
$tomonth++;
my $age = $toyear+1900 - $year;
$age-- if $month > $tomonth || ($month == $tomonth && $day >= $today);
$age;
}
sub titles() { shift->{UI_titles} }
1;