root/dev/common/admin_sync.php @ 38

Revision 38, 4.8 KB (checked in by exi, 14 years ago)

Changed alliance pictures to work like the corp-ones (eg: upload ALLIANCE_ID.jpg to img/alliances/)
Fixed Security Issue in Server Synchronization

Line 
1<?php
2require_once("db.php");
3require_once("class.page.php");
4require_once("class.contract.php");
5require_once("admin_menu.php");
6
7$page = new Page();
8$page->setAdmin();
9$page->setTitle("Administration - Synchronization");
10
11if ($_REQUEST['do'] == "sync")
12{
13    $do_sync = true;
14}
15
16if ($do_sync)
17{
18    $qry = new DBQuery();
19    $qry->execute("select plt_name, plt_externalid from kb3_pilots where plt_externalid != 0");
20    while ($data = $qry->getRow())
21    {
22        $content_file .= '!'.$data['plt_name'].'|'.$data['plt_externalid'].'-';
23        //$data_array[$data['plt_name']] = $data['plt_externalid'];
24    }
25
26    $url = parse_url(KB_SYNCURL);
27    //$url = parse_url('http://exi.ath.cx/eve/?a=sync_server');
28    $fp = fsockopen($url["host"], 80, $errno, $errstr, 15);
29    if (!$fp)
30    {
31        $html .= "Error occured with fsockopen: $errstr ($errno)<br>\n";
32    }
33}
34if ($do_sync && $fp)
35{
36    $content_type = 'text/plain';
37    $boundary = "-----".substr(md5(rand(0,32000)),0,10);
38    $content_file = gzdeflate(&$content_file);
39
40    $header = "POST {$url['path']}?{$url['query']} HTTP/1.0\r\n".
41                      "User-Agent: EVE-KB SYNC (VER ".KB_VERSION.")\r\n".
42                      "Host: {$url['host']}\r\n".
43                      "Content-Type: multipart/form-data, boundary=$boundary\r\n".
44                      "Connection: close\r\n";
45    $data .="--$boundary\r\n";
46    $data .="Content-Disposition: form-data; name=\"data\"; filename=\"upload_".rand(0,01000).".txt\"\r\n";
47    $data .= "Content-Type: $content_type\r\n\r\n";
48    $data .= $content_file."\r\n";
49    $data .="--$boundary\r\n";
50    $header .= "Content-Length: " . strlen(&$data) . "\r\n\r\n";
51
52    // send data
53    fputs($fp, $header.$data);
54    $sended = strlen(&$header)+strlen(&$data);
55
56    // wait for response
57    $header = true;
58    while ($line = fgets($fp, 4096))
59    {
60        if ($header)
61        {
62            $http_header .= $line;
63            if (strstr($line, 'X-KBVersion:'))
64            {
65                $tmp = explode(':', $line);
66                $version = explode('.', trim($tmp[1]));
67            }
68        }
69        else
70        {
71            $file .= $line;
72        }
73        if ($line == "\r\n")
74        {
75            $header = 0;
76        }
77    }
78    $recv = strlen(&$http_header)+strlen(&$file);
79
80    // the response ($file) contains ids new to us
81    // we get a $_FILES, process
82    $data = @gzinflate(&$file);
83    if ($data == false)
84    {
85        $html .= "getting compressed data failed, server response was:<br><pre>\n";
86        $html .= $file."</pre>\n";
87    }
88    else
89    {
90        unset($file);
91
92        // get all names we'll find
93        preg_match_all("^!(.*?)\|(.*?)-^", &$data, $matches);
94        unset($data);
95        $results = count($matches[1]);
96        $update = new DBQuery();
97        for ($i = 0; $i<$results; $i++)
98        {
99            $update->execute("update kb3_pilots set plt_externalid='".$matches[2][$i]."' where plt_name='".addslashes($matches[1][$i])."' limit 1");
100        }
101        $html .= "Synchronization complete, got $results new ids from server running version ".$version[0].'.'.$version[1].'.'.$version[2].'.<br>';
102        $html .= "Sent ".round($sended/1024, 2)." kB and received ".round($recv/1024, 2)." kB of data.<br>\n";
103        $html .= '<a href="?a=admin_sync">Back</a>';
104
105        // check for updates here
106        // we might move this to a new/second point some time
107        $ownversion = explode('.', KB_VERSION);
108        if ($version[1] > $ownversion[1] && $version[1] % 2 == 1)
109        {
110            // test vor new minor updates below the dev-version
111            if ($version[1]-1 > $ownversion[1])
112            {
113                $upgrade = true;
114            }
115        }
116        elseif ($version[1] > $ownversion[1] && $version[1] % 2 == 0)
117        {
118            // we get here in case there is a new minor version thats not a dev
119            $upgrade = true;
120        }
121        if ($version[0] > $ownversion[0] || $upgrade)
122        {
123            $html .= "Looks like your Killboard version is pretty old, perhaps you want to upgrade it ?<br>\n";
124            $html .= "Check the <a href='http://www.eve-dev.net/forums/viewforum.php?f=2'>EVE-Dev Forums</a> for new releases and additional information<br>\n";
125        }
126    }
127}
128else
129{
130    $html .= 'You can synchronize your external characterids for the portrait generation with the EVE-Dev.org-Server here.<br>';
131    $html .= 'Your Server will try to contact <i>"'.KB_SYNCURL.'"</i> to exchange the data.<br>';
132    $html .= 'One synchronization every one or two weeks should be enough.<br>';
133    $html .= 'Please don\'t abuse this free service!<br>';
134    $html .= '<a href="?a=admin_sync&do=sync">Synchronize now</a>';
135}
136$page->addContext($menubox->generate());
137$page->setContent($html);
138$page->generate();
139?>
Note: See TracBrowser for help on using the browser.