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