1###############################################################################
2# Register.pm                                                                 #
3# $Date: 12.02.14 $                                                           #
4###############################################################################
5# YaBB: Yet another Bulletin Board                                            #
6# Open-Source Community Software for Webmasters                               #
7# Version:        YaBB 2.6.11                                                 #
8# Packaged:       December 2, 2014                                            #
9# Distributed by: http://www.yabbforum.com                                    #
10# =========================================================================== #
11# Copyright (c) 2000-2014 YaBB (www.yabbforum.com) - All Rights Reserved.     #
12# Software by:  The YaBB Development Team                                     #
13#               with assistance from the YaBB community.                      #
14###############################################################################
15# use strict;
16# use warnings;
17no warnings qw(uninitialized once redefine);
18use CGI::Carp qw(fatalsToBrowser);
19use English '-no_match_vars';
20our $VERSION = '2.6.11';
21
22$registerpmver = 'YaBB 2.6.11 $Revision: 1611 $';
23if ( $action eq 'detailedversion' ) { return 1; }
24if ( !$iamguest
25    && ( !$admin && $action ne 'activate' && $action ne 'admin_descision' ) )
26{
27    fatal_error('no_registration_logged_in');
28}
29
30require Sources::Mailer;
31LoadLanguage('Register');
32LoadCensorList();
33
34get_template('Register');
35
36if ( $OSNAME =~ /Win/sm ) {
37    my $regstyle = q~ style="text-transform: lowercase"~;
38}
39else {
40    my $regstyle = q{};
41}
42
43sub Register {
44    if ( $regtype == 0 && $iamguest ) { fatal_error('registration_disabled'); }
45    if ( $RegAgree == 1 && $FORM{'regnoagree'} ) {
46        $yySetLocation = qq~$scripturl~;
47        redirectexit();
48    }
49    if ( $RegAgree == 1 && !$FORM{'regagree'} ) {
50        $yytitle      = qq~$register_txt{'97'}~;
51        $yynavigation = qq~› $register_txt{'97'}~;
52        if ($language) {
53            fopen( AGREE, "$langdir/$language/agreement.txt" );
54        }
55        else {
56            fopen( AGREE, "$langdir/$lang/agreement.txt" );
57        }
58        @agreement = <AGREE>;
59        fclose(AGREE);
60        $fullagree = join q{}, @agreement;
61        $fullagree =~ s/\n/<br \/>/gsm;
62        $yymain .= $myregister_fullagree;
63        $yymain =~ s/{yabb fullagree}/$fullagree/sm;
64        template();
65        exit;
66    }
67    my (
68        $tmpregname,     $tmprealname, $tmpregemail,    $tmpregpasswrd1,
69        $tmpregpasswrd2, $hidechecked, $reg_start_time, @birthdate
70    );
71    $yytitle      = $register_txt{'97'};
72    $yynavigation = qq~&rsaquo; $register_txt{'97'}~;
73    if ( $FORM{'reglanguage'} ) {
74        $language = $FORM{'reglanguage'};
75        LoadLanguage('Register');
76    }
77    if ( $FORM{'regusername'} ) { $tmpregname  = $FORM{'regusername'}; }
78    if ( $FORM{'regrealname'} ) { $tmprealname = $FORM{'regrealname'}; }
79    if ( $FORM{'email'} )       { $tmpregemail = $FORM{'email'}; }
80    if ( $FORM{'hideemail'} || !exists $FORM{'hideemail'} ) {
81        $hidechecked = q~ checked="checked"~;
82    }
83    if ( $FORM{'add_field0'} )  { $newfield       = $FORM{'add_field0'}; }
84    if ( $FORM{'passwrd1'} )    { $tmpregpasswrd1 = $FORM{'passwrd1'}; }
85    if ( $FORM{'passwrd2'} )    { $tmpregpasswrd2 = $FORM{'passwrd2'}; }
86    if ( $FORM{'reason'} )      { $reason         = $FORM{'reason'}; }
87    if ( $FORM{'birth_day'} )   { $birthdate[0]   = $FORM{'birth_day'}; }
88    if ( $FORM{'birth_month'} ) { $birthdate[1]   = $FORM{'birth_month'}; }
89    if ( $FORM{'birth_year'} )  { $birthdate[2]   = $FORM{'birth_year'}; }
90
91    $min_reg_time ||= 0;
92    if ( $min_reg_time > 0 ) {
93        $reg_start_time =
94          qq~<input type="hidden" name="reg_start_time" value="$date" />~;
95    }
96
97    if ( !$langopt ) { guestLangSel(); }
98
99    if ( -e "$vardir/email_domain_filter.txt" ) {
100        require "$vardir/email_domain_filter.txt";
101    }
102    if ($adomains) {
103        @domains = split /\,/xsm, $adomains;
104        $aedomains = $myaedomains_a;
105        $aedomains =~ s/{yabb tmpregemail}/$tmpregemail/sm;
106        foreach (@domains) {
107            $aedomains .=
108              ( $_ =~ m/\@/xsm )
109              ? qq~<option value="$_">$_</option>~
110              : qq~<option value="\@$_">&#64;$_</option>~;
111        }
112        $aedomains .= $myaedomains_b;
113    }
114    else {
115        $aedomains .=
116qq~<input type="text" maxlength="100" onchange="checkAvail('$scripturl',this.value,'email')" name="email" id="email" value="$tmpregemail" size="45" />~;
117    }
118
119    $yymain .= qq~
120<script type="text/javascript" src="$yyhtml_root/ajax.js"></script>
121<form action="$scripturl?action=register2" method="post" name="creator" onsubmit="return CheckRegFields();" accept-charset="$yymycharset">
122    $reg_start_time~;
123    if ( $RegAgree == 1 && $FORM{'regagree'} ) {
124        $yymain .= q~
125<input type="hidden" name="regagree" value="yes" />~;
126    }
127    $yymain .= $myregister_regfill_a;
128
129    if ( $morelang > 1 ) {
130        $yymain .= $myregister_morelang;
131        $yymain =~ s/{yabb langopt}/$langopt/sm;
132    }
133    $newfield = q{};
134## user name section
135    $yymain .= $myregister_regfill_b;
136    $yymain =~ s/{yabb tmpregname}/$tmpregname/sm;
137    $yymain =~ s/{yabb regstyle}/$regstyle/sm;
138    $yymain =~ s/{yabb language}/$language/sm;
139
140    if ($name_cannot_be_userid) {
141        $yymain .= qq~
142            <br /><span class="small">$register_txt{'521'}</span>~;
143    }
144
145    $email2 = q{};
146    if ( $imp_email_check == 1 ) {
147        eval {
148            require Net::DNS;
149        };
150        if (!$EVAL_ERROR ) {
151            $email2 = $myregister_email2;
152            $email2 =~ s/{yabb email2}/$register_txt{'70'}/sm;
153        }
154    }
155
156    $yymain .= $myregister_avail;
157    $yymain =~ s/{yabb tmprealname}/$tmprealname/sm;
158    $yymain =~ s/{yabb aedomains}/$aedomains/sm;
159
160    if ( $allow_hide_email == 1 ) {
161        $yymain .= qq~
162            <br /><input type="checkbox" name="hideemail" id="hideemail" value="1"$hidechecked /> <label for="hideemail">$register_txt{'721'}</label>
163        ~;
164    }
165    $yymain .= $myregister_endrow;
166    $yymain .= $email2;
167
168    if ($birthday_on_reg) {
169        my $editAgeTxt;
170        if ( $editAgeLimit == 1 ) {
171            $editAgeTxt =
172              qq~<br /><span class="small">$register_txt{'birthday_c'}</span>~;
173        }
174        timetostring($date);
175        if ( $timeselected =~ /[145]/xsm ) {
176            $yymain .=
177                $myregister_bdonreg
178              . ( $birthday_on_reg == 2 ? $myreg_req : q{} )
179              . qq~ <span class="small">$register_txt{'birthday_a'}</span>~;
180        }
181        else {
182            $yymain .=
183                $myregister_bdonreg_2
184              . ( $birthday_on_reg == 2 ? $myreg_req : q{} )
185              . qq~ <span class="small">$register_txt{'birthday_b'}</span>~;
186        }
187        $yymain =~ s/{yabb editAgeTxt}/$editAgeTxt/sm;
188        $yymain =~ s/{yabb birthdate0}/$birthdate[0]/sm;
189        $yymain =~ s/{yabb birthdate1}/$birthdate[1]/sm;
190        $yymain =~ s/{yabb birthdate2}/$birthdate[2]/sm;
191
192        $yymain .= $myregister_endrow;
193    }
194
195    if ($gender_on_reg == 1 ) {
196        my $editGenderTxt;
197        my $nongen_opt = q{};
198        if ( $editGenderLimit == 1 ) {
199            $editGenderTxt =
200              qq~<br /><span class="small">$register_txt{'gender_edit'}</span>~;
201        }
202        if ( $gender_on_reg == 2 ) {
203            $nongen_opt = $myreg_req;
204        }
205
206        $yymain .= $myregister_gender;
207        $yymain =~ s/{yabb editGenderTxt}/$editGenderTxt/sm;
208        $yymain =~ s/{yabb nongen_opt}/$nongen_opt/sm;
209    }
210    if ( !$emailpassword ) {
211        $yymain .= password_check();
212    }
213
214    if ( $addmemgroup_enabled == 1 || $addmemgroup_enabled == 3 ) {
215        my ( $addmemgroup, $selsize );
216        foreach (@nopostorder) {
217            my (
218                $title, undef, undef, undef, undef, undef,
219                undef,  undef, undef, undef, $additional
220            ) = split /\|/xsm, $NoPost{$_};
221            if ($additional) {
222                $addmemgroup .= qq~<option value="$_">$title</option>~;
223                $selsize++;
224            }
225        }
226        $selsize = $selsize > 6 ? 6 : $selsize;
227        my $additional_explain =
228            $addmemgroup_enabled == 1
229          ? $register_txt{'766'}
230          : $register_txt{'767'};
231        if ( $selsize > 1 ) { $additional_explain .= $register_txt{'767a'}; }
232
233        if ($addmemgroup) {
234            $yymain .= $myregister_addmem;
235            $yymain =~ s/{yabb additional_explain}/$additional_explain/sm;
236            $yymain =~ s/{yabb selsize}/$selsize/sm;
237            $yymain =~ s/{yabb addmemgroup}/$addmemgroup/sm;
238        }
239    }
240
241    if ( $regtype == 1 ) {
242        $yymain .=
243            $myregister_regreason_a
244          . qq~            <textarea cols="60" rows="7" name="reason" id="reason">$reason</textarea>~
245          . $myregister_regreason_c
246          . length($RegReasonSymbols)
247          . $myregister_regreason_b;
248        $yymain =~ s/{yabb reason}/$reason/sm;
249        $yymain =~ s/{yabb RegReasonSymbols}/$RegReasonSymbols/gsm;
250    }
251
252    if ($extendedprofiles) {
253        require Sources::ExtendedProfiles;
254        my $reg_ext_prof = ext_register();
255        $yymain .= $reg_ext_prof;
256    }
257
258    if ($regcheck) {
259        require Sources::Decoder;
260        validation_code();
261        $yymain .= $myregister_regcheck;
262        $yymain =~ s/{yabb flood_text}/$flood_text/sm;
263        $yymain =~ s/{yabb showcheck}/$showcheck/sm;
264    }
265    if ( $en_spam_questions && -e "$langdir/$language/spam.questions" ) {
266        SpamQuestion();
267        my $verification_question_desc;
268        if ($spam_questions_case) {
269            $verification_question_desc =
270              qq~<br />$register_txt{'verification_question_case'}~;
271        }
272        $yymain .= $myregister_spamquest;
273
274        $yymain =~ s/{yabb spam_question}/$spam_question/sm;
275        $yymain =~
276          s/{yabb verification_question_desc}/$verification_question_desc/sm;
277        $yymain =~ s/{yabb spam_question_id}/$spam_question_id/sm;
278        $yymain =~ s/{yabb spam_question_image}/$spam_image/sm;
279    }
280    if ( $honeypot == 1 ) {
281        fopen( HONEY, "<$langdir/$language/honey.txt" )
282          or fatal_error( 'cannot_open', "$langdir/$language/honey.txt", 1 );
283        @honey = <HONEY>;
284        fclose(HONEY);
285        chomp @honey;
286        $hony      = int rand $#honey;
287        $newfieldb = $honey[$hony];
288
289        $yymain .= $myregister_honey;
290        $yymain =~ s/{yabb newfieldb}/$newfieldb/sm;
291        $yymain =~ s/{yabb newfield}/$newfield/sm;
292    }
293
294    # SpamFruits courtesy of Carsten Dalgaard #
295    if ( $spamfruits == 1 ) {
296        my @fruits =
297          ( $fruittxt{'2'}, $fruittxt{'3'}, $fruittxt{'4'}, $fruittxt{'5'} );
298        my $rdn = int rand 4;
299        $fruit = $fruits[$rdn];
300        $yymain .= $myregister_fruits;
301        $yymain =~ s/{yabb fruit}/$fruit/gsm;
302        $yymain .= qq~
303                <script type="text/javascript">
304                    function ShowFruits() {
305                        var visfruits = "<html><head><link rel='stylesheet' href='$extpagstyle' type='text/css' /></head><body class='windowbg2'> ";
306                        visfruits += "<img src='$defaultimagesdir/fruits.png' width='290' height='75' name='fruitsview' id='fruitsview' style='position: absolute; top: 0px; left: 0px; cursor: pointer;' alt='' onclick='FruitClick(event)' /> ";
307                        visfruits += "<img src='$defaultimagesdir/fruitcheck.png' id='frmarker' style='z-index: 2; display: none;'> ";
308                        visfruits += "<script type='text/javascript'> "
309                        visfruits += "var xcor = 0; "
310                        visfruits += "var ycor = 0; "
311                        visfruits += "var mrkpos = 30; "
312                        visfruits += "function FruitClick(event) \{ "
313                        visfruits += "xcor = (event.clientX); "
314                        visfruits += "ycor = (event.clientY); "
315                        visfruits += "if(xcor > 0) mrkpos = 30; "
316                        visfruits += "if(xcor > 75) mrkpos = 100; "
317                        visfruits += "if(xcor > 145) mrkpos = 170; "
318                        visfruits += "if(xcor > 215) mrkpos = 240; "
319                        visfruits += "document.getElementById('frmarker').style.display = 'block'; "
320                        visfruits += "document.getElementById('frmarker').style.position = 'absolute'; "
321                        visfruits += "document.getElementById('frmarker').style.left = mrkpos + 'px'; "
322                        visfruits += "document.getElementById('frmarker').style.top = '67px'; "
323                        visfruits += "parent.document.creator.ycord.value = ycor; "
324                        visfruits += "parent.document.creator.xcord.value = xcor; "
325                        visfruits += "\} "
326                        visfruits += "<\\/script> <\\/body> <\\/html>";
327                        fruits.document.open("text/html");
328                        fruits.document.write(visfruits);
329                        fruits.document.close();
330                    }
331                    ShowFruits()
332                </script>~;
333        $yymain .= $myregister_endrow;
334    }
335
336    if ( $RegAgree == 2 ) {
337        if ($language) {
338            fopen( AGREE, "$langdir/$language/agreement.txt" );
339        }
340        else {
341            fopen( AGREE, "$langdir/$lang/agreement.txt" );
342        }
343        @agreement = <AGREE>;
344        fclose(AGREE);
345        $fullagree = join q{}, @agreement;
346        $fullagree =~ s/\n/<br \/>/gsm;
347        $yymain .= $myregister_regagree;
348        $yymain =~ s/{yabb fullagree}/$fullagree/gsm;
349
350    }
351    $yymain .= $myregister_endform;
352    $yymain .= qq~
353<script type="text/javascript">
354    document.creator.regusername.focus();
355
356    function CheckRegFields() {
357        if (document.creator.regusername.value === '') {
358            alert("$register_txt{'error_username'}");
359            document.creator.regusername.focus();
360            return false;
361        }~;
362        if ( !$emailpassword ) {
363            $yymain .= qq~
364        if (document.creator.regusername.value == document.creator.passwrd1.value || document.creator.regrealname.value == document.creator.passwrd1.value) {
365            alert("$register_txt{'error_usernameispass'}");
366            document.creator.regusername.focus();
367            return false;
368        }~;
369        }
370    $yymain .= qq~
371        if (document.creator.regrealname.value === '') {
372            alert("$register_txt{'error_realname'}");
373            document.creator.regrealname.focus();
374            return false;
375        }~ .
376
377      (
378        $name_cannot_be_userid
379        ? qq~
380        if (document.creator.regusername.value == document.creator.regrealname.value) {
381            alert("$register_txt{'error_name_cannot_be_userid'}");
382            document.creator.regrealname.focus();
383            return false;
384        }~
385        : q{}
386      )
387
388      . qq~
389        if (document.creator.email.value === '') {
390            alert("$register_txt{'error_email'}");
391            document.creator.email.focus();
392            return false;
393        }~ .
394
395      (
396          $imp_email_check ? qq~
397        if (document.creator.email2.value === '') {
398            alert("$register_txt{'error_email2'}");
399            document.creator.email2.focus();
400            return false;
401        }
402        if (document.creator.email.value != document.creator.email2.value) {
403            alert("$register_txt{'error_email3'}");
404            document.creator.email.focus();
405            return false;
406        }~ : q{}
407      ) .
408
409      (
410        $birthday_on_reg
411        ? q~
412        if (~
413          . (
414            $birthday_on_reg == 1
415            ? 'document.creator.birth_day.value.length && '
416            : q{}
417          )
418          . qq~(document.creator.birth_day.value.length < 2 || document.creator.birth_day.value < 1 || document.creator.birth_day.value > 31 || (/\\D/.test)(document.creator.birth_day.value))) {
419            alert("$register_txt{'error_birth_day'}");
420            document.creator.birth_day.focus();
421            return false;
422        }
423        if (~
424          . (
425            $birthday_on_reg == 1
426            ? 'document.creator.birth_month.value.length && '
427            : q{}
428          )
429          . qq~(document.creator.birth_month.value.length < 2 || document.creator.birth_month.value < 1 || document.creator.birth_month.value > 12 || (/\\D/.test)(document.creator.birth_month.value))) {
430            alert("$register_txt{'error_birth_month'}");
431            document.creator.birth_month.focus();
432            return false;
433        }
434        if (~
435          . (
436            $birthday_on_reg == 1
437            ? 'document.creator.birth_year.value.length && '
438            : q{}
439          )
440          . qq~(document.creator.birth_year.value.length < 4 || (/\\D/.test)(document.creator.birth_year.value))) {
441            alert("$register_txt{'error_birth_year'}");
442            document.creator.birth_year.focus();
443            return false;
444        }
445        if (~
446          . (
447            $birthday_on_reg == 1
448            ? 'document.creator.birth_year.value.length && '
449            : q{}
450          )
451          . qq~(document.creator.birth_year.value < ($year - 120) || document.creator.birth_year.value > $year)) {
452            alert("$register_txt{'error_birth_year_real'}");
453            document.creator.birth_year.focus();
454            return false;
455        }~
456        : q{}
457      )
458
459      . qq~
460        var emailpassword = $emailpassword;
461        if (emailpassword === 0) {
462            if (document.creator.passwrd1.value === '' || document.creator.passwrd2.value === '') {
463                alert("$register_txt{'error_pass1'}");
464                document.creator.passwrd1.focus();
465                return false;
466            }
467            if (document.creator.passwrd1.value != document.creator.passwrd2.value) {
468                alert("$register_txt{'error_pass2'}");
469                document.creator.passwrd1.focus();
470                return false;
471            }
472        }
473		var regcheck = $regcheck;
474        if (regcheck > 0 && document.creator.verification.value === '') {
475            alert("$register_txt{'error_verification'}");
476            document.creator.verification.focus();
477            return false;
478        }~ .
479
480      (
481        $en_spam_questions && -e "$langdir/$language/spam.questions"
482        ? qq~
483        if (document.creator.verification_question.value === '') {
484            alert("$register_txt{'error_verification_question'}");
485            document.creator.verification_question.focus();
486            return false;
487        }~
488        : q{}
489      )
490
491      . qq~
492        var regtype = $regtype;
493        var RegAgree = $RegAgree;
494        var gender_on_reg = $gender_on_reg;
495        if (regtype == 1 && document.creator.reason.value === '') {
496            alert("$register_txt{'error_reason'}");
497            document.creator.reason.focus();
498            return false;
499        }
500        if (RegAgree == 2 && document.creator.regagree[0].checked !== true) {
501            alert("$register_txt{'error_agree'}");
502            return false;
503        }
504
505        if (gender_on_reg > 1 && !document.creator.gender.value) {
506            alert("$register_txt{'error_gender'}");
507            document.creator.gender.focus();
508            return false;
509        }
510        return true;
511    }
512
513    function jumpatnext(from,to,length) {
514        window.setTimeout('if (' + from + '.value.length == ' + length + ') ' + to + '.focus();', 1);
515    }
516</script>
517    ~;
518    template();
519    return;
520}
521
522sub Register2 {
523    if ( !$regtype ) { fatal_error('registration_disabled'); }
524    if ( $RegAgree > 0 && $FORM{'regagree'} ne 'yes' ) {
525        fatal_error('no_regagree');
526    }
527    my %member;
528    while ( ( $key, $value ) = each %FORM ) {
529        $value =~ s/\A\s+//xsm;
530        $value =~ s/\s+\Z//xsm;
531        if ( $key ne 'reason' ) { $value =~ s/[\n\r]//gxsm; }
532        $member{$key} = $value;
533    }
534    if ( $member{'domain'} ) { $member{'email'} .= $member{'domain'}; }
535#    $member{'regusername'} =~ s/\s/_/gxsm;
536    $member{'regrealname'} =~ s/\t+/\ /gsm;
537
538    # If enabled check if user has a valid e-mail address (needs Net::DNS to be installed)
539    if ( $imp_email_check == 1 ) {
540        eval {
541            require Net::DNS;
542        };
543        if ( !$EVAL_ERROR ) {
544            my $helo;
545            require Mail::CheckUser;
546            Mail::CheckUser->import(qw(check_email last_check));
547            $Mail::CheckUser::Sender_Addr = $webmaster_email;
548            if ($boardurl =~ /http\:\/\/(.*?)\//){ $Mail::CheckUser::Helo_Domain = $1; }
549            if (check_email($member{'email'})) {
550                my $email_ok = 1;
551            }
552            else {
553                my $failure = last_check()->{code};
554                fatal_error(q{}, "$mail_check{'address'} $member{'email'} $mail_check{'invalid'} $mail_check{'reason'} $mail_check{$failure}");
555            }
556        }
557    }
558
559    # Make sure users can't register with banned details
560    email_domain_check( $member{'email'} );
561    banning( $member{'regusername'}, $member{'email'} );
562
563# check if there is a system hash named like this by checking existence through size
564    if ( keys( %{ $member{'regusername'} } ) > 0 ) {
565        fatal_error( 'system_prohibited_id', "($member{'regusername'})" );
566    }
567    if ( length( $member{'regusername'} ) > 25 ) {
568        fatal_error( 'id_to_long', "($member{'regusername'})" );
569    }
570    if ( $member{'email'} ne $member{'email2'} && $imp_email_check ) {
571        fatal_error( 'email_mismatch' );
572    }
573    if ( length( $member{'email'} ) > 100 ) {
574        fatal_error( 'email_to_long', "($member{'email'})" );
575    }
576    if ( $member{'regusername'} eq q{} ) {
577        fatal_error( 'no_username', "($member{'regusername'})" );
578    }
579    if ( $member{'regusername'} eq q{_} ) {
580        fatal_error( 'id_alfa_only', "($member{'regusername'})" );
581    }
582    if ( $member{'regusername'} =~ /guest/ixsm ) {
583        fatal_error( 'id_reserved', "$member{'regusername'}" );
584    }
585    if ( $member{'regusername'} =~ /[^\w\+\-\_\@\.]/sm ) {
586        fatal_error( 'invalid_character',
587            "$register_txt{'35'} $register_txt{'241e'}" );
588    }
589    if ( $member{'regusername'} =~ /^[0-9]+$/sm ) {
590        fatal_error( 'all_numbers',
591            "$register_txt{'35'} $register_txt{'241n'}" );
592    }
593    if ( $member{'email'} eq q{} ) {
594        fatal_error( 'no_email', "($member{'regusername'})" );
595    }
596    if ( -e ("$memberdir/$member{'regusername'}.vars") ) {
597        fatal_error( 'id_taken', "($member{'regusername'})" );
598    }
599    if ( $member{'regusername'} eq $member{'passwrd1'} ) {
600        fatal_error('password_is_userid');
601    }
602    if ( $member{'reason'} eq q{} && $regtype == 1 ) {
603        fatal_error('no_reg_reason');
604    }
605
606    if ( $spamfruits == 1 ) {
607        if ( $member{'ycord'} < 5 || $member{'ycord'} > 70 ) {
608            fatal_error( q{}, "$fruittxt{'6'}" );
609        }
610        if ( $member{'thefruit'} eq $fruittxt{'2'}
611            && ( $member{'xcord'} < 5 || $member{'xcord'} > 75 ) )
612        {
613            fatal_error( q{}, "$fruittxt{'6'}" );
614        }
615        if ( $member{'thefruit'} eq $fruittxt{'3'}
616            && ( $member{'xcord'} < 75 || $member{'xcord'} > 145 ) )
617        {
618            fatal_error( q{}, "$fruittxt{'6'}" );
619        }
620        if ( $member{'thefruit'} eq $fruittxt{'4'}
621            && ( $member{'xcord'} < 145 || $member{'xcord'} > 215 ) )
622        {
623            fatal_error( q{}, "$fruittxt{'6'}" );
624        }
625        if ( $member{'thefruit'} eq $fruittxt{'5'}
626            && ( $member{'xcord'} < 215 || $member{'xcord'} > 285 ) )
627        {
628            fatal_error( q{}, "$fruittxt{'6'}" );
629        }
630    }
631
632    FromChars( $member{'regrealname'} );
633    $convertstr = $member{'regrealname'};
634    $convertcut = 30;
635    CountChars();
636    $member{'regrealname'} = $convertstr;
637    if ($cliped) {
638        fatal_error( 'realname_to_long',
639            "($member{'regrealname'} => $convertstr)" );
640    }
641    if ( $member{'regrealname'} =~
642        /[^ \w\x80-\xFF\[\]\(\)#\%\+,\-\|\.:=\?\@\^]/sm )
643    {
644        fatal_error( 'invalid_character',
645            "$register_txt{'38'} $register_txt{'241re'}" );
646    }
647
648    if ( $name_cannot_be_userid
649        && lc $member{'regusername'} eq lc $member{'regrealname'} )
650    {
651        fatal_error('name_is_userid');
652    }
653
654    if (
655        lc $member{'regusername'} eq
656        lc MemberIndex( 'check_exist', $member{'regusername'}, 0 ) )
657    {
658        fatal_error( 'id_taken', "($member{'regusername'})" );
659    }
660    if (
661        lc $member{'email'} eq lc MemberIndex( 'check_exist', $member{'email'}, 2 )
662      )
663    {
664        fatal_error( 'email_taken', "($member{'email'})" );
665    }
666    if (
667        lc $member{'regrealname'} eq
668        lc MemberIndex( 'check_exist', $member{'regrealname'}, 1 ) )
669    {
670        fatal_error('name_taken');
671    }
672    if ( Censor( $member{'regusername'} ) ne $member{'regusername'} ) {
673        fatal_error( 'censor1', CheckCensor( $member{'regusername'} ) );
674    }
675    if ( Censor( $member{'email'} ) ne $member{'email'} ) {
676        fatal_error( 'censor2', CheckCensor( $member{'email'} ) );
677    }
678    if ( Censor( $member{'regrealname'} ) ne $member{'regrealname'} ) {
679        fatal_error( 'censor3', CheckCensor( $member{'regrealname'} ) );
680    }
681    if ( $honeypot == 1 && $member{'add_field0'} ne q{} ) {
682        fatal_error('bad_bot');
683    }
684
685    if ( $regtype == 1 ) {
686        $convertstr = $member{'reason'};
687        $convertcut = $RegReasonSymbols;
688        CountChars();
689        $member{'reason'} = $convertstr;
690
691        FromChars( $member{'reason'} );
692        ToHTML( $member{'reason'} );
693        ToChars( $member{'reason'} );
694        $member{'reason'} =~ s/[\n\r]{1,2}/<br \/>/igsm;
695    }
696
697    if ($regcheck) {
698        require Sources::Decoder;
699        validation_check( $member{'verification'} );
700    }
701    $min_reg_time ||= 0;
702    if ( $min_reg_time > 0 ) {
703        $reg_finish_time = $date - $member{'reg_start_time'};
704        if ( $reg_finish_time < $min_reg_time || !$member{'reg_start_time'} ) {
705            fatal_error( q{}, "$register_txt{'error_min_reg_time'}" );
706        }
707    }
708
709    if ( $en_spam_questions && -e "$langdir/$language/spam.questions" ) {
710        SpamQuestionCheck(
711            $member{'verification_question'},
712            $member{'verification_question_id'}
713        );
714    }
715
716    if ($emailpassword) {
717        srand;
718        $member{'passwrd1'} = int rand 100;
719        $member{'passwrd1'} =~ tr/0123456789/ymifxupbck/;
720        $_ = int rand 77;
721        $_ =~ tr/0123456789/q8dv7w4jm3/;
722        $member{'passwrd1'} .= $_;
723        $_ = int rand 89;
724        $_ =~ tr/0123456789/y6uivpkcxw/;
725        $member{'passwrd1'} .= $_;
726        $_ = int rand 188;
727        $_ =~ tr/0123456789/poiuytrewq/;
728        $member{'passwrd1'} .= $_;
729        $_ = int rand 65;
730        $_ =~ tr/0123456789/lkjhgfdaut/;
731        $member{'passwrd1'} .= $_;
732    }
733    else {
734        if ( $member{'passwrd1'} ne $member{'passwrd2'} ) {
735            fatal_error( 'password_mismatch', "($member{'regusername'})" );
736        }
737        if ( $member{'passwrd1'} eq q{} ) {
738            fatal_error( 'no_password', "($member{'regusername'})" );
739        }
740        if ( $member{'passwrd1'} =~
741            /[^\s\w!\@#\$\%\^&\*\(\)\+\|`~\-=\\:;'",\.\/\?\[\]\{\}]/xsm )
742        {
743            fatal_error( 'invalid_character',
744                "$register_txt{'36'} $register_txt{'241'}" );
745        }
746    }
747    if ( $member{'email'} !~ /^[\w\-\.\+]+\@[\w\-\.\+]+\.\w{2,4}$/xsm ) {
748        fatal_error( 'invalid_character',
749            "$register_txt{'69'} $register_txt{'241e'}" );
750    }
751    if (   $member{'email'} =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\.$)/xsm
752        || $member{'email'} !~
753        /\A.+@\[?(\w|[-.])+\.[a-zA-Z]{2,4}|[0-9]{1,4}\]?\Z/xsm )
754    {
755        fatal_error('invalid_email');
756    }
757
758    fopen( RESERVE, "$vardir/reserve.txt" )
759      or fatal_error( 'cannot_open', "$vardir/reserve.txt", 1 );
760    @reserve = <RESERVE>;
761    fclose(RESERVE);
762    fopen( RESERVECFG, "$vardir/reservecfg.txt" )
763      or fatal_error( 'cannot_open', "$vardir/reservecfg.txt", 1 );
764    @reservecfg = <RESERVECFG>;
765    fclose(RESERVECFG);
766
767    for my $aa ( 0 .. ( @reservecfg - 1 ) ) {
768        chomp $reservecfg[$aa];
769    }
770    $matchword = $reservecfg[0] eq 'checked';
771    $matchcase = $reservecfg[1] eq 'checked';
772    $matchuser = $reservecfg[2] eq 'checked';
773    $matchname = $reservecfg[3] eq 'checked';
774    $namecheck =
775        $matchcase eq 'checked'
776      ? $member{'regusername'}
777      : lc $member{'regusername'};
778    $realnamecheck =
779        $matchcase eq 'checked'
780      ? $member{'regrealname'}
781      : lc $member{'regrealname'};
782
783    foreach my $reserved (@reserve) {
784        chomp $reserved;
785        $reservecheck = $matchcase ? $reserved : lc $reserved;
786        if ($matchuser) {
787            if ($matchword) {
788                if ( $namecheck eq $reservecheck ) {
789                    fatal_error( 'id_reserved', "$reserved" );
790                }
791            }
792            else {
793                if ( $namecheck =~ $reservecheck ) {
794                    fatal_error( 'id_reserved', "$reserved" );
795                }
796            }
797        }
798        if ($matchname) {
799            if ($matchword) {
800                if ( $realnamecheck eq $reservecheck ) {
801                    fatal_error( 'name_reserved', "$reserved" );
802                }
803            }
804            else {
805                if ( $realnamecheck =~ $reservecheck ) {
806                    fatal_error( 'name_reserved', "$reserved" );
807                }
808            }
809        }
810    }
811
812    if   ($default_template) { $new_template = $default_template; }
813    else                     { $new_template = q~Forum default~; }
814
815    # check if user isn't already registered
816    if ( -e ("$memberdir/$member{'regusername'}.vars") ) {
817        fatal_error('id_taken');
818    }
819
820    # check if user isn't already in pre-registration
821    if ( -e ("$memberdir/$member{'regusername'}.pre") ) {
822        fatal_error('already_preregged');
823    }
824    if ( -e ("$memberdir/$member{'regusername'}.wait") ) {
825        fatal_error('already_preregged');
826    }
827
828    if ( $new_template !~ m{\A[0-9a-zA-Z\_\(\)\ \#\%\-\:\+\?\$\&\~\.\,\@]+\Z}xsm
829        && $new_template ne q{} )
830    {
831        fatal_error('invalid_template');
832    }
833    if ( $member{'language'} !~
834        m{\A[0-9a-zA-Z\_\(\)\ \#\%\-\:\+\?\$\&\~\.\,\@]+\Z}xsm
835        && $member{'language'} ne q{} )
836    {
837        fatal_error('invalid_language');
838    }
839
840    ToHTML( $member{'language'} );
841
842    $reguser      = $member{'regusername'};
843    $registerdate = timetostring($date);
844    $language     = $member{'language'};
845
846    ToHTML( $member{'regrealname'} );
847
848    if ($birthday_on_reg) {
849        $member{'birth_month'} =~ s/\D//gxsm;
850        $member{'birth_day'}   =~ s/\D//gxsm;
851        $member{'birth_year'}  =~ s/\D//gxsm;
852        if ( $birthday_on_reg == 1 ) {
853            if (   length( $member{'birth_month'} ) < 2
854                || $member{'birth_month'} < 1
855                || $member{'birth_month'} > 12 )
856            {
857                $member{'birth_month'} = q{};
858            }
859            if (   length( $member{'birth_day'} ) < 2
860                || $member{'birth_day'} < 1
861                || $member{'birth_day'} > 31 )
862            {
863                $member{'birth_day'} = q{};
864            }
865            if (   length( $member{'birth_year'} ) < 4
866                || $member{'birth_year'} < ( $year - 120 )
867                || $member{'birth_year'} > $year )
868            {
869                $member{'birth_year'} = q{};
870            }
871            if (   $member{'birth_day'}
872                && $member{'birth_month'}
873                && $member{'birth_year'} )
874            {
875                ${ $uid . $reguser }{'bday'} =
876"$member{'birth_month'}/$member{'birth_day'}/$member{'birth_year'}";
877            }
878        }
879        elsif ( $birthday_on_reg == 2 ) {
880            if (   length( $member{'birth_month'} ) < 2
881                || $member{'birth_month'} < 1
882                || $member{'birth_month'} > 12 )
883            {
884                fatal_error( q{}, $register_txt{'error_birth_month'} );
885            }
886            if (   length( $member{'birth_day'} ) < 2
887                || $member{'birth_day'} < 1
888                || $member{'birth_day'} > 31 )
889            {
890                fatal_error( q{}, $register_txt{'error_birth_day'} );
891            }
892            if ( length( $member{'birth_year'} ) < 4 ) {
893                fatal_error( q{}, $register_txt{'error_birth_year'} );
894            }
895            if (   $member{'birth_year'} < ( $year - 120 )
896                || $member{'birth_year'} > $year )
897            {
898                fatal_error( q{}, $register_txt{'error_birth_year_real'} );
899            }
900            ${ $uid . $reguser }{'bday'} =
901"$member{'birth_month'}/$member{'birth_day'}/$member{'birth_year'}";
902        }
903    }
904    if ($gender_on_reg) {
905        ${ $uid . $reguser }{'gender'} = $member{'gender'};
906        if ( $editGenderLimit && ${ $uid . $reguser }{'gender'} ne q{} ) {
907            ${ $uid . $reguser }{'disablegender'} = 1;
908        }
909    }
910    if (   $birthday_on_reg
911        && $editAgeLimit
912        && ${ $uid . $reguser }{'bday'} ne q{} )
913    {
914        ${ $uid . $reguser }{'disableage'} = 1;
915    }
916
917    ${ $uid . $reguser }{'password'}   = encode_password( $member{'passwrd1'} );
918    ${ $uid . $reguser }{'realname'}   = $member{'regrealname'};
919    ${ $uid . $reguser }{'email'}      = lc $member{'email'};
920    ${ $uid . $reguser }{'postcount'}  = 0;
921    ${ $uid . $reguser }{'regreason'}  = $member{'reason'};
922    ${ $uid . $reguser }{'usertext'}   = $defaultusertxt;
923    ${ $uid . $reguser }{'userpic'}    = $my_blank_avatar;
924    ${ $uid . $reguser }{'regdate'}    = $registerdate;
925    ${ $uid . $reguser }{'regtime'}    = $date;
926    ${ $uid . $reguser }{'timeselect'} = $timeselected;
927    ${ $uid . $reguser }{'lastips'}    = $user_ip;
928    ${ $uid . $reguser }{'hidemail'}   = $member{'hideemail'} ? 1 : 0;
929    ${ $uid . $reguser }{'timeformat'} = q~MM D+ YYYY @ HH:mm:ss*~;
930    ${ $uid . $reguser }{'template'}   = $new_template;
931    ${ $uid . $reguser }{'language'}   = $language;
932    ${ $uid . $reguser }{'pageindex'}  = q~1|1|1|1~;
933
934    if ( ( $addmemgroup_enabled == 1 || $addmemgroup_enabled == 3 )
935        && $member{'joinmemgroup'} ne q{} )
936    {
937        my @newmemgr;
938        foreach ( split /, /sm, $member{'joinmemgroup'} ) {
939            if ( $NoPost{$_} && ( split /\|/xsm, $NoPost{$_} )[10] == 1 ) {
940                push @newmemgr, $_;
941            }
942        }
943        ${ $uid . $reguser }{'addgroups'} = join q{,}, @newmemgr;
944    }
945
946    if ( $regtype == 1 || $regtype == 2 ) {
947        my ( @reglist, @x );
948
949        # If a pre-registration list exists load it
950        if ( -e "$memberdir/memberlist.inactive" ) {
951            fopen( INACT, "$memberdir/memberlist.inactive" );
952            @reglist = <INACT>;
953            fclose(INACT);
954        }
955
956        # If a approve-registration list exists load it too
957        if ( -e "$memberdir/memberlist.approve" ) {
958            fopen( APPROVE, "$memberdir/memberlist.approve" );
959            push @reglist, <APPROVE>;
960            fclose(APPROVE);
961        }
962        foreach (@reglist) {
963            @x = split /\|/xsm, $_;
964            if ( $reguser eq $x[2] ) { fatal_error('already_preregged'); }
965            if ( lc $member{'email'} eq lc $x[4] ) {
966                fatal_error('email_already_preregged');
967            }
968        }
969
970        # create pre-registration .pre file and write log and inactive list
971        require Sources::Decoder;
972        validation_code();
973        $activationcode = substr $sessionid, 0, 20;
974
975        if ($extendedprofiles) {
976            require Sources::ExtendedProfiles;
977            my $error = ext_validate_submition( $reguser, $reguser );
978            if ( $error ne q{} ) {
979                fatal_error( 'extended_profiles_validation', $error );
980            }
981            ext_saveprofile($reguser);
982        }
983
984        UserAccount( $reguser, 'preregister' );
985        if   ($do_scramble_id) { $cryptuser = cloak($reguser); }
986        else                   { $cryptuser = $reguser; }
987
988        if ($emailpassword) { $regpass = $member{'passwrd1'}; }
989        else { $regpass = encode_password( $member{'passwrd1'} ); }
990        fopen( INACT, ">>$memberdir/memberlist.inactive", 1 );
991        print {INACT}
992          "$date|$activationcode|$reguser|$regpass|$member{'email'}|$user_ip\n"
993          or croak "$croak{'print'} INACT";
994        fclose(INACT);
995        fopen( REGLOG, ">>$vardir/registration.log", 1 );
996        print {REGLOG} "$date|N|$member{'regusername'}||$user_ip\n"
997          or croak "$croak{'print'} REGLOG";
998        fclose(REGLOG);
999
1000        ## send an e-mail to the user that registration is pending e-mail validation within the given timespan. ##
1001        my $templanguage = $language;
1002        $language = $member{'language'};
1003        LoadLanguage('Email');
1004        sendmail(
1005            ${ $uid . $reguser }{'email'},
1006            "$mailreg_txt{'apr_result_activate'} $mbname",
1007            template_email(
1008                $preregemail,
1009                {
1010                    'displayname'    => $member{'regrealname'},
1011                    'username'       => $reguser,
1012                    'cryptusername'  => $cryptuser,
1013                    'password'       => $member{'passwrd1'},
1014                    'activationcode' => $activationcode,
1015                    'preregspan'     => $preregspan
1016                }
1017            ),
1018            q{},
1019            $emailcharset
1020        );
1021        $language = $templanguage;
1022        $yymain .= $myregister_pending;
1023        $yytitle = "$prereg_txt{'1a'}";
1024
1025    }
1026    else {
1027        if ($extendedprofiles) {
1028            require Sources::ExtendedProfiles;
1029            my $error = ext_validate_submition( $reguser, $reguser );
1030            if ( $error ne q{} ) {
1031                fatal_error( 'extended_profiles_validation', $error );
1032            }
1033            ext_saveprofile($reguser);
1034        }
1035        UserAccount( $reguser, 'register' );
1036        MemberIndex( 'add', $reguser );
1037        FormatUserName($reguser);
1038
1039        if ( $send_welcomeim == 1 ) {
1040
1041# new format msg file:
1042# messageid|(from)user|(touser(s))|(ccuser(s))|(bccuser(s))|subject|date|message|(parentmid)|reply#|ip|messagestatus|flags|storefolder|attachment
1043            $messageid = $BASETIME . $PROCESS_ID;
1044            fopen( IM, ">$memberdir/$member{'regusername'}.msg", 1 );
1045            print {IM}
1046"$messageid|$sendname|$member{'regusername'}|||$imsubject|$date|$imtext|$messageid|0|$ENV{'REMOTE_ADDR'}|s|u||\n"
1047              or croak "$croak{'print'} IM";
1048            fclose(IM);
1049        }
1050        if ($new_member_notification) {
1051            my $templanguage = $language;
1052            $language = $lang;
1053            LoadLanguage('Email');
1054            sendmail(
1055                $new_member_notification_mail,
1056                $mailreg_txt{'new_member_info'},
1057                template_email(
1058                    $newmemberemail,
1059                    {
1060                        'displayname' => $member{'regrealname'},
1061                        'username'    => $reguser,
1062                        'userip'      => $user_ip,
1063                        'useremail'   => ${ $uid . $reguser }{'email'}
1064                    }
1065                ),
1066                q{},
1067                $emailcharset
1068            );
1069            $language = $templanguage;
1070        }
1071
1072        if ($emailpassword) {
1073            my $templanguage = $language;
1074            $language = $member{'language'};
1075            LoadLanguage('Email');
1076            sendmail(
1077                ${ $uid . $reguser }{'email'},
1078                "$mailreg_txt{'apr_result_info'} $mbname",
1079                template_email(
1080                    $passwordregemail,
1081                    {
1082                        'displayname' => $member{'regrealname'},
1083                        'username'    => $reguser,
1084                        'password'    => $member{'passwrd1'}
1085                    }
1086                ),
1087                q{},
1088                $emailcharset
1089            );
1090            $language = $templanguage;
1091            $yymain .= $myregister_password;
1092        }
1093        else {
1094            if ($emailwelcome) {
1095                my $templanguage = $language;
1096                $language = $member{'language'};
1097                LoadLanguage('Email');
1098                sendmail(
1099                    ${ $uid . $reguser }{'email'},
1100                    "$mailreg_txt{'apr_result_info'} $mbname",
1101                    template_email(
1102                        $welcomeregemail,
1103                        {
1104                            'displayname' => $member{'regrealname'},
1105                            'username'    => $reguser,
1106                            'password'    => $member{'passwrd1'}
1107                        }
1108                    ),
1109                    q{},
1110                    $emailcharset
1111                );
1112                $language = $templanguage;
1113            }
1114            $yymain .= $myregister_welcome;
1115            $yymain =~ s/{yabb regusername}/$member{'regusername'}/sm;
1116            $yymain =~ s/{yabb passwrd1}/$member{'passwrd1'}/sm;
1117            $yymain =~ s/{yabb Cookie_Length}/$Cookie_Length/sm;
1118        }
1119        $yytitle = "$register_txt{'245'}";
1120    }
1121    template();
1122    return;
1123}
1124
1125sub user_activation {
1126    my ( $reguse, $active ) = @_;
1127    $changed       = 0;
1128    $reguser       = $reguse || $INFO{'username'};
1129    $activationkey = $active || $INFO{'activationkey'};
1130    if ( !$reguser ) { fatal_error('wrong_id'); }
1131    if ($do_scramble_id) { $reguser = decloak($reguser); }
1132    if ( !-e "$memberdir/$reguser.pre" && -e "$memberdir/$reguser.vars" ) {
1133        fatal_error('already_activated');
1134    }
1135    if ( ( $regtype != 1 && !-e "$memberdir/$reguser.pre" ) || ( $regtype == 1 && !-e "$memberdir/$reguser.pre" && !-e "$memberdir/$reguser.wait" ) ) { fatal_error('prereg_expired'); }
1136    elsif ( $regtype == 1 && -e "$memberdir/$reguser.wait" ) { fatal_error('prereg_wait'); }
1137    # If a pre-registration list exists load it
1138    if ( -e "$memberdir/memberlist.inactive" ) {
1139        fopen( INACT, "$memberdir/memberlist.inactive" );
1140        @reglist = <INACT>;
1141        fclose(INACT);
1142    }
1143    else {
1144
1145        # add entry to registration log
1146        fopen( REGLOG, ">>$vardir/registration.log", 1 );
1147        print {REGLOG} "$date|E|$reguser||$user_ip\n"
1148          or croak "$croak{'print'} REGLOG";
1149        fclose(REGLOG);
1150        fatal_error('prereg_expired');
1151    }
1152    if ( $regtype == 1 && -e "$memberdir/memberlist.approve" ) {
1153        fopen( APR, "$memberdir/memberlist.approve" );
1154        @aprlist = <APR>;
1155        fclose(APR);
1156    }
1157
1158    # check if user is in pre-registration and check activation key
1159    foreach (@reglist) {
1160        ( $regtime, $testkey, $regmember, $regpassword, undef ) =
1161          split /\|/xsm, $_, 5;
1162
1163        if ( $regmember ne $reguser ) {
1164            push @chnglist, $_;    # update non activate user list
1165        }
1166        else {
1167            my $templanguage = $language;
1168            if ( $activationkey ne $testkey ) {
1169                fopen( REGLOG, ">>$vardir/registration.log", 1 );
1170                print {REGLOG} "$date|E|$reguser||$user_ip\n"
1171                  or croak "$croak{'print'} REGLOG";
1172
1173                # add entry to registration log
1174                fclose(REGLOG);
1175                fatal_error('wrong_code');
1176
1177            }
1178            elsif ( $regtype == 1 ) {
1179
1180        # user is in list and the keys match, so move him/her for admin approval
1181                unshift @aprlist, $_;
1182
1183                rename "$memberdir/$reguser.pre", "$memberdir/$reguser.wait";
1184
1185                # add entry to registration log
1186                if   ( $iamadmin || $iamgmod ) { $actuser = $username; }
1187                else                           { $actuser = $reguser; }
1188                fopen( REGLOG, ">>$vardir/registration.log", 1 );
1189                print {REGLOG} "$date|W|$reguser|$actuser|$user_ip\n"
1190                  or croak "$croak{'print'} REGLOG";
1191                fclose(REGLOG);
1192
1193                LoadUser($reguser);
1194                $language = ${ $uid . $reguser }{'language'};
1195                LoadLanguage('Email');
1196                sendmail(
1197                    ${ $uid . $reguser }{'email'},
1198                    "$mailreg_txt{'apr_result_wait'} $mbname",
1199                    template_email(
1200                        $approveregemail,
1201                        {
1202                            'username'    => $reguser,
1203                            'displayname' => ${ $uid . $reguser }{'realname'}
1204                        }
1205                    ),
1206                    q{},
1207                    $emailcharset
1208                );
1209
1210            }
1211            elsif ( $regtype == 2 ) {
1212                LoadUser($reguser);
1213
1214                # check if email is already in active use
1215                if (
1216                    lc ${ $uid . $reguser }{'email'} eq
1217                    lc MemberIndex( 'check_exist',
1218                        ${ $uid . $reguser }{'email'}, 2 ) )
1219                {
1220                    fatal_error( 'email_taken', "(${$uid.$reguser}{'email'})" );
1221                }
1222
1223                # user is in list and the keys match, so let him/her in
1224                rename "$memberdir/$reguser.pre", "$memberdir/$reguser.vars";
1225                MemberIndex( 'add', $reguser );
1226
1227                if   ( $iamadmin || $iamgmod ) { $actuser = $username; }
1228                else                           { $actuser = $reguser; }
1229
1230                # add entry to registration log
1231                fopen( REGLOG, ">>$vardir/registration.log", 1 );
1232                print {REGLOG} "$date|A|$reguser|$actuser|$user_ip\n"
1233                  or croak "$croak{'print'} REGLOG";
1234                fclose(REGLOG);
1235
1236                if ($emailpassword) {
1237                    chomp $regpassword;
1238                    $language = ${ $uid . $reguser }{'language'};
1239                    LoadLanguage('Email');
1240                    sendmail(
1241                        ${ $uid . $reguser }{'email'},
1242                        "$mailreg_txt{'apr_result_validate'} $mbname",
1243                        template_email(
1244                            $activatedpassregemail,
1245                            {
1246                                'displayname' =>
1247                                  ${ $uid . $reguser }{'realname'},
1248                                'username' => $reguser,
1249                                'password' => $regpassword
1250                            }
1251                        ),
1252                        q{},
1253                        $emailcharset
1254                    );
1255                    $yymain .= $myregister_table_a;
1256                    $sharedLogin_title = $register_txt{'97'};
1257                    $sharedLogin_text  = $register_txt{'703'};
1258                    $yymain .= $myregister_table_b;
1259
1260                }
1261                elsif ($emailwelcome) {
1262                    chomp $regpassword;
1263                    $language = ${ $uid . $reguser }{'language'};
1264                    LoadLanguage('Email');
1265                    sendmail(
1266                        ${ $uid . $reguser }{'email'},
1267                        "$mailreg_txt{'apr_result_validate'} $mbname",
1268                        template_email(
1269                            $activatedwelcomeregemail,
1270                            {
1271                                'displayname' =>
1272                                  ${ $uid . $reguser }{'realname'},
1273                                'username' => $reguser,
1274                                'password' => $regpassword
1275                            }
1276                        ),
1277                        q{},
1278                        $emailcharset
1279                    );
1280                }
1281            }
1282
1283            if ( $send_welcomeim == 1 ) {
1284
1285# new format msg file:
1286# messageid|(from)user|(touser(s))|(ccuser(s))|(bccuser(s))|subject|date|message|(parentmid)|reply#|ip|messagestatus|flags|storefolder|attachment
1287                $messageid = $BASETIME . $PROCESS_ID;
1288                fopen( INBOX, ">$memberdir/$reguser.msg" );
1289                print {INBOX}
1290"$messageid|$sendname|$reguser|||$imsubject|$date|$imtext|$messageid|0|$ENV{'REMOTE_ADDR'}|s|u||\n"
1291                  or croak "$croak{'print'} INBOX";
1292                fclose(INBOX);
1293            }
1294            if ($new_member_notification) {
1295                $language = $lang;
1296                LoadLanguage('Email');
1297                sendmail(
1298                    $new_member_notification_mail,
1299                    $mailreg_txt{'new_member_info'},
1300                    template_email(
1301                        $newmemberemail,
1302                        {
1303                            'displayname' => ${ $uid . $reguser }{'realname'},
1304                            'username'    => $reguser,
1305                            'userip'      => $user_ip,
1306                            'useremail'   => ${ $uid . $reguser }{'email'}
1307                        }
1308                    ),
1309                    q{},
1310                    $emailcharset
1311                );
1312            }
1313            $language = $templanguage;
1314            $changed  = 1;
1315        }
1316    }
1317
1318    if ($changed) {
1319
1320        # if changed write new inactive list
1321        fopen( INACT, ">$memberdir/memberlist.inactive" );
1322        print {INACT} @chnglist or croak "$croak{'print'} INACT";
1323        fclose(INACT);
1324
1325        # update approval user list
1326        if ( $regtype == 1 ) {
1327            fopen( APR, ">$memberdir/memberlist.approve" );
1328            print {APR} @aprlist or croak "$croak{'print'} APR";
1329            fclose(APR);
1330        }
1331    }
1332    else {
1333
1334        # add entry to registration log
1335        fopen( REGLOG, ">>$vardir/registration.log", 1 );
1336        print {REGLOG} "$date|E|$reguser|$user_ip\n"
1337          or croak "$croak{'print'} REGLOG";
1338        fclose(REGLOG);
1339        fatal_error('wrong_id');
1340    }
1341
1342    if ( $regtype == 1 ) {
1343        $yymain .= $myregister_prereg1;
1344        $yytitle = "$prereg_txt{'1b'}";
1345
1346    }
1347    elsif ( $regtype == 2 ) {
1348        $yymain .= $myregister_prereg2;
1349        if ( !$emailpassword ) { $yymain .= $prereg_txt{'5a'}; }
1350        $yymain .= qq~$prereg_txt{'5b'}<br /><br />~;
1351        if ($emailpassword) {
1352            $yymain .= qq~$register_txt{'703'}<br /> <br />~;
1353        }
1354        $yymain .= $myregister_enddiv;
1355
1356        if ( !$iamadmin && !$iamgmod ) {
1357            if ( !$emailpassword ) {
1358                $yymain .= $myregister_div_a;
1359                require Sources::LogInOut;
1360                $yymain .= sharedLogin();
1361                $yymain .= $myregister_div_b;
1362            }
1363            else {
1364                $yymain .= q~<br /><br />~;
1365            }
1366        }
1367        $yytitle = "$prereg_txt{'5'}";
1368    }
1369
1370    if ( $iamadmin || $iamgmod ) {
1371        $yySetLocation = qq~$adminurl?action=view_reglog~;
1372        redirectexit();
1373    }
1374    else {
1375        template();
1376    }
1377    return;
1378}
1379
13801;
1381