1#!/usr/local/bin/perl --
2# $Id: YaBB 2x Conversion Utility $
3# $HeadURL: YaBB $
4# $Source: /Convert2x.pl $
5###############################################################################
6# Convert2x.pl                                                                #
7# $Date: 12.02.14 $                                                           #
8###############################################################################
9# YaBB: Yet another Bulletin Board                                            #
10# Open-Source Community Software for Webmasters                               #
11# Version:        YaBB 2.6.11                                                  #
12# Packaged:       December 2, 2014                                            #
13# Distributed by: http://www.yabbforum.com                                    #
14# =========================================================================== #
15# Copyright (c) 2000-2014 YaBB (www.yabbforum.com) - All Rights Reserved.     #
16# Software by:  The YaBB Development Team                                     #
17#               with assistance from the YaBB community.                      #
18###############################################################################
19# use strict;
20# use warnings;
21no warnings qw(uninitialized once redefine);
22use CGI::Carp qw(fatalsToBrowser);
23use English qw(-no_match_vars);
24
25our $VERSION = '2.6.11';
26
27$convert2xplver = 'YaBB 2.6.11 $Revision: 1617 $';
28
29if ( $ENV{'SERVER_SOFTWARE'} =~ /IIS/sm ) {
30    $yyIIS = 1;
31    if ( $PROGRAM_NAME =~ m{(.*)(\\|/)}xsm ) {
32        $yypath = $1;
33    }
34    $yypath =~ s/\\/\//gxsm;
35    chdir $yypath;
36    push @INC, $yypath;
37}
38
39$max_process_time = 20;
40$time_to_jump     = time() + $max_process_time;
41
42### Requirements and Errors ###
43$script_root = $ENV{'SCRIPT_FILENAME'};
44if ( !$script_root ) {
45    $script_root = $ENV{'PATH_TRANSLATED'};
46    $script_root =~ s/\\/\//gxsm;
47}
48$script_root =~ s/\/Convert2x\.(pl|cgi)//igxsm;
49
50if    ( -e './Paths.pm' )           { require Paths; }
51elsif ( -e './Variables/Paths.pm' ) { require './Variables/Paths.pm'; }
52
53$boardsdir = './Boards';
54$sourcedir = './Sources';
55$memberdir = './Members';
56$vardir    = './Variables';
57
58$thisscript = "$ENV{'SCRIPT_NAME'}";
59if   ( -e ('YaBB.cgi') ) { $yyext = 'cgi'; }
60else                     { $yyext = 'pl'; }
61if   ($boardurl) { $set_cgi = "$boardurl/Convert2x.$yyext"; }
62else             { $set_cgi = "Convert2x.$yyext"; }
63$scripturl = "$boardurl/YaBB.$yyext";
64
65# Make sure the module path is present
66push @INC, './Modules';
67
68require Sources::Subs;
69require Sources::System;
70require Sources::Load;
71require Sources::DateTime;
72
73$date = time();
74#############################################
75# Conversion starts here                    #
76#############################################
77$px = 'px';
78
79if ( -e "$vardir/Setup.lock" ) {
80    if ( -e "$vardir/Convert2x.lock" ) { FoundConvert2xLock(); }
81
82    tempstarter();
83    tabmenushow();
84
85    if ( !$action ) {
86        $yytabmenu = $NavLink1 . $NavLink2 . $NavLink3 . $NavLink5 . $NavLink6;
87
88        $yymain = qq~
89    <div class="bordercolor borderbox">
90    <form action="$set_cgi?action=prepare" method="post">
91        <table class="cs_thin pad_4px">
92            <col style="width:5%" />
93            <tr>
94                <td class="tabtitle" colspan="2">YaBB 2.6.11 Converter</td>
95            </tr><tr>
96                <td class="windowbg center">
97                    <img src="$imagesdir/thread.gif" alt="" />
98                </td>
99                <td class="windowbg2 fontbigger">
100                    Make sure your YaBB 2.6.1 installation is running and that it has all the correct folder paths and URLs.<br />
101                    Proceed through the following steps to convert your YaBB 2x forum to YaBB 2.6.11.<br /><br />
102                    <b>If</b> your YaBB 2x forum is located on the same server as your YaBB 2.6.11 installation:
103                    <ol>
104                        <li>Insert the path to your YaBB 2x forum in the input field below</li>
105                        <li>Click on the 'Continue' button</li>
106                    </ol>
107                    <b>Else</b> if your YaBB 2x forum is located on a different server than your YaBB 2.6.11 installation or if you do not know the path to your YaBB 2x forum:
108                    <ol>
109                        <li>Copy all files in the /Boards, /Members, /Messages, and /Variables folders from your YaBB 2x installation, to the corresponding Convert/Boards, Convert/Members, Convert/Messages, and Convert/Variables folders of your YaBB 2.6.1 installation, and chmod them 755.</li>
110                        <li>Click on the 'Continue' button</li>
111                    </ol>
112                    <div style="width: 100%; text-align: center;">
113                        <b>Path to your YaBB 2x files: </b> <input type="text" name="convertdir" value="$convertdir" size="50" />
114                    </div>
115                    <br />
116                </td>
117            </tr><tr>
118                <td class="catbg center" colspan="2">
119                    <input type="submit" value="Continue" />
120                </td>
121            </tr>
122        </table>
123    </form>
124    </div>
125            ~;
126    }
127
128    if ( $action eq 'prepare' ) {
129        UpdateCookie('delete');
130
131        $username = 'Guest';
132        $iamguest = '1';
133        $iamadmin = q{};
134        $iamgmod  = q{};
135        $password = q{};
136        $yyim     = q{};
137        local $ENV{'HTTP_COOKIE'} = q{};
138        $yyuname = q{};
139
140        $convertdir = $FORM{'convertdir'};
141
142        if ( !-d "$convertdir/Boards" ) {
143            setup_fatal_error( "Directory: $convertdir/Boards", 1 );
144        }
145        else { $convboardsdir = "$convertdir/Boards"; }
146
147        if ( !-e "$convertdir/Members/memberlist.txt" ) {
148            setup_fatal_error( "Directory: $convertdir/Members", 1 );
149        }
150        else { $convmemberdir = "$convertdir/Members"; }
151
152        if ( !-d "$convertdir/Messages" ) {
153            setup_fatal_error( "Directory: $convertdir/Messages", 1 );
154        }
155        else { $convdatadir = "$convertdir/Messages"; }
156
157        if ( !-d "$convertdir/Variables" ) {
158            setup_fatal_error( "Directory: $convertdir/Variables", 1 );
159        }
160        else { $convvardir = "$convertdir/Variables"; }
161
162        my $setfile = << "EOF";
163\$convertdir = qq~$convertdir~;
164\$convboardsdir = qq~$convertdir/Boards~;
165\$convmemberdir = qq~$convertdir/Members~;
166\$convdatadir = qq~$convertdir/Messages~;
167\$convvardir = qq~$convertdir/Variables~;
168
1691;
170EOF
171
172        fopen( SETTING, ">$vardir/ConvSettings.txt" )
173          or setup_fatal_error( "$maintext_23 $vardir/ConvSettings.txt: ", 1 );
174        print {SETTING} nicely_aligned_file($setfile)
175          or croak 'cannot print SETTING';
176        fclose(SETTING);
177
178        $yytabmenu = $NavLink1a . $NavLink2 . $NavLink3 . $NavLink5 . $NavLink6;
179
180        $yymain = qq~
181    <div class="bordercolor borderbox">
182        <table class="cs_thin pad_4px">
183            <col style="width:5%" />
184            <tr>
185                <td class="tabtitle" colspan="2">YaBB 2.6.11 Converter</td>
186            </tr><tr>
187                <td class="windowbg center">
188                    <img src="$imagesdir/thread.gif" alt="" />
189                </td>
190                <td class="windowbg2 fontbigger">
191                    <ul>
192                        <li>Members info found in: <b>$convmemberdir</b></li>
193                        <li>Board and Category info found in: <b>$convboardsdir</b></li>
194                        <li>Messages info found in: <b>$convdatadir</b></li>
195                    </ul>
196                </td>
197            </tr><tr>
198                <td class="windowbg center">
199                    <img src="$imagesdir/info.png" alt="" />
200                </td>
201                <td class="windowbg2 fontbigger">
202                  - Conversion can take a long time depending on the size of your forum (30 seconds to a couple hours).<br />
203                  - Your browser will be refreshed automatically every $max_process_time seconds and you will see the ongoing process in the status bar.<br />
204                  - Some internet connections refresh their IP-Address automatically every 24 hours.<br />
205                  &nbsp; Make sure that your IP-Address will not change during conversion, or you must restart the conversion. <br />
206                  - Your forum will be set to maintenance while converting.
207                  <p id="memcontinued">Click on 'Members' in the menu to start.<br />&nbsp;</p>
208                </td>
209            </tr>
210        </table>
211    </div>
212    <script type="text/javascript">
213            function PleaseWait() {
214                  document.getElementById("memcontinued").innerHTML = '<span style="color:#f33"><b>Converting - please wait!<br />If you want to stop \\'Members\\' conversion, click here on STOP before this red message appears again on next page.</b></span>';
215            }
216      </script>
217            ~;
218    }
219    elsif ( $action eq 'members' ) {
220        require qq~$vardir/ConvSettings.txt~;
221        if ( !exists $INFO{'mstart1'} ) { PrepareConv(); }
222        ConvertMembers();
223
224        $yytabmenu = $NavLink1 . $NavLink2a . $NavLink3 . $NavLink5 . $NavLink6;
225
226        $yymain = qq~
227    <div class="bordercolor borderbox">
228    <table class="cs_thin pad_4px">
229        <col style="width:5%" />
230        <tr>
231            <td class="tabtitle" colspan="2">YaBB 2.6.11 Converter</td>
232        </tr><tr>
233            <td class="windowbg center">
234                <img src="$imagesdir/thread.gif" alt="" />
235            </td>
236            <td class="windowbg2">
237                <div class="convdone">Member Conversion.</div>
238                $ConvDone
239                <div class="convnotdone">Board and Category Conversion.</div>
240                $ConvNotDone
241                <div class="convnotdone">Message Conversion.</div>
242                $ConvNotDone
243                <div class="convnotdone">Variables &amp; Clean Up</div>
244                $ConvNotDone
245            </td>
246        </tr><tr>
247            <td class="windowbg center">
248                <img src="$imagesdir/info.png" alt="" />
249            </td>
250            <td class="windowbg2 fontbigger">
251                    To prevent server time-out due to the amount of members to be converted, the conversion is split into more steps.<br />
252                <br />
253                    The time-step (\$max_process_time) is set to <i>$max_process_time seconds</i>.<br />
254                 Conversion took <i>~
255          . int( ( $INFO{'st'} + 60 ) / 60 ) . qq~ minutes</i>.
256                <br />
257                <br />
258                <p id="memcontinued">Click on 'Boards &amp; Categories' in the menu to continue.<br />
259                    If you do not do that the script will continue itself in 5 minutes.</p>
260            </td>
261        </tr>
262    </table>
263    </div>
264    <script type="text/javascript">
265            function PleaseWait() {
266                  document.getElementById("memcontinued").innerHTML = '<span style="color:#f33"><b>Converting - please wait!<br />If you want to stop \\'Boards & Categories\\' conversion, click here on STOP before this red message appears again on next page.</b></span>';
267            }
268
269            function membtick() {
270                   PleaseWait();
271                   location.href="$set_cgi?action=cats;st=$INFO{'st'}";
272            }
273
274            setTimeout("membtick()",300000);
275    </script>
276            ~;
277    }
278
279    elsif ( $action eq 'members2' ) {
280        if ( $INFO{'mstart1'} < 0 ) {
281            setup_fatal_error(
282"Member conversion (members2) 'mstart1' ($INFO{'mstart1'})) error!"
283            );
284        }
285        $yytabmenu = $NavLink1 . $NavLink2 . $NavLink3 . $NavLink5 . $NavLink6;
286
287        my $mwidth =
288          int( ( ( $INFO{'mstart1'} ) / 2 ) / $INFO{'mtotal'} * 100 );
289        $yymain = qq~
290    <div class="bordercolor borderbox">
291    <table class="cs_thin pad_4px">
292        <col style="width:5%" />
293        <tr>
294            <td class="tabtitle" colspan="2">YaBB 2.6.1 Converter</td>
295        </tr><tr>
296            <td class="windowbg center">
297                <img src="$imagesdir/thread.gif" alt="" />
298            </td>
299            <td class="windowbg2">
300                <div class="convdone">Member Conversion.</div>
301                <div class="divouter">
302                    <div class="divvary" style="width: $mwidth$px;">&nbsp;</div>
303                </div>
304                <div class="divvary2">$mwidth %</div>
305                <br />
306                <div class="convnotdone">Board and Category Conversion.</div>
307                $ConvNotDone
308                <div class="convnotdone">Message Conversion.</div>
309                $ConvNotDone
310                <div class="convnotdone">Final Cleanup.</div>
311                $ConvNotDone
312                </td>
313            </tr><tr>
314                <td class="windowbg center">
315                    <img src="$imagesdir/info.png" alt="" />
316                </td>
317                <td class="windowbg2 fontbigger">
318                    To prevent server time-out due to the amount of members to be converted, the conversion is split into more steps.<br />
319                    <br />
320                    The time-step (\$max_process_time) is set to <i>$max_process_time seconds</i>.<br />
321                    The last step took <i>~
322          . ( $time_to_jump - $INFO{'starttime'} ) . q~ seconds</i>.
323                    <br />
324                    Conversion has taken <i>~
325          . int( ( $INFO{'st'} + 60 ) / 60 ) . q~ minutes</i>.
326                  <br />
327                  <br />
328                  There are <b>~
329          . int( $INFO{'mtotal'} - ( $INFO{'mstart1'} / 2 ) )
330          . qq~/$INFO{'mtotal'}</b> Members left to be converted.
331                  <br />
332                  <p id="memcontinued">If nothing happens in 5 seconds <a href="$set_cgi?action=members;st=$INFO{'st'};mstart1=$INFO{'mstart1'}" onclick="PleaseWait();">click here to continue</a>...<br />If you want to <a href="javascript:stoptick();">STOP 'Members' conversion click here</a>. Then copy the actual browser address and type it in when you want to continue the conversion.</p>
333              </td>
334          </tr>
335      </table>
336      </div>
337      <script type="text/javascript">
338            function PleaseWait() {
339                  document.getElementById("memcontinued").innerHTML = '<span style="color:#f33"><b>Converting - please wait!<br />If you want to stop \\'Members\\' conversion, click here on STOP before this red message appears again on next page.</b></span>';
340            }
341
342            function stoptick() { stop = 1; }
343
344            stop = 0;
345            function membtick() {
346                  if (stop != 1) {
347                        PleaseWait();
348                        location.href="$set_cgi?action=members;st=$INFO{'st'};mstart1=$INFO{'mstart1'}";
349                  }
350            }
351
352            setTimeout("membtick()",2000);
353      </script>
354            ~;
355    }
356    elsif ( $action eq 'cats' ) {
357        require qq~$vardir/ConvSettings.txt~;
358        if ( !exists $INFO{'bstart'} ) {
359            MoveBoards();
360        }
361
362        $yytabmenu = $NavLink1 . $NavLink2 . $NavLink3a . $NavLink5 . $NavLink6;
363
364        $yymain = qq~
365    <div class="bordercolor borderbox">
366    <table class="cs_thin pad_4px">
367        <col style="width:5%" />
368        <tr>
369            <td class="tabtitle" colspan="2">YaBB 2.6.11 Converter</td>
370        </tr><tr>
371            <td class="windowbg center">
372                <img src="$imagesdir/thread.gif" alt="" />
373            </td>
374            <td class="windowbg2">
375                <div class="convdone">Member Conversion.</div>
376                $ConvDone
377                <div class="convdone">Board &amp; Category Conversion.</div>
378                $ConvDone
379                <div class="convnotdone">Message Conversion.</div>
380                $ConvNotDone
381                <div class="convnotdone">Variables &amp; Clean Up.</div>
382                $ConvNotDone
383            </td>
384        </tr><tr>
385            <td class="windowbg center">
386                <img src="$imagesdir/info.png" alt="" />
387            </td>
388            <td class="windowbg2 fontbigger">
389                All Boards and Subboards moved.<br />
390                <br />
391                Conversion has taken <i>~
392          . int( ( $INFO{'st'} + 60 ) / 60 ) . qq~ minutes</i>.<br />
393                <br />
394                <p id="memcontinued">Click on 'Messages' in the menu to continue.<br />
395                    If you do not do that the script will continue by itself in 5 minutes.</p>
396            </td>
397        </tr>
398    </table>
399    </div>
400
401    <script type="text/javascript">
402            function PleaseWait() {
403                  document.getElementById("memcontinued").innerHTML = '<span style="color:#f00"><b>Converting - please wait!<br />If you want to stop \\'Messages\\' conversion, click here on STOP before this red message appears again on next page.</b></span>';
404            }
405
406            function membtick() {
407                   PleaseWait();
408                   location.href="$set_cgi?action=messages;st=$INFO{'st'}";
409            }
410
411            setTimeout("membtick()",300000);
412      </script>
413            ~;
414    }
415
416    elsif ( $action eq 'cats2' ) {
417        if (   ( !$INFO{'bstart'} && !$INFO{'bfstart'} )
418            || $INFO{'bstart'} < 0
419            || $INFO{'bfstart'} < 0 )
420        {
421            setup_fatal_error(
422"Boards conversion (cats2) 'bstart' ($INFO{'bstart'}) or 'bfstart' ($INFO{'bfstart'}) error!"
423            );
424        }
425
426        $yytabmenu = $NavLink1 . $NavLink2 . $NavLink3a . $NavLink5 . $NavLink6;
427
428        my $bwidth = int( $INFO{'bstart'} / $INFO{'btotal'} * 100 );
429
430        $yymain = qq~
431    <div class="bordercolor borderbox">
432    <table class="cs_thin pad_4px">
433        <col style="width:5%" />
434        <tr>
435            <td class="tabtitle" colspan="2">YaBB 2.6.11 Converter</td>
436        </tr><tr>
437            <td class="windowbg center">
438                <img src="$imagesdir/thread.gif" alt="" />
439            </td>
440            <td class="windowbg2">
441                <div class="convdone">Member Conversion.</div>
442                $ConvDone
443                <div class="convdone">Board and Category Conversion.</div>
444                <div class="divouter">
445                    <div class="divvary" style="width: $bwidth$px;">&nbsp;</div>
446                </div>
447                <div class="divvary2">$bwidth %</div>
448                <br />
449                <div class="convnotdone">Message Conversion.</div>
450                $ConvNotDone
451                <div class="convnotdone">Variables &amp; Clean Up.</div>
452                $ConvNotDone
453            </td>
454        </tr><tr>
455            <td class="windowbg center">
456                <img src="$imagesdir/info.png" alt="" />
457            </td>
458            <td class="windowbg2 fontbigger">
459                  To prevent server time-out due to the amount of boards to be converted, the conversion is split into more steps.<br />
460                  <br />
461                  The time-step (\$max_process_time) is set to <i>$max_process_time seconds</i>.<br />
462                  The last step took <i>~
463          . ( $time_to_jump - $INFO{'starttime'} ) . q~ seconds</i>.<br />
464                  Conversion has taken <i>~
465          . int( ( $INFO{'st'} + 60 ) / 60 ) . q~ minutes</i>.<br />
466                  <br />
467                  There are <b>~
468          . ( $INFO{'btotal'} - $INFO{'bstart'} )
469          . qq~/$INFO{'btotal'}</b> Boards left to be converted.<br />
470                  <p id="memcontinued">If nothing happens in 5 seconds <a href="$set_cgi?action=cats;st=$INFO{'st'};bstart=$INFO{'bstart'};bfstart=$INFO{'bfstart'}" onclick="PleaseWait();">click here to continue</a>...<br />If you want to <a href="javascript:stoptick();">STOP 'Boards & Categories' conversion click here</a>. Then copy the actual browser address and type it in when you are going to continue the conversion.</p>
471            </td>
472        </tr>
473    </table>
474    </div>
475
476    <script type="text/javascript">
477            function PleaseWait() {
478                  document.getElementById("memcontinued").innerHTML = '<span style="color:#f00"><b>Converting - please wait!<br />If you want to stop \\'Boards & Categories\\' conversion, click here on STOP before this red message appears again on next page.</b></span>';
479            }
480
481            function stoptick() { stop = 1; }
482
483            stop = 0;
484            function membtick() {
485                  if (stop != 1) {
486                        PleaseWait();
487                        location.href="$set_cgi?action=cats;st=$INFO{'st'};bstart=$INFO{'bstart'};bfstart=$INFO{'bfstart'}";
488                  }
489            }
490
491            setTimeout("membtick()",2000);
492      </script>
493            ~;
494    }
495    elsif ( $action eq 'messages' ) {
496        require qq~$vardir/ConvSettings.txt~;
497        MoveMessages();
498
499        $yytabmenu = $NavLink1 . $NavLink2 . $NavLink3 . $NavLink5a . $NavLink6;
500
501        $yymain = qq~
502    <div class="bordercolor borderbox">
503    <table class="cs_thin pad_4px">
504        <col style="width:5%" />
505        <tr>
506            <td class="titlebg" colspan="2">YaBB 2.6.11 Converter</td>
507       </tr><tr>
508           <td class="windowbg center">
509               <img src="$imagesdir/thread.gif" alt="" />
510           </td>
511           <td class="windowbg2">
512               <div class="convdone">Member Conversion.</div>
513               $ConvDone
514               <div class="convdone">Board and Category Conversion.</div>
515               $ConvDone
516               <div class="convdone">Message Conversion.</div>
517               $ConvDone
518               <div class="convnotdone">Variables &amp; Clean Up.</div>
519               $ConvNotDone
520           </td>
521       </tr><tr>
522           <td class="windowbg center">
523               <img src="$imagesdir/info.png" alt="" />
524           </td>
525           <td class="windowbg2 fontbigger">
526               <i>$INFO{'total_threads'}</i> Threads have been converted.<br />
527               <i>$INFO{'total_mess'}</i> Messages have been converted.<br />
528               <br />
529               Conversion has taken <i>~
530          . int( ( $INFO{'st'} + 60 ) / 60 ) . qq~ minutes</i>.<br />
531               <br />
532                <p id="memcontinued">Click on 'Clean Up' in the menu to continue.<br />
533                    If you do not do that the script will continue by itself in 5 minutes.</p>
534            </td>
535        </tr>
536    </table>
537    </div>
538
539    <script type="text/javascript">
540            function PleaseWait() {
541                  document.getElementById("memcontinued").innerHTML = '<span style="color:#f00"><b>Converting - please wait!<br />If you want to stop \\'Clean Up\\' conversion, click here on STOP before this red message appears again on next page.</b></span>';
542            }
543
544            function membtick() {
545                   PleaseWait();
546                   location.href="$set_cgi?action=cleanup;st=$INFO{'st'}";
547            }
548
549            setTimeout("membtick()",300000);
550    </script>
551            ~;
552    }
553    elsif ( $action eq 'messages2' ) {
554        if (   ( !$INFO{'count'} && !$INFO{'tcount'} )
555            || $INFO{'count'} < 0
556            || $INFO{'tcount'} < 0 )
557        {
558            setup_fatal_error(
559"Message conversion (messages2) 'count' ($INFO{'count'}) or 'tcount' ($INFO{'tcount'}) error!",
560                1
561            );
562        }
563
564        my $bwidth = int( $INFO{'count'} / $INFO{'totboard'} * 100 );
565        my $mwidth =
566          $INFO{'totmess'}
567          ? int( $INFO{'tcount'} / $INFO{'totmess'} * 100 )
568          : 0;
569
570        $yytabmenu = $NavLink1 . $NavLink2 . $NavLink3 . $NavLink5 . $NavLink6;
571
572        $yymain = qq~
573    <div class="bordercolor borderbox">
574    <table class="cs_thin pad_4px">
575        <col style="width:5%" />
576        <tr>
577            <td class="tabtitle" colspan="2">YaBB 2.6.11 Converter</td>
578        </tr><tr>
579            <td class="windowbg center">
580                <img src="$imagesdir/thread.gif" alt="" />
581            </td>
582            <td class="windowbg2">
583                <div class="convdone">Member Conversion.</div>
584                $ConvDone
585                <div class="convdone">Board and Category Conversion.</div>
586                $ConvDone
587                <div class="convdone">Message Conversion.</div>
588                <div class="divouter">
589                    <div class="divvary" style="width: $bwidth$px;">&nbsp;</div>
590                </div>
591                <div class="divvary2">$bwidth %</div><br />
592                <div class="convnotdone">Variables &amp; Clean Up.</div>
593                $ConvNotDone
594            </td>
595        </tr><tr>
596            <td class="windowbg center">
597                <img src="$imagesdir/info.png" alt="" />
598            </td>
599            <td class="windowbg2 fontbigger">
600                To prevent server time-out due to the amount of messages to be converted, the conversion is split into more steps.<br />
601                <br />
602                The time-step (\$max_process_time) is set to <i>$max_process_time seconds</i>.<br />
603                The last step took <i>~
604          . ( $time_to_jump - $INFO{'starttime'} ) . q~ seconds</i>.<br />
605                  Conversion has taken <i>~
606          . int( ( $INFO{'st'} + 60 ) / 60 ) . qq~ minutes</i>.<br />
607                <br />
608                <i>$INFO{'total_threads'}</i> Threads have been converted.<br />
609                <i>$INFO{'total_mess'}</i> Messages have been converted.<br />
610                There are <b>~
611          . ( $INFO{'totboard'} - $INFO{'count'} )
612          . qq~/$INFO{'totboard'}</b> Boards left with Messages to be converted.<br />
613                <div style="float: left;">There are <b>~
614          . ( $INFO{'totmess'} - $INFO{'tcount'} )
615          . qq~/$INFO{'totmess'}</b> Threads left to be converted. &nbsp; </div>
616                <div class="divouter">
617                    <div class="divvary" style="width: $mwidth$px;">&nbsp;</div>
618                </div>
619                <div class="divvary2">$mwidth %</div>
620                <br />
621                <p id="memcontinued">If nothing happens in 5 seconds <a href="$set_cgi?action=messages;st=$INFO{'st'};totboard=$INFO{'totboard'};count=$INFO{'count'};tcount=$INFO{'tcount'};total_mess=$INFO{'total_mess'};total_threads=$INFO{'total_threads'}" onclick="PleaseWait();">click here to continue</a>...<br />If you want to <a href="javascript:stoptick();">STOP 'Messages' conversion click here</a>. Then copy the actual browser address and type it in when you are going to continue the conversion.</p>
622            </td>
623        </tr>
624    </table>
625    </div>
626
627    <script type="text/javascript">
628            function PleaseWait() {
629                  document.getElementById("memcontinued").innerHTML = '<span style="color:#f00"><b>Converting - please wait!<br />If you want to stop \\'Messages\\' conversion, click here on STOP before this red message appears again on next page.</b></span>';
630            }
631
632            function stoptick() { stop = 1; }
633
634            stop = 0;
635            function membtick() {
636                  if (stop != 1) {
637                        PleaseWait();
638                        location.href="$set_cgi?action=messages;st=$INFO{'st'};count=$INFO{'count'};tcount=$INFO{'tcount'};total_mess=$INFO{'total_mess'};total_threads=$INFO{'total_threads'}";
639                  }
640            }
641
642            setTimeout("membtick()",2000);
643      </script>
644            ~;
645    }
646
647    elsif ( $action eq 'cleanup' ) {
648        require qq~$vardir/ConvSettings.txt~;
649        MoveVariables();
650        FixControl();
651        FixNopost();
652
653        $yytabmenu = $NavLink1 . $NavLink2 . $NavLink3 . $NavLink5 . $NavLink6a;
654
655        $formsession = cloak("$mbname$username");
656
657        $convtext .=
658q~<br /><br />After you have tested your forum and made sure everything was converted correctly you can go to your Admin Center and delete /Convert/Boards, /Convert/Members, /Convert/Messages and /Convert/Variables folders and their contents.~;
659
660        $yymain = qq~
661    <div class="bordercolor borderbox">
662    <table class="cs_thin pad_4px">
663        <tr>
664            <td class="tabtitle" colspan="2">YaBB 2.6.11 Converter</td>
665        </tr><tr>
666            <td class="windowbg center">
667                <img src="$imagesdir/thread.gif" alt="" />
668            </td>
669            <td class="windowbg2">
670                <div class="convdone">Member Import.</div>
671                $ConvDone
672                <div class="convdone">Board and Category Import.</div>
673                $ConvDone
674                <div class="convdone">Message Import.</div>
675                $ConvDone
676                <div class="convdone">Clean Up.</div>
677                $ConvDone
678            </td>
679        </tr><tr>
680            <td class="windowbg center">
681                <img src="$imagesdir/info.png" alt="" />
682            </td>
683            <td class="windowbg2 fontbigger">
684                $forumstarttext
685                $convtext<br />
686                <br />
687                The conversion took <i>~
688          . int( ( $INFO{'st'} + 60 ) / 60 ) . qq~ minute(s)</i>.<br />
689                <br />
690                <br />
691                <span style="color:#f33">We recommend you delete the file "$ENV{'SCRIPT_NAME'}". This is to prevent someone else running the converter and damaging your files.<br />
692                <br />
693                Further more, we strongly recommend to run the following "Maintenance Controls" in the "Admin Center" before you start doing other things:<br />
694                - Rebuild Message Index<br />
695                - Recount Board Totals<br />
696                - Rebuild Members List<br />
697                - Recount Membership<br />
698                - Rebuild Members History<br />
699                - Rebuild Notifications Files<br />
700                - Clean Users Online Log<br />
701                - Attachment Functions => Rebuild Attachments<br /></span>
702                <br />
703                <br />
704                You may now login to your forum. Enjoy using YaBB 2.6.11!
705            </td>
706        </tr><tr>
707            <td class="catbg center" colspan="2">
708                <form action="YaBB.$yyext" method="post" style="display: inline;">
709                    <input type="submit" value="Start" />
710                    <input type="hidden" name="formsession" value="$formsession" />
711                </form>
712            </td>
713        </tr>
714    </table>
715    </div>~;
716
717        CreateConvLock();
718    }
719
720    $yyim    = 'You are running the YaBB 2.6.11 Converter.';
721    $yytitle = 'YaBB 2.6.11 Converter';
722    SetupTemplate();
723}
724
725# Prepare Conversion ##
726
727sub PrepareConv {
728    fopen( FILE, ">$boardsdir/dummy.testfile" )
729      or setup_fatal_error(
730"The CHMOD of the $boardsdir is not set correctly! Cannot write this directory!",
731        1
732      );
733    print {FILE} "dummy testfile\n" or croak 'cannot print FILE';
734    fclose(FILE);
735    opendir( BDIR, $boardsdir )
736      or setup_fatal_error(
737"The CHMOD of the $boardsdir is not set correctly! Cannot read this directory! ",
738        1
739      );
740    @boardlist = readdir BDIR;
741    closedir BDIR;
742
743    fopen( FILE, ">$memberdir/dummy.testfile" )
744      or setup_fatal_error(
745"The CHMOD of the $memberdir is not set correctly! Cannot write this directory!",
746        1
747      );
748    print {FILE} "dummy testfile\n" or croak 'cannot print FILE';
749    fclose(FILE);
750    opendir( MBDIR, $memberdir )
751      or setup_fatal_error(
752"The CHMOD of the $memberdir is not set correctly! Cannot read this directory! ",
753        1
754      );
755    @memblist = readdir MBDIR;
756    closedir MBDIR;
757
758    fopen( FILE, ">$datadir/dummy.testfile" )
759      or setup_fatal_error(
760"The CHMOD of the $datadir is not set correctly! Cannot write this directory!",
761        1
762      );
763    print {FILE} "dummy testfile\n" or croak 'cannot print FILE';
764    fclose(FILE);
765    opendir( MSDIR, $datadir )
766      or setup_fatal_error(
767"The CHMOD of the $datadir is not set correctly! Cannot read this directory! ",
768        1
769      );
770    @msglist = readdir MSDIR;
771    closedir MSDIR;
772
773    automaintenance('on');
774
775    foreach my $file (@boardlist) {
776        if (   $file ne '.htaccess'
777            && $file ne 'index.html'
778            && $file ne 'forum.control'
779            && $file ne q{.}
780            && $file ne q{..} )
781        {
782            unlink "$boardsdir/$file";
783        }
784    }
785    foreach my $file (@memblist) {
786        if (   $file ne '.htaccess'
787            && $file ne 'index.html'
788            && $file ne 'admin.vars'
789            && $file ne q{.}
790            && $file ne q{..} )
791        {
792            unlink "$memberdir/$file";
793        }
794    }
795    foreach my $file (@msglist) {
796        if (   $file ne '.htaccess'
797            && $file ne 'index.html'
798            && $file ne q{.}
799            && $file ne q{..} )
800        {
801            unlink "$datadir/$file";
802        }
803    }
804    return;
805}
806
807# / Prepare Conversion ##
808
809# Member Conversion ##
810
811sub ConvertMembers {
812    fopen( MEMDIR, "$convmemberdir/memberlist.txt" )
813      or setup_fatal_error( "$maintext_23 $convmemberdir/memberlist.txt:", 1 );
814    my @memlist = <MEMDIR>;
815    fclose(MEMDIR);
816    fopen( MEMDIRLST, "> $memberdir/memberlist.txt" )
817      or setup_fatal_error( "$maintext_23 $memberdir/memberlist.txt:", 1 );
818    print {MEMDIRLST} @memlist or croak 'cannot print MEMDIR';
819    fclose(MEMDIRLST);
820
821    fopen( MEMINFO, "$convmemberdir/memberinfo.txt" )
822      or setup_fatal_error( "$maintext_23 $convmemberdir/memberinfo.txt: ", 1 );
823    my @meminfo = <MEMINFO>;
824    fclose(MEMINFO);
825    fopen( NMEMINFO, ">$memberdir/memberinfo.txt" )
826      or setup_fatal_error( "$maintext_23 $memberdir/memberinfo.txt: ", 1 );
827    print {NMEMINFO} @meminfo or croak 'cannot print NBMEMINFO';
828    fclose(NMEMINFO);
829
830    if ( -e "$convmemberdir/broadcast.messages" ) {
831        fopen( BMEMDIR, "$convmemberdir/broadcast.messages" )
832          or
833          setup_fatal_error( "$maintext_23 $convmemberdir/broadcast.messages: ",
834            1 );
835        my @bmessages = <BMEMDIR>;
836        fclose(BMEMDIR);
837        fopen( NBMEMDIR, ">$memberdir/broadcast.messages" )
838          or
839          setup_fatal_error( "$maintext_23 $convmemberdir/broadcast.messages: ",
840            1 );
841        print {NBMEMDIR} @bmessages or croak 'cannot print NBMEMDIR';
842        fclose(NBMEMDIR);
843    }
844
845    if ( -e "$convmemberdir/memberlist.approve" ) {
846        fopen( BMEMDIRA, "$convmemberdir/memberlist.approve" )
847          or
848          setup_fatal_error( "$maintext_23 $convmemberdir/memberlist.approve: ",
849            1 );
850        my @approve = <BMEMDIRA>;
851        fclose(BMEMDIRA);
852        fopen( NBMEMDIRA, ">$memberdir/memberlist.approve" )
853          or
854          setup_fatal_error( "$maintext_23 $convmemberdir/memberlist.approve: ",
855            1 );
856        print {NBMEMDIRA} @approve or croak 'cannot print NBMEMDIR';
857        fclose(NBMEMDIRA);
858    }
859
860    if ( -e "$convmemberdir/memberlist.inactive" ) {
861        fopen( BMEMDIRIN, "$convmemberdir/memberlist.inactive" )
862          or setup_fatal_error(
863            "$maintext_23 $convmemberdir/memberlist.inactive: ", 1 );
864        my @inactive = <BMEMDIRIN>;
865        fclose(BMEMDIRIN);
866        fopen( NBMEMDIRIN, ">$memberdir/memberlist.inactive" )
867          or setup_fatal_error(
868            "$maintext_23 $convmemberdir/memberlist.inactive: ", 1 );
869        print {NBMEMDIRIN} @inactive or croak 'cannot print NBMEMDIRIN';
870        fclose(NBMEMDIRIN);
871    }
872
873    if ( -e "$convmemberdir/members.ttl" ) {
874        fopen( BMEMDIRTTL, "$convmemberdir/members.ttl" )
875          or
876          setup_fatal_error( "$maintext_23 $convmemberdir/members.ttl: ", 1 );
877        my @memtotl = <BMEMDIRTTL>;
878        fclose(BMEMDIRTTL);
879        fopen( NBMEMDIRTTL, ">$memberdir/members.ttl" )
880          or setup_fatal_error( "$maintext_23 $memberdir/members.ttl: ", 1 );
881        print {NBMEMDIRTTL} @memtotl or croak 'cannot print NBMEMDIRTTL';
882        fclose(NBMEMDIRTTL);
883    }
884
885    if ( -e "$convmemberdir/forgotten.passes" ) {
886        fopen( BMEMDIRP, "$convmemberdir/forgotten.passes" )
887          or
888          setup_fatal_error( "$maintext_23 $convmemberdir/forgotten.passes: ",
889            1 );
890        my @passes = <BMEMDIRP>;
891        fclose(BMEMDIRP);
892
893        fopen( NBMEMDIRP, ">$memberdir/forgotten.passes" )
894          or
895          setup_fatal_error( "$maintext_23 $memberdir/forgotten.passes: ", 1 );
896        print {NBMEMDIRP} @passes or croak 'cannot print NBMEMDIRP';
897        fclose(NBMEMDIRP);
898    }
899
900    for (@approve) {
901        ( undef, undef, $regmember, undef, undef ) =
902          split /\|/xsm, $_;
903        push @memlist, $regmember;
904    }
905    for (@inactive) {
906        ( undef, undef, $regmember, undef, undef ) =
907          split /\|/xsm, $_;
908        push @memlist, $regmember;
909    }
910    my @xtn = qw(vars msg ims imstore log outbox rlog imdraft pre wait);
911    for my $i ( ( $INFO{'mstart1'} || 0 ) .. ( @memlist - 1 ) ) {
912        ( $user, undef ) = split /\t/xsm, $memlist[$i];
913
914        if (   !-e "$convmemberdir/$user.vars"
915            && !-e "$convmemberdir/$user.pre"
916            && !-e "$convmemberdir/$user.wait" )
917        {
918            next;
919        }
920        for my $cnt (@xtn) {
921            if ( -e "$convmemberdir/$user.$cnt" ) {
922                fopen( FILEUSER, "$convmemberdir/$user.$cnt" )
923                  or
924                  setup_fatal_error( "$maintext_23 $convmemberdir/$user.$cnt: ",
925                    1 );
926                my @divfiles = <FILEUSER>;
927                fclose(FILEUSER);
928
929                fopen( FILEUSERB, ">$memberdir/$user.$cnt" )
930                  or setup_fatal_error( "$maintext_23 $memberdir/$user.$cnt: ",
931                    1 );
932                print {FILEUSERB} @divfiles or croak 'cannot print FILEUSER';
933                fclose(FILEUSERB);
934            }
935        }
936        if ( -e "$convmemberdir/$user.wlog" && !-e "$convmemberdir/$user.rlog" )
937        {
938            undef %recent;
939            require "$convmemberdir/$user.wlog";
940            fopen( RLOG, ">$memberdir/$user.rlog" );
941            print {RLOG} map { "$_\t$recent{$_}\n" } keys %recent
942              or croak "$croak{'print'} RLOG";
943            fclose(RLOG);
944        }
945
946        if ( time() > $time_to_jump && ( $i + 1 ) < @memlist ) {
947            $yySetLocation =
948                qq~$set_cgi?action=members2;st=~
949              . int( $INFO{'st'} + time() - $time_to_jump + $max_process_time )
950              . qq~;starttime=$time_to_jump;mtotal=~
951              . @memlist
952              . qq~;mstart1=$i~;
953            redirectexit();
954        }
955    }
956    return;
957}
958
959# / Member Conversion ##
960
961# Board + Category Conversion ##
962
963sub MoveBoards {
964    my @brdlst = ( 'forum.master', 'forum.totals', 'forum.control', );
965
966    for my $newbrd (@brdlst) {
967        fopen( OLDBRD, "$convboardsdir/$newbrd" );
968        my @brdinfo = <OLDBRD>;
969        fclose(OLDBRD);
970
971        fopen( NEWBRD, ">$boardsdir/$newbrd" );
972        print {NEWBRD} @brdinfo or croak 'cannot print NEWBRD';
973        fclose(NEWBRD);
974    }
975    require "$boardsdir/forum.master";
976    @boards    = sort keys %board;
977    @subboards = sort keys %subboard;
978    my @brdtype = qw(txt mail exhits);
979    push( @boards, @subboards );
980
981    for my $i ( ( $INFO{'bstart'} || 0 ) .. ( @boards - 1 ) ) {
982        for my $ext (@brdtype) {
983            if ( -e "$convboardsdir/$boards[$i].$ext" ) {
984                fopen( BOARDFILE, "$convboardsdir/$boards[$i].$ext" )
985                  or setup_fatal_error(
986                    "$maintext_23 $convboardsdir/$boards[$i].ext: ", 1 );
987                @brdinfo = <BOARDFILE>;
988                fclose(BOARDFILE);
989                fopen( NEWBRD, ">$boardsdir/$boards[$i].$ext" );
990                print {NEWBRD} @brdinfo or croak 'cannot print NEWBRD';
991                fclose(NEWBRD);
992            }
993        }
994        if ( time() > $time_to_jump && ( $i + 1 ) < @boards ) {
995            $yySetLocation =
996                qq~$set_cgi?action=cats2;st=~
997              . int( $INFO{'st'} + time() - $time_to_jump + $max_process_time )
998              . qq~;starttime=$time_to_jump;bstart=$i;btotal=~
999              . @boards;
1000            redirectexit();
1001        }
1002    }
1003    return;
1004}
1005
1006sub FixControl {
1007    if ( -e qq~$convvardir/boardconv.txt~ ) {
1008        require qq~$convvardir/boardconv.txt~;
1009        fopen( OLDFORUMCONTROL, "$convboardsdir/forum.control" )
1010          || setup_fatal_error( "$maintext_23 $convboardsdir/forum.control: ",
1011            1 );
1012        @oldboardcontrols = <OLDFORUMCONTROL>;
1013        fclose(OLDFORUMCONTROL);
1014        chomp @oldboardcontrols;
1015        foreach (@oldboardcontrols) {
1016            my ( $old, $oldboard ) = split /[|]/xsm, $_;
1017            push @oldboard, $oldboard;
1018        }
1019        my $j        = 0;
1020        my @newboard = ();
1021        foreach my $x (@oldboard) {
1022            ${$x}{'mypic'} = q{};
1023            if ( ${$x}{'pic'} ) { ${$x}{'mypic'} = 'y'; }
1024
1025#$cat|$board|$pic|$description|$mods|$modgroups|$topicperms|$replyperms|$pollperms|$zero|$membergroups|$ann|$rbin|$attperms|$minageperms|$maxageperms|$genderperms|$canpost|$parent|$rules|$rulestitle|$rulesdesc|$rulescollapse|$brdpasswr|$brdpassw|$bdrss
1026            $newboard[$j] =
1027qq~${$x}{'cat'}|$x|${$x}{'mypic'}|${$x}{'description'}|${$x}{'mods'}|${$x}{'modgroups'}|${$x}{'topicperms'}|${$x}{'replyperms'}|${$x}{'pollperms'}|${$x}{'zero'}|${$x}{'membergroups'}|${$x}{'ann'}|${$x}{'rbin'}|${$x}{'attperms'}|${$x}{'minageperms'}|${$x}{'maxageperms'}|${$x}{'genderperms'}|${$x}{'canpost'}|${$x}{'parent'}|${$x}{'rules'}|${$x}{'rulestitle'}|${$x}{'rulesdesc'}|${$x}{'rulescollapse'}|${$x}{'brdpasswr'}|${$x}{'brdpassw'}|${$x}{'brdrss'}\n~;
1028            if ( ${$x}{'pic'} ) {
1029                fopen( BRDPIC, ">>$boardsdir/brdpics.db" );
1030                print {BRDPIC} qq~$x|default|${$x}{'pic'}\n~;
1031                fclose(BRDPIC);
1032            }
1033            $j++;
1034        }
1035        fopen( FORUMCONTROL, ">$boardsdir/forum.control" )
1036          or setup_fatal_error( "$maintext_23 $boardsdir/forum.control: ", 1 );
1037        print {FORUMCONTROL} @newboard
1038          or croak 'cannot print FORUMCONTROL';
1039        fclose(FORUMCONTROL);
1040    }
1041    else {
1042        fopen( OLDFORUMCONTROL, "$convboardsdir/forum.control" )
1043          or
1044          setup_fatal_error( "$maintext_23 $convboardsdir/forum.control: ", 1 );
1045        @oldboardcontrols = <OLDFORUMCONTROL>;
1046        fclose(OLDFORUMCONTROL);
1047        fopen( FORUMCONTROL, ">$boardsdir/forum.control" )
1048          or setup_fatal_error( "$maintext_23 $boardsdir/forum.control: ", 1 );
1049        print {FORUMCONTROL} @oldboardcontrols
1050          or croak 'cannot print FORUMCONTROL';
1051        fclose(FORUMCONTROL);
1052    }
1053}
1054
1055sub FixNopost {
1056    if ( $NoPost{'1'} ) {
1057        fopen( FORUMCONTROL, "$boardsdir/forum.control" )
1058          or setup_fatal_error( "$maintext_23 $boardsdir/forum.control: ", 1 );
1059        @boardcontrols = <FORUMCONTROL>;
1060        fclose(FORUMCONTROL);
1061        chomp @boardcontrols;
1062
1063        my $totalnoposts = keys %NoPost;
1064        for my $i ( ( $INFO{'fix_nopost'} || 1 ) .. ( $totalnoposts - 1 ) ) {
1065            ( $grptitle, undef ) = split /\|/xsm, $NoPost{$i}, 2;
1066
1067            foreach my $key ( keys %catinfo ) {
1068                ( $catname, $catperms, $catcol ) =
1069                  split /\|/xsm, $catinfo{$key}, 3;
1070                $newperm = q{};
1071                foreach my $theperm ( split /, /sm, $catperms ) {
1072                    if ( $theperm eq $grptitle ) { $theperm = $i; }
1073                    $newperm .= qq~$theperm, ~;
1074                }
1075                $newperm =~ s/, $//sm;
1076                $catinfo{$key} = qq~$catname|$newperm|$catcol~;
1077            }
1078            foreach my $key ( keys %board ) {
1079                ( $boardname, $boardperms, $boardshow ) =
1080                  split /\|/xsm, $board{$key}, 3;
1081                $newperm = q{};
1082                foreach my $theperm ( split /, /sm, $boardperms ) {
1083                    if ( $theperm eq $grptitle ) { $theperm = $i; }
1084                    $newperm .= qq~$theperm, ~;
1085                }
1086                $newperm =~ s/, $//sm;
1087                $board{$key} = qq~$boardname|$newperm|$boardshow~;
1088            }
1089            for my $j ( 0 .. ( @boardcontrols - 1 ) ) {
1090                (
1091                    $cntcat,         $cntboard,        $cntpic,
1092                    $cntdescription, $cntmods,         $cntmodgroups,
1093                    $cnttopicperms,  $cntreplyperms,   $cntpollperms,
1094                    $cntzero,        $cntmembergroups, $cntann,
1095                    $cntrbin,        $cntattperms,     $cntminageperms,
1096                    $cntmaxageperms, $cntgenderperms,  $cntbrdrss
1097                ) = split /\|/xsm, $boardcontrols[$j];
1098
1099                $newmodgroups = q{};
1100                foreach my $theperm ( split /, /sm, $cntmodgroups ) {
1101                    if ( $theperm eq $grptitle ) { $theperm = $i; }
1102                    $newmodgroups .= qq~$theperm, ~;
1103                }
1104                $newmodgroups =~ s/, $//sm;
1105
1106                $newtopicperms = q{};
1107                foreach my $theperm ( split /, /sm, $cnttopicperms ) {
1108                    if ( $theperm eq $grptitle ) { $theperm = $i; }
1109                    $newtopicperms .= qq~$theperm, ~;
1110                }
1111                $newtopicperms =~ s/, $//sm;
1112
1113                $newreplyperms = q{};
1114                foreach my $theperm ( split /, /sm, $cntreplyperms ) {
1115                    if ( $theperm eq $grptitle ) { $theperm = $i; }
1116                    $newreplyperms .= qq~$theperm, ~;
1117                }
1118                $newreplyperms =~ s/, $//sm;
1119
1120                $newpollperms = q{};
1121                foreach my $theperm ( split /, /sm, $cntpollperms ) {
1122                    if ( $theperm eq $grptitle ) { $theperm = $i; }
1123                    $newpollperms .= qq~$theperm, ~;
1124                }
1125                $newpollperms =~ s/, $//sm;
1126
1127                $boardcontrols[$j] =
1128qq~$cntcat|$cntboard|$cntpic|$cntdescription|$cntmods|$newmodgroups|$newtopicperms|$newreplyperms|$newpollperms|$cntzero|$cntmembergroups|$cntann|$cntrbin|$cntattperms|$cntminageperms|$cntmaxageperms|$cntgenderperms|$brdrss\n~;
1129            }
1130        }
1131
1132        fopen( FORUMCONTROL, ">$boardsdir/forum.control" )
1133          or setup_fatal_error( "$maintext_23 $boardsdir/forum.control: ", 1 );
1134        print {FORUMCONTROL} @boardcontrols
1135          or croak 'cannot print FORUMCONTROL';
1136        fclose(FORUMCONTROL);
1137    }
1138    return;
1139}
1140
1141# / Board + Category Conversion ##
1142
1143# Messages Conversion ##
1144
1145sub MoveMessages {
1146    if ( -e "$convdatadir/movedthreads.cgi" ) {
1147        fopen( OLDMVFILE, "$convdatadir/movedthreads.cgi" )
1148          or setup_fatal_error( "$maintext_23 $convdatadir/movedthreads.cgi: ",
1149            1 );
1150        my @movedmessageline = <OLDMVFILE>;
1151        fclose(OLDMVFILE);
1152
1153        fopen( MVFILE, ">$vardir/Movedthreads.pm" );
1154        print {MVFILE} @movedmessageline
1155          or croak "cannot print $vardir/Movedthreads.pm";
1156        fclose(MVFILE);
1157    }
1158    require "$boardsdir/forum.master";
1159
1160    my @boards    = sort keys %board;
1161    my @subboards = sort keys %subboard;
1162    push @boards, @subboards;
1163
1164    my $totalbdr  = @boards;
1165    my @threadext = qw(mail poll polled);
1166    for my $next_board ( ( $INFO{'count'} || 0 ) .. ( $totalbdr - 1 ) ) {
1167        my $boardname = $boards[$next_board];
1168        fopen( BRDFILE, "$boardsdir/$boardname.txt" )
1169          or setup_fatal_error( "$maintext_23 $boardsdir/$boardname.txt: ", 1 );
1170        my @brdmessageline = <BRDFILE>;
1171        fclose(BRDFILE);
1172        chomp @brdmessageline;
1173        $totalmess = @brdmessageline;
1174
1175        for my $tops ( ( $INFO{'tcount'} || 0 ) .. ( $totalmess - 1 ) ) {
1176            my @thread = split /\|/xsm, $brdmessageline[$tops];
1177            my $thread = $thread[0];
1178            if (   -e "$convdatadir/$thread.txt"
1179                && -e "$convdatadir/$thread.ctb" )
1180            {
1181                fopen( MSGFILE, "$convdatadir/$thread.txt" )
1182                  or
1183                  setup_fatal_error( "$maintext_23 $convdatadir/$thread.txt: ",
1184                    1 );
1185                @messagelines = <MSGFILE>;
1186                fclose(MSGFILE);
1187                fopen( MSGFILE, ">$datadir/$thread.txt" )
1188                  or
1189                  setup_fatal_error( "$maintext_23 $datadir/$thread.txt: ", 1 );
1190                print {MSGFILE} @messagelines
1191                  or croak "cannot print $datadir/$thread.txt";
1192                fclose(MSGFILE);
1193                $INFO{'total_mess'} += @messagelines;
1194                $INFO{'total_threads'}++;
1195                fopen( MSGFILE, "$convdatadir/$thread.ctb" )
1196                  or
1197                  setup_fatal_error( "$maintext_23 $convdatadir/$thread.ctb: ",
1198                    1 );
1199                @messagelines = <MSGFILE>;
1200                fclose(MSGFILE);
1201                fopen( MSGFILE, ">$datadir/$thread.ctb" )
1202                  or
1203                  setup_fatal_error( "$maintext_23 $datadir/$thread.ctb: ", 1 );
1204                print {MSGFILE} @messagelines
1205                  or croak "cannot print $datadir/$thread.ctb";
1206                fclose(MSGFILE);
1207
1208                for my $ext (@threadext) {
1209                    if ( -e "$convdatadir/$thread.$ext" ) {
1210                        fopen( MSGFILE, "$convdatadir/$thread.$ext" )
1211                          or setup_fatal_error(
1212                            "$maintext_23 $convdatadir/$thread.$ext: ", 1 );
1213                        @messagelines = <MSGFILE>;
1214                        fclose(MSGFILE);
1215                        fopen( MSGFILE, ">$datadir/$thread.$ext" )
1216                          or setup_fatal_error(
1217                            "$maintext_23 $datadir/$thread.$ext: ", 1 );
1218                        print {MSGFILE} @messagelines
1219                          or croak "cannot print $datadir/$thread.$ext";
1220                        fclose(MSGFILE);
1221                    }
1222                }
1223            }
1224            if ( time() > $time_to_jump && ( $tops + 1 ) < $totalmess ) {
1225                $yySetLocation =
1226                  qq~$set_cgi?action=messages2;st=~
1227                  . int( $INFO{'st'} +
1228                      time() -
1229                      ( $time_to_jump - $max_process_time ) )
1230                  . qq~;starttime=$time_to_jump;count=$next_board;tcount=~
1231                  . ( $tops + 1 )
1232                  . qq~;total_mess=$INFO{'total_mess'};total_threads=$INFO{'total_threads'};totboard=$totalbdr;totmess=$totalmess~;
1233                redirectexit();
1234            }
1235        }
1236        if ( time() > $time_to_jump && ( $next_board + 1 ) < $totalbdr ) {
1237            $yySetLocation =
1238              qq~$set_cgi?action=messages2;st=~
1239              . int(
1240                $INFO{'st'} + time() - ( $time_to_jump - $max_process_time ) )
1241              . qq~;starttime=$time_to_jump;count=~
1242              . ( $next_board + 1 )
1243              . qq~;tcount=0;total_mess=$INFO{'total_mess'};total_threads=$INFO{'total_threads'};totboard=$totalbdr;totmess=0~;
1244            redirectexit();
1245        }
1246        $INFO{'tcount'} = 0;
1247    }
1248    return;
1249}
1250
1251# / Messages Conversion ##
1252
1253# Variables Conversion ##
1254sub MoveVariables {
1255    my ($convdatadir) = @_;
1256    my @mvvar = (
1257        'allowed.txt',             'attachments.txt',
1258        'ban_log.txt',             'bots.hosts',
1259        'email_domain_filter.txt', 'eventcal.db',
1260        'eventcalbday.db',         'flood.txt',
1261        'gmodsettings.txt',        'modlist.txt',
1262        'mostlog.txt',             'Movedthreads.pm',
1263        'oldestmes.txt',           'pm.attachments',
1264        'registration.log',        'reserve.txt',
1265        'reservecfg.txt',          'spamrules.txt',
1266        'news.txt',
1267    );
1268    my @oldvar = ();
1269    for my $varfl (@mvvar) {
1270        if ( -e "$convdatadir/$varfl" ) {
1271            if ( $varfl eq 'eventcal.db' ) {
1272                fopen( OLDVAR, "$convdatadir/$varfl" );
1273                @oldvar = <OLDVAR>;
1274                fclose(OLDVAR);
1275                chomp @oldvar;
1276                my @newvar;
1277                foreach my $eventline (@oldvar) {
1278                    my @eventline = split /\|/xsm, $eventline;
1279                    if ( scalar(@eventline) < 9 ) {
1280
1281#                   ( $cal_date,$cal_type,$cal_name,$cal_time,$cal_event,$cal_icon,$cal_noname,$cal_type2)
1282                        my $g = q{};
1283                        if ( lc $eventline[2] eq 'guest' ) {
1284                            $g = 'g';
1285                        }
1286                        push @newvar,
1287qq~$eventline[0]|$eventline[1]|$eventline[2]|$eventline[3]||$eventline[4]|$eventline[5]|$eventline[6]|$eventline[7]||$g\n~;
1288                    }
1289                    else { push @newvar, qq~$eventline\n~; }
1290                }
1291
1292                fopen( NEWVAR, ">$vardir/$varfl" );
1293                print {NEWVAR} @newvar
1294                  or croak "cannot print $vardir/$varfl";
1295                fclose(NEWVAR);
1296            }
1297            else {
1298                fopen( OLDVAR, "$convdatadir/$varfl" );
1299                @oldvar = <OLDVAR>;
1300                fclose(OLDVAR);
1301
1302                fopen( NEWVAR, ">$vardir/$varfl" );
1303                print {NEWVAR} @oldvar
1304                  or croak "cannot print $vardir/$varfl";
1305                fclose(NEWVAR);
1306            }
1307        }
1308    }
1309    Convert_Settings();
1310    return;
1311}
1312
1313sub Convert_Settings {
1314    $ret = 0;
1315    if ( -e "$convvardir/Settings.pl" ) {
1316        use Time::gmtime;
1317        $time = time;
1318        require "$convvardir/Settings.pl";
1319        if ($ip_banlist) {
1320            @i_ban = ( split /,/xsm, $ip_banlist );
1321            chomp @i_ban;
1322            for my $j (@i_ban) {
1323                fopen( BAN, ">>$vardir/banlist.txt" );
1324                print {BAN} qq~I|$j|$time|import|p\n~
1325                  or croak 'cannot write to BAN';
1326                fclose(BAN);
1327            }
1328        }
1329        if ($email_banlist) {
1330            @e_ban = ( split /,/xsm, $email_banlist );
1331            chomp @e_ban;
1332            for my $j (@e_ban) {
1333                fopen( BAN, ">>$vardir/banlist.txt" );
1334                print {BAN} qq~E|$j|$time|import|p\n~
1335                  or croak 'cannot write to BAN';
1336                fclose(BAN);
1337            }
1338        }
1339        if ($user_banlist) {
1340            @u_ban = ( split /,/xsm, $user_banlist );
1341            chomp @u_ban;
1342            for my $j (@u_ban) {
1343                fopen( BAN, ">>$vardir/banlist.txt" );
1344                print {BAN} qq~U|$j|$time|import|p\n~
1345                  or croak 'cannot write to BAN';
1346                fclose(BAN);
1347            }
1348        }
1349        $mypl = 1;
1350    }
1351    elsif ( -e "$convvardir/Settings.pm" ) {
1352        require "$convvardir/Settings.pm";
1353    }
1354
1355    if ( -e "$convvardir/eventcalset.txt" ) {
1356        require "$convvardir/eventcalset.txt";
1357    }
1358
1359    if ( $mypl == 1 ) {
1360        $settings_file_version = 'YaBB 2.6.11';
1361        if ( $enable_notifications eq q{} ) {
1362            $enable_notifications = $enable_notification ? 3 : 0;
1363        }
1364        if ( !$imspan || $imspam eq 'off' ) { $imspam = 0; }
1365    }
1366
1367    ( undef, $rancook ) = split /\-/xsm, $cookieusername;
1368    $cookietsort         = isempty( $cookietsort,         qq~Y2tsort-$rancook~ );
1369    $cookieview          = isempty( $cookieview,          qq~Y2view-$rancook~ );
1370    $cookieviewtime      = isempty( $cookieviewtime,      525600 );
1371    $MaxIMMessLen        = isempty( $MaxIMMessLen,        2000 );
1372    $AdMaxIMMessLen      = isempty( $AdMaxIMMessLen,      3000 );
1373    $MaxCalMessLen       = isempty( $MaxCalMessLen,       200 );
1374    $AdMaxCalMessLen     = isempty( $AdMaxCalMessLen,     300 );
1375    $Show_EventCal       = isempty( $Show_EventCal,       0 );
1376    $Event_TodayColor    = isempty( $Event_TodayColor,    '#ff0000' );
1377    $fix_avatar_img_size = isempty( $fix_avatar_img_size, 0 );
1378    $max_avatar_width    = isempty( $$max_avatar_width,   65 );
1379    $max_avatar_height   = isempty( $max_avatar_height,   65 );
1380    $fix_avatarml_img_size = isempty( $fix_avatarml_img_size, 0 );
1381    $max_avatarml_width    = isempty( $max_avatarml_width,    65 );
1382    $max_avatarml_height   = isempty( $max_avatarml_height,   65 );
1383    $fix_brd_img_size      = isempty( $fix_brd_img_size,      0 );
1384    $max_brd_img_width     = isempty( $max_brd_img_width,     50 );
1385    $max_brd_img_height    = isempty( $max_brd_img_height,    50 );
1386    $enabletz              = isempty( $enabletz,              0 );
1387    $default_tz            = isempty( $default_tz,            'UTC' );
1388    $screenlogin           = isempty( $screenlogin,           1);
1389    $gzcomp = fileno $GZIP ? 1 : 0;
1390
1391    $ip_banlist           = q{};
1392    $email_banlist        = q{};
1393    $user_banlist         = q{};
1394    $showsearchbox        = isempty( $showsearchbox, 1 );
1395    $fmodview             = isempty( $fmodview, $gmodview );
1396    $mdfmod               = isempty( $mdfmod, $mdglobal );
1397    $show_online_ip_admin = isempty( $show_online_ip_admin, 1 );
1398    $show_online_ip_gmod  = isempty( $show_online_ip_gmod, 1 );
1399    $show_online_ip_fmod  = isempty( $show_online_ip_fmod, 1 );
1400    $ipLookup             = isempty( $ipLookup, 1 );
1401    $bm_subcut            = isempty( $bm_subcut, 50 );
1402
1403    require Admin::NewSettings;
1404    SaveSettingsTo('Settings.pm');
1405
1406    $ret = 1;
1407    return;
1408}
1409
1410# / Variables Conversion ##
1411
1412#End Conversion#
1413
1414sub FoundConvert2xLock {
1415    tempstarter();
1416    require Sources::TabMenu;
1417
1418    if ( -e "$vardir/Convert2x.lock" ) {
1419        $fixa = q{};
1420        $fixa2 =
1421qq~The 2x Conversion Utility has already been run.<br />To run Utility again, remove the file "$vardir/Convert2x.lock," then re-visit this page.~;
1422
1423    }
1424    else {
1425        $fixa =
1426          q~&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1427                <form action="Convert2x.$yyext" method="post" style="display: inline;">
1428                    <input type="submit" value="Fix 2.0-2.5 files" />
1429                </form>~;
1430    }
1431
1432    $yymain = qq~
1433<div class="bordercolor" style="padding: 0px; width: 100%; margin-left: 0px; margin-right: 0px;">
1434    <table class="cs_thin pad_4px">
1435        <col style="width:5%" />
1436        <tr>
1437            <td class="titlebg" colspan="2">
1438                YaBB 2.6.11 Setup
1439            </td>
1440        </tr><tr>
1441            <td class="windowbg center">
1442                <img src="$imagesdir/info.png" alt="" />
1443            </td>
1444            <td class="windowbg2 center">
1445                $fixa2
1446            </td>
1447        </tr><tr>
1448            <td class="catbg center" colspan="2">
1449                <form action="$boardurl/YaBB.$yyext" method="post" style="display: inline;">
1450                    <input type="submit" value="Go to your Forum" />
1451                    <input type="hidden" name="formsession" value="$formsession" />
1452                </form>
1453                $fixa
1454            </td>
1455        </tr>
1456    </table>
1457</div>
1458      ~;
1459
1460    $yyim    = 'YaBB 2.6.11 Convert2x Utility has already been run.';
1461    $yytitle = 'YaBB 2.6.11 Convert2x Utility';
1462    SetupTemplate();
1463    return;
1464}
1465
1466sub CreateConvLock {
1467    fopen( 'LOCKFILE', ">$vardir/Convert2x.lock" )
1468      or setup_fatal_error( "$maintext_23 $vardir/Convert2x.lock: ", 1 );
1469    print {LOCKFILE} qq~This is a lockfile for the Convert2x Utility.\n~
1470      or croak 'cannot print to Convert2x.lock';
1471    print {LOCKFILE}
1472      qq~It prevents it being run again after it has been run once.\n~
1473      or croak 'cannot print to Convert2x.lock';
1474    print {LOCKFILE}
1475      q~Delete this file if you want to run the Convert2x Utility again.~
1476      or croak 'cannot print to Convert2x.lock';
1477    fclose('LOCKFILE');
1478    return;
1479}
1480
1481sub tempstarter {
1482    return if !-e "$vardir/Settings.pm";
1483
1484    $YaBBversion = 'YaBB 2.6.11';
1485
1486    # Make sure the module path is present
1487    push @INC, './Modules';
1488
1489    if ( $ENV{'SERVER_SOFTWARE'} =~ /IIS/sm ) {
1490        $yyIIS = 1;
1491        if ( $PROGRAM_NAME =~ m{(.*)(\\|/)}xsm ) {
1492            $yypath = $1;
1493        }
1494        $yypath =~ s/\\/\//gxsm;
1495        chdir $yypath;
1496        push @INC, $yypath;
1497    }
1498
1499    # Requirements and Errors
1500    require Variables::Settings;
1501    if ( -e "$vardir/ConvSettings.txt" ) {
1502        require "$vardir/ConvSettings.txt";
1503    }
1504    else { $convertdir = './Convert'; }
1505
1506    LoadCookie();    # Load the user's cookie (or set to guest)
1507    LoadUserSettings();
1508    WhatTemplate();
1509    WhatLanguage();
1510    require Sources::Security;
1511    WriteLog();
1512    return;
1513}
1514
1515sub SetupImgLoc {
1516    if ( !-e "$htmldir/Templates/Forum/$useimages/$_[0]" ) {
1517        $thisimgloc = qq~img src="$yyhtml_root/Templates/Forum/default/$_[0]"~;
1518    }
1519    else { $thisimgloc = qq~img src="$imagesdir/$_[0]"~; }
1520    return $thisimgloc;
1521}
1522
1523sub tabmenushow {    # used by the converter
1524    $tabsep  = q{ &nbsp; };
1525    $tabfill = q{ &nbsp; };
1526
1527    $NavLink1 = qq~<span>$tabfill Members $tabfill</span>~;
1528    $NavLink2 =
1529      qq~$tabsep<span>$tabfill Boards &amp; Categories $tabfill</span>~;
1530    $NavLink3 = qq~$tabsep<span>$tabfill Messages $tabfill</span>~;
1531    $NavLink5 = qq~$tabsep<span>$tabfill Clean Up $tabfill</span>~;
1532    $NavLink6 = qq~$tabsep<span>$tabfill Login $tabfill</span>$tabsep&nbsp;~;
1533
1534    $NavLink1a =
1535qq~<span class="selected"><a href="$set_cgi?action=members;st=$INFO{'st'}" style="color: #f33; padding:0" class="selected" onClick="PleaseWait();">$tabfill Members $tabfill</a></span>~;
1536    $NavLink2a =
1537qq~$tabsep<span class="selected"><a href="$set_cgi?action=cats;st=$INFO{'st'}" style="color: #f33; padding:0" class="selected" onClick="PleaseWait();">$tabfill Boards &amp; Categories $tabfill</a></span>~;
1538    $NavLink3a =
1539qq~$tabsep<span class="selected"><a href="$set_cgi?action=messages;st=$INFO{'st'}" style="color: #f33; padding:0" class="selected" onClick="PleaseWait();">$tabfill Messages $tabfill</a></span>~;
1540    $NavLink5a =
1541qq~$tabsep<span class="selected"><a href="$set_cgi?action=cleanup;st=$INFO{'st'}" style="color: #f33; padding:0" class="selected" onClick="PleaseWait();">$tabfill Clean Up $tabfill</a></span>~;
1542    $NavLink6a =
1543qq~$tabsep<span class="selected"><a href="$boardurl/YaBB.$yyext?action=login" style="color: #f33; padding:0" class="selected">$tabfill Login $tabfill</a></span>$tabsep&nbsp;~;
1544
1545    $ConvDone = q~
1546            <div class="divvary_m">&nbsp;</div>
1547            <div class="divvary2">100 %</div><br />
1548            ~;
1549
1550    $ConvNotDone = q~
1551            <div class="divouter">&nbsp;</div>
1552            <div class="divvary3">0 %</div><br />
1553            ~;
1554    return;
1555}
1556
1557sub setup_fatal_error {
1558    my ( $e, $v ) = @_;
1559    $e .= "\n";
1560    if ($v) { $e .= $! . "\n"; }
1561
1562    $yymenu = q~Boards &amp; Categories | ~;
1563    $yymenu .= q~Members | ~;
1564    $yymenu .= q~Messages | ~;
1565    $yymenu .= q~Clean Up | ~;
1566    $yymenu .= q~Login~;
1567
1568    $yymain .= qq~
1569    <table class="bordercolor cs_thin pad_4px" style="width:80%">
1570        <tr>
1571            <td class="titlebg text1"><b>An Error Has Occurred!</b></td>
1572        </tr><tr>
1573            <td class="windowbg text1"><br />$e<br /><br /></td>
1574        </tr>
1575    </table>
1576    <p class="center"><a href="javascript:history.go(-1)">Back</a></p>
1577      ~;
1578    $yyim    = 'YaBB 2.6.11 Convertor Error.';
1579    $yytitle = 'YaBB 2.6.11 Convertor Error.';
1580
1581    if ( !-e "$vardir/Settings.pm" ) { SimpleOutput(); }
1582
1583    tempstarter();
1584    SetupTemplate();
1585    return;
1586}
1587
1588sub SimpleOutput {
1589    $gzcomp = 0;
1590    print_output_header();
1591
1592    print qq~
1593<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1594<html xmlns="http://www.w3.org/1999/xhtml">
1595<head>
1596<title>YaBB 2.6.11 Setup</title>
1597<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1598</head>
1599<body>
1600
1601<!-- Main Content -->
1602<div style="height: 40px;">&nbsp;</div>
1603<div style="text-align:center">$yymain</div>
1604</body>
1605</html>
1606      ~ or croak 'cannot print output screen';
1607    exit;
1608}
1609
1610sub SetupTemplate {
1611    $gzcomp = fileno $GZIP ? 1 : 0;
1612    print_output_header();
1613
1614    $yyposition = $yytitle;
1615    $yytitle    = "$mbname - $yytitle";
1616
1617    $yyimages        = $imagesdir;
1618    $yydefaultimages = $defaultimagesdir;
1619    $yystyle =
1620qq~<link rel="stylesheet" href="$yyhtml_root/Templates/Forum/$usestyle.css" type="text/css" />\n<link rel="stylesheet" href="$yyhtml_root/Templates/Forum/setup.css" type="text/css" />\n ~;
1621    $yystyle =~ s/$usestyle\///gxsm;
1622
1623    $yytemplate = "$templatesdir/$usehead/$usehead.html";
1624    fopen( TEMPLATE, "$yytemplate" )
1625      or setup_fatal_error( "$maintext_23 $yytemplate: ", 1 );
1626    @yytemplate = <TEMPLATE>;
1627    fclose(TEMPLATE);
1628
1629    my $output = q{};
1630    $yyboardname = $mbname;
1631    @months      = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
1632    my (
1633        $newsecond, $newminute,  $newhour,    $newday, $newmonth,
1634        $newyear,   $newweekday, $newyearday, $newoff
1635    ) = localtime($date);
1636    $newyear += 1900;
1637    $newminute = sprintf '%02d', $newminute;
1638    $newsecond = sprintf '%02d', $newsecond;
1639    $yytime =
1640qq~$months[$newmonth] $newday, $newyear $maintxt{'107'} $newhour:$newminute~;
1641
1642    #     $yytime = timeformat( $date, 1 );
1643    $yyuname =
1644      $iamguest
1645      ? q{}
1646      : qq~$maintxt{'247'} ${$uid.$username}{'realname'}, ~;
1647
1648    if ($enable_news) {
1649        fopen( NEWS, "$vardir/news.txt" );
1650        @newsmessages = <NEWS>;
1651        fclose(NEWS);
1652    }
1653    for my $i ( 0 .. ( @yytemplate - 1 ) ) {
1654        $curline = $yytemplate[$i];
1655        if ( !$yycopyin && $curline =~ m/{yabb\ copyright}/xsm ) {
1656            $yycopyin = 1;
1657        }
1658        if ( $curline =~ m/{yabb\ newstitle}/xsm && $enable_news ) {
1659            $yynewstitle = qq~<b>$maintxt{'102'}:</b> ~;
1660        }
1661        if ( $curline =~ m/{yabb\ news}/xsm && $enable_news ) {
1662            srand;
1663            if ( $shownewsfader == 1 ) {
1664
1665                $fadedelay = ( $maxsteps * $stepdelay );
1666                $yynews .= qq~
1667                    <script type="text/javascript">
1668                        var maxsteps = "$maxsteps";
1669                        var stepdelay = "$stepdelay";
1670                        var fadelinks = $fadelinks;
1671                        var delay = "$fadedelay";
1672                        var bcolor = "$color{'faderbg'}";
1673                        var tcolor = "$color{'fadertext'}";
1674                        var fcontent = new Array();
1675                        var begintag = "";
1676                    ~;
1677                fopen( NEWS, "$vardir/news.txt" );
1678                @newsmessages = <NEWS>;
1679                fclose(NEWS);
1680                for my $j ( 0 .. ( @newsmessages - 1 ) ) {
1681                    $newsmessages[$j] =~ s/\n|\r//gxsm;
1682                    if ( $newsmessages[$j] eq q{} ) { next; }
1683                    if ( $i != 0 ) { $yymain .= qq~\n~; }
1684                    $message = $newsmessages[$j];
1685                    if ($enable_ubbc) {
1686                        enable_yabbc();
1687                        DoUBBC();
1688                    }
1689                    $message =~ s/"/\\"/gxsm;
1690                    $yynews .= qq~
1691                                    fcontent[$j] = "$message";\n
1692                              ~;
1693                }
1694                $yynews .= q~
1695                            var closetag = '';
1696                        </script>
1697                        ~;
1698            }
1699            else {
1700                $message = $newsmessages[ int rand @newsmessages ];
1701                if ($enable_ubbc) {
1702                    enable_yabbc();
1703                    DoUBBC();
1704                }
1705                $message =~ s/\'/&#39;/xsm;
1706                $yynews = qq~
1707            <script type="text/javascript">
1708                if (ie4 || DOM2) var news = '$message';
1709                var div = document.getElementById("newsdiv");
1710                div.innerHTML = news;
1711            </script>~;
1712            }
1713        }
1714        $yyurl = $scripturl;
1715        $curline =~ s/{yabb\s+(\w+)}/${"yy$1"}/gxsm;
1716        $curline =~ s/<yabb\s+(\w+)>/${"yy$1"}/gxsm;
1717        $curline =~ s/img src\=\"$imagesdir\/(.+?)\"/SetupImgLoc($1)/eisgm;  #";
1718        $output .= $curline;
1719    }
1720    if ( $yycopyin == 0 ) {
1721        $output =
1722q~<h1 style="text-align:center"><b>Sorry, the copyright tag &#123;yabb copyright&#125; must be in the template.<br />Please notify this forum&#39;s administrator that this site is using an ILLEGAL copy of YaBB!</b></h1>~;
1723    }
1724    if ( fileno $GZIP ) {
1725        $OUTPUT_AUTOFLUSH = 1;
1726        print {$GZIP} $output or croak 'cannot print compressed page';
1727        close $GZIP or croak 'cannot close GZIP';
1728    }
1729    else {
1730        $mycopy = qq~2000-$newyear~;
1731        $output =~ s/2000-1900/$mycopy/xsm;
1732        print $output or croak 'cannot print page';
1733    }
1734    exit;
1735}
1736
1737sub nicely_aligned_file {
1738    $filler = q{ } x 50;
1739
1740    # Make files look nicely aligned. The comment starts after 50 Col
1741
1742    my $setfile = shift;
1743    $setfile =~ s/=\s+;/= 0;/gsm;
1744    $setfile =~
1745s/(.+;)[ \t]+(#.+$)/ $1 . substr($filler,(length $1 < 50 ? length $1 : 49)) . $2 /gem;
1746    $setfile =~ s/\t+(#.+$)/$filler$1/gsm;
1747
1748    *cut_comment = sub {    # line break of too long comments
1749        my @x = @_;
1750        my ( $comment, $length ) =
1751          ( q{}, 120 );     # 120 Col is the max width of page
1752        my $var_length = length $x[0];
1753        while ( $length < $var_length ) { $length += 120; }
1754        foreach ( split / +/sm, $x[1] ) {
1755            if ( ( $var_length + length($comment) + length $_ ) > $length ) {
1756                $comment =~ s/ $//sm;
1757                $comment .= "\n$filler#  $_ ";
1758                $length += 120;
1759            }
1760            else { $comment .= "$_ "; }
1761        }
1762        $comment =~ s/ $//sm;
1763        return $comment;
1764    };
1765    $setfile =~ s/(.+)(#.+$)/ $1 . cut_comment($1,$2) /gem;
1766    return $setfile;
1767}
1768
17691;
1770