1#!/usr/bin/perl
2#
3# Script to convert older Licq configuration to the new one
4#
5#
6
7use strict;
8use IO::Handle;
9
10STDOUT->autoflush(1);
11my $date;
12my $subject;
13my $content;
14my $dir;
15my $owner_name;
16my $from_name;
17my $to_name;
18my $timestamp;
19my $subcmd;
20my $cmd;
21
22my $uin;
23my $USER_HISTORY;
24my $USER_INFO;
25my $USER_LIST;
26my $USER_OUTPUT;
27
28my %month =
29("Jan",1,"Feb",2,"Mar",3,"Apr",4,"May",5,"Jun",6,
30 "Jul",7,"Aug",8,"Sep",9,"Oct",10,"Nov",11,"Dec",12 );
31
32# Check user's version to avoid problems - implamented by security@solarweb.com
33#my $version = `licq -h|head -1|awk '{print \$3}'`;
34#chop($version) if $version =~ /\n$/;
35#
36#if ($version >= 0.71)
37#{
38#  print "ERROR - incorrect version\n";;
39#  print "[This script was not meant for your Licq version ($version)]\n";
40#  exit 1;
41#}
42
43$USER_LIST = "$ENV{'HOME'}/.licq/users.conf";
44open (LIST, $USER_LIST) ||
45  die "Fatal error: Unable to open '$USER_LIST', exiting.\n";
46
47print "Updating history files.\n";
48
49# Fetch the owner's name
50$USER_INFO = "$ENV{'HOME'}/.licq/owner.uin";
51$owner_name = `grep Alias $USER_INFO`;
52chop($owner_name);
53$owner_name =~ s/Alias =//;
54$owner_name =~ s/^ *//;
55$owner_name =~ s/ *$//;
56
57# Read in the number of users, which we ignore
58<LIST>;
59<LIST>;
60while (<LIST>)
61{
62  chop;
63  if (!/User.*= /) { next; }
64  $uin = $_;
65  $uin =~ s/User.*= //;
66  $USER_HISTORY = "$ENV{'HOME'}/.licq/history/$uin.history";
67  $USER_OUTPUT = "$ENV{'HOME'}/.licq/history/$uin.history.new";
68  $USER_INFO = "$ENV{'HOME'}/.licq/users/$uin.uin";
69  process_newheader();
70  process_newbody();
71}
72
73# Process the owner's history file
74$USER_HISTORY = "$ENV{'HOME'}/.licq/history/owner.history";
75$USER_OUTPUT = "$ENV{'HOME'}/.licq/history/owner.history.new";
76$USER_INFO = "$ENV{'HOME'}/.licq/owner.uin";
77process_newheader();
78process_newbody();
79
80
81sub process_newheader
82{
83  if (!open (HISTORY, $USER_HISTORY))
84    { print "unable to open '$USER_HISTORY', skipping.\n"; next; }
85  open (OUTPUT, ">$USER_OUTPUT") ||
86    die "Fatal error: Unable to open '$USER_OUTPUT' for writing.\n";
87
88  $content = "";
89  $dir = "?";
90  while(<HISTORY>)
91  {
92    chop;
93    if (/.*\-\>.*\(.{13}:.*\): /)
94    {
95      print_msg();
96      $from_name = $_;
97      $from_name =~ s/ \-\>.*//;
98
99      if ($from_name eq $owner_name)
100      {
101        $dir = "S";
102      }
103
104      $to_name = $_;
105      $to_name =~ s/^.*\-\> //;
106      $to_name =~ s/ \({1}?.*//;
107
108      if ($to_name eq $owner_name)
109      {
110        $dir = "R";
111      }
112
113      #if ($dir eq "?")
114      #{
115      #  printf "Unknown dir: From: |$from_name| To: |$to_name| Owner: |$owner_name|\n";
116      #}
117
118      $date = $_;
119      $date =~ s/^.*\(//;
120      $date =~ s/\).*//;
121      if (length($date) == 16)
122      {
123        $date = "$date 1999";
124      }
125
126      $subject = $_;
127      $subject =~ s/.*: //;
128    }
129    elsif (/.* from .* received ... ... .. ..:.. 199.:/ ||
130           /.* from .* received ... ... .. ..:.. 200.:/)
131    {
132      print_msg();
133      $dir = "R";
134
135      $subject = $_;
136      $subject =~ s/ from.*//;
137
138      $date = $_;
139      $date =~ s/.* from .* received //;
140      chop($date);
141    }
142    elsif (/.* from .* sent ... ... .. ..:.. 199.:/ ||
143           /.* from .* sent ... ... .. ..:.. 200.:/)
144    {
145      print_msg();
146
147      $dir = "S";
148
149      $subject = $_;
150      $subject =~ s/ from.*//;
151
152      $date = $_;
153      $date =~ s/.* from .* sent //;
154      chop($date);
155    }
156    else
157    {
158      $content = $content.":".$_."\n";
159    }
160
161  }
162  close(HISTORY);
163  close(OUTPUT);
164  `mv -f $USER_OUTPUT $USER_HISTORY`;
165}
166
167sub print_msg
168{
169  if ($content eq "") { return; }
170  subject_to_cmd();
171  date_to_timestamp();
172
173  printf OUTPUT "[ %s | %s | %s | 0000 | %ld ]\n%s\n",
174         $dir, $subcmd, $cmd, $timestamp, $content;
175  $content ="";
176  $dir = "?";
177}
178
179sub date_to_timestamp
180{
181  #$timestamp = `date --date '$date' +\%s`;
182   my ($dw,$m,$d,$h,$min,$y) =
183      ($date =~ /(\w{3}) (\w{3})\s+(\d+) (\d+):(\d+) (\d+)/ );
184  $timestamp = timelocal( 0, $min, $h, $d, $month{$m}-1, $y-1900 );
185
186}
187
188sub subject_to_cmd
189{
190  if ($subject =~ /Message/i)
191  {
192    $subcmd = "0001";
193    $cmd = "2030";
194  }
195  elsif ($subject =~ /URL/i)
196  {
197    $subcmd = "0004";
198    $cmd = "2030";
199  }
200  elsif ($subject =~ /Chat Request Cancel/i)
201  {
202    $subcmd = "0002";
203    $cmd = "2000";
204  }
205  elsif ($subject =~ /Chat Request/i)
206  {
207    $subcmd = "0002";
208    $cmd = "2030";
209  }
210  elsif ($subject =~ /File Transfer Cancel/i)
211  {
212    $subcmd = "0003";
213    $cmd = "2000";
214  }
215  elsif ($subject =~ /File Transfer/i)
216  {
217    $subcmd = "0003";
218    $cmd = "2030";
219  }
220  elsif ($subject =~ /Added to contact list/i)
221  {
222    $subcmd = "0012";
223    $cmd = "0260";
224  }
225  elsif ($subject =~ /Authorization request/i)
226  {
227    $subcmd = "0006";
228    $cmd = "0260";
229  }
230  elsif ($subject =~ /Web Panel/i)
231  {
232    $subcmd = "0013";
233    $cmd = "0260";
234  }
235  elsif ($subject =~ /Email Pager/i)
236  {
237    $subcmd = "0014";
238    $cmd = "0260";
239  }
240  elsif ($subject =~ /Contact List/i)
241  {
242    $subcmd = "0019";
243    $cmd = "0260";
244  }
245  else
246  {
247    $subcmd = "0000";
248    $cmd = "0000";
249  }
250
251}
252
253
254
255sub process_newbody
256{
257  if (!open (HISTORY, $USER_HISTORY))
258    { print "unable to open '$USER_HISTORY', skipping.\n"; next; }
259  open (OUTPUT, ">$USER_OUTPUT") ||
260    die "Fatal error: Unable to open '$USER_OUTPUT' for writing.\n";
261
262  while(<HISTORY>)
263  {
264    if (/^\[/) { last; }
265  }
266
267  while(/^\[/)
268  {
269    chop;
270    s/\?/R/;
271    $cmd = $_;
272    $cmd =~ s/\[ . \| //;
273    $cmd =~ s/ \| .... \| .... \| [0123456789]* \]//;
274    $subcmd = $_;
275    $subcmd =~ s/\[ . \| .... \| //;
276    $subcmd =~ s/ \| .... \| [0123456789]* \]//;
277
278    # Message
279    if ($cmd =~ /0001/)
280    {
281      printf OUTPUT "\n$_\n";
282      while(<HISTORY>)
283      {
284        if (/^\[/) { last; }
285        if (/^:/) { printf OUTPUT "$_"; }
286      }
287      next;
288    }
289    # Chat
290    elsif ($cmd =~ /0002/)
291    {
292      printf OUTPUT "\n$_\n";
293      # Cancelled
294      if ($subcmd =~ /2000/)
295      {
296        printf OUTPUT "\n\n";
297        while (<HISTORY>)
298        {
299          if (/^\[/) { last; }
300        }
301        next;
302      }
303      $_ = <HISTORY>;
304      #if (/cancelled/g)
305      #{
306      #  printf OUTPUT "\n";
307      #  while (<HISTORY>)
308      #  {
309      #    if (/^\[/) { next; }
310      #  }
311      #  last;
312      #}
313      # Request
314      if (/^:Reason:/)
315      {
316        s/Reason: //;
317        printf OUTPUT "$_";
318        while (<HISTORY>)
319        {
320          if (/^\[/) { last; }
321          if (/^:/) { printf OUTPUT "$_"; }
322        }
323        next;
324      }
325      elsif (/^:Chat .equest/)
326      {
327        while (<HISTORY>)
328        {
329          if (/^\[/) { last; }
330          if (/^:/) { printf OUTPUT "$_"; }
331        }
332        next;
333      }
334      else
335      {
336        printf OUTPUT "$_";
337        while (<HISTORY>)
338        {
339          if (/^\[/) { last; }
340          if (/^:/) { printf OUTPUT "$_"; }
341        }
342        next;
343      }
344    }
345    # File transter
346    elsif ($cmd =~ /0003/)
347    {
348      printf OUTPUT "\n$_\n";
349      # Cancelled
350      if ($subcmd =~ /2000/)
351      {
352        printf OUTPUT "\n";
353        while (<HISTORY>)
354        {
355          if (/^\[/) { last; }
356        }
357        next;
358      }
359      $_ = <HISTORY>;
360      if (/cancelled/g)
361      {
362        printf OUTPUT ":\n:0\n:\n\n";
363        while (<HISTORY>)
364        {
365          if (/^\[/) { last; }
366        }
367        next;
368      }
369      # Request
370      if (/^:File:/)
371      {
372        my $name = $_;
373        $name =~ s/^:File: //;
374        $name =~ s/ \(.*\).*//;
375        my $size = $_;
376        $size =~ s/.*\(//;
377        $size =~ s/\).*//;
378        $size =~ s/ bytes//;
379        printf OUTPUT ":$name:$size";
380        $_ = <HISTORY>;
381        s/Description: //;
382        printf OUTPUT "$_";
383        while (<HISTORY>)
384        {
385          if (/^\[/) { last; }
386          if (/^:/) { printf OUTPUT "$_"; }
387        }
388        next;
389      }
390      elsif (/^:Name: /)
391      {
392        my $name = $_;
393        $name =~ s/Name: //;
394        printf OUTPUT "$name";
395        $_ = <HISTORY>;
396        my $size = $_;
397        $size =~ s/Size: //;
398        printf OUTPUT "$size";
399        $_ = <HISTORY>;
400        while (<HISTORY>)
401        {
402          if (/^\[/) { last; }
403          if (/^:/) { printf OUTPUT "$_"; }
404        }
405        next;
406      }
407      else
408      {
409        printf OUTPUT ":\n:0\n:\n\n";
410        while (<HISTORY>)
411        {
412          if (/^\[/) { last; }
413        }
414        next;
415      }
416    }
417    # URL
418    elsif ($cmd =~ /0004/)
419    {
420      printf OUTPUT "\n$_\n";
421      $_ = <HISTORY>;
422      if (/^:URL:/)
423      {
424        s/URL: //;
425        printf OUTPUT "$_";
426        $_ = <HISTORY>;
427        if (/^:Description: /)
428        {
429          s/Description: //;
430          printf OUTPUT "$_";
431        }
432      }
433      else
434      {
435        printf OUTPUT "$_:\n";
436      }
437      while (<HISTORY>)
438      {
439        if (/^\[/) { last; }
440        if (/^:/) { printf OUTPUT "$_"; }
441      }
442      next;
443    }
444    # Auth Request
445    elsif ($cmd =~ /0006/)
446    {
447      printf OUTPUT "\n$_\n";
448      $_ = <HISTORY>;
449      if (/^:\(/)
450      {
451        s/.*from //;
452        s/:.*//;
453        print OUTPUT ":$_";
454        $_ = <HISTORY>;
455        print OUTPUT "$_";
456        $_ = <HISTORY>;
457        print OUTPUT "$_";
458        $_ = <HISTORY>;
459        print OUTPUT "$_";
460        $_ = <HISTORY>;
461        print OUTPUT "$_";
462        <HISTORY>;
463      }
464      elsif (/requests authorization/)
465      {
466        my $uin = $_;
467        $uin =~ s/, requests.*//;
468        $uin =~ s/.*uin //;
469        my $alias = $_;
470        $alias =~ s/ \(.*//;
471        my $fname = $_;
472        $fname =~ s/.*\(//;
473        $fname =~ s/ .*\),.*//;
474        my $lname = $_;
475        $lname =~ s/, .*//;
476        $lname =~ s/.*\(.* //;
477        my $email = $_;
478        $email =~ s/\), .*//;
479        $email =~ s/.*, //;
480        printf OUTPUT ":$uin\n:$alias\n:$fname\n:$lname\n:$email\n";
481      }
482      else
483      {
484        printf OUTPUT ":0\n:ALIAS\n:FNAME\n:LNAME\n:EMAIL\n";
485      }
486      while (<HISTORY>)
487      {
488        if (/^\[/) { last; }
489        if (/^:/) { printf OUTPUT "$_"; }
490      }
491      next;
492    }
493    # Added to list
494    elsif ($cmd =~ /0012/)
495    {
496      printf OUTPUT "\n$_\n";
497      $_ = <HISTORY>;
498      if (/^:\(/)
499      {
500        my $uin = $_;
501        $uin =~ s/.* user //;
502        $uin =~ s/ \(.*//;
503        my $alias = $_;
504        $alias =~ s/.*user [0123456789]* \(//;
505        $alias =~ s/, .*//;
506        my $fname = $_;
507        $fname =~ s/.*user [0123456789]* \(//;
508        $fname =~ s/\).*//;
509        $fname =~ s/.*?, //;
510        $fname =~ s/ .*//;
511        my $lname = $_;
512        $lname =~ s/.*user [0123456789]* \(//;
513        $lname =~ s/\).*//;
514        $lname =~ s/.*?, //;
515        $lname =~ s/, .*//;
516        $lname =~ s/.* //;
517        my $email = $_;
518        $email =~ s/.*user [0123456789]* \(.*, //;
519        $email =~ s/\).*//;
520        printf OUTPUT ":$uin:$alias:$fname:$lname:$email\n";
521      }
522      elsif (/uin [0123456789]*, added you to their/)
523      {
524        my $uin = $_;
525        $uin =~ s/, added.*//;
526        $uin =~ s/.*uin //;
527        my $alias = $_;
528        $alias =~ s/ \(.*//;
529        my $fname = $_;
530        $fname =~ s/.*\(//;
531        $fname =~ s/ .*\),.*//;
532        my $lname = $_;
533        $lname =~ s/, .*//;
534        $lname =~ s/.*\(.* //;
535        my $email = $_;
536        $email =~ s/\), .*//;
537        $email =~ s/.*, //;
538        printf OUTPUT ":$uin$alias:$fname:$lname:$email\n";
539      }
540      else
541      {
542        printf OUTPUT ":0\n:ALIAS\n:FNAME\n:LNAME\n:EMAIL\n\n";
543      }
544      while (<HISTORY>)
545      {
546        if (/^\[/) { last; }
547      }
548    }
549    # Web panel
550    elsif ($cmd =~ /0013/)
551    {
552      printf OUTPUT "\n$_\n";
553      $_ = <HISTORY>;
554      my $name = $_;
555      $name =~ s/Message from //;
556      $name =~ s/ \(.*//;
557      printf OUTPUT "$name";
558      my $email = $_;
559      $email =~ s/.* \(//;
560      $email =~ s/\) .*//;
561      printf OUTPUT ":$email";
562      while (<HISTORY>)
563      {
564        if (/^\[/) { last; }
565        if (/^:/) { printf OUTPUT "$_"; }
566      }
567      next;
568    }
569    # Email pager
570    elsif ($cmd =~ /0014/)
571    {
572      printf OUTPUT "\n$_\n";
573      $_ = <HISTORY>;
574      my $name = $_;
575      $name =~ s/Message from //;
576      $name =~ s/ \(.*//;
577      printf OUTPUT "$name";
578      my $email = $_;
579      $email =~ s/.* \(//;
580      $email =~ s/\) .*//;
581      printf OUTPUT ":$email";
582      while (<HISTORY>)
583      {
584        if (/^\[/) { last; }
585        if (/^:/) { printf OUTPUT "$_"; }
586      }
587      next;
588    }
589    # Contact list
590    elsif ($cmd =~ /0019/)
591    {
592      printf OUTPUT "\n$_\n";
593      <HISTORY>;
594      <HISTORY>;
595      while (<HISTORY>)
596      {
597        if (/^\[/) { last; }
598        my $uin = $_;
599        $uin =~ s/^: *//;
600        $uin =~ s/ .*//;
601        my $alias = $_;
602        $alias =~ s/^: *[0123456789]* //;
603        printf OUTPUT ":$uin\n:$alias";
604      }
605      next;
606    }
607
608    # Something else
609    else
610    {
611      #printf "Unknown sub-command: $cmd\n";
612      while (<HISTORY>)
613      {
614        if (/^\[/) { last; }
615        #printf OUTPUT "$_";
616      }
617      next;
618    }
619
620  }
621  close(HISTORY);
622  close(OUTPUT);
623  `mv -f $USER_OUTPUT $USER_HISTORY`;
624}
625