WordPress.org

Make WordPress Core

Ticket #16509: installer.php

File installer.php, 11.2 KB (added by Denis-de-Bernardy, 5 years ago)

Scary script, part2

Line 
1ob_start(); ?>
2
3<?php $serialized = "YTo5OntzOjk6IndvcmRwcmVzcyI7YTo1OntzOjQ6Im5hbWUiO3M6OToiV29yZFByZXNzIjtzOjExOiJkZXNjcmlwdGlvbiI7czo5NjoiQSBzdGF0ZS1vZi10aGUtYXJ0IHB1Ymxpc2hpbmcgcGxhdGZvcm0gd2l0aCBhIGZvY3VzIG9uIGFlc3RoZXRpY3MsIHdlYiBzdGFuZGFyZHMsIGFuZCB1c2FiaWxpdHkuIjtzOjEwOiJ6aXBfc3ViZGlyIjtzOjk6IndvcmRwcmVzcyI7czoxODoiaW5zdGFsbGVyX2xvY2F0aW9uIjtzOjI1OiJ3cC1hZG1pbi9zZXR1cC1jb25maWcucGhwIjtzOjg6ImRvd25sb2FkIjtzOjMxOiJodHRwOi8vd29yZHByZXNzLm9yZy9sYXRlc3QuemlwIjt9czo1OiJjaHlycCI7YTo1OntzOjQ6Im5hbWUiO3M6NToiQ2h5cnAiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjE5NjoiQSBibG9nZ2luZyBlbmdpbmUgZGVzaWduZWQgdG8gYmUgdmVyeSBsaWdodHdlaWdodCB3aGlsZSByZXRhaW5pbmcgZnVuY3Rpb25hbGl0eS4gSXQgaXMgcG93ZXJlZCBieSBQSFAgYW5kIGhhcyB2ZXJ5IHBvd2VyZnVsIHRoZW1lIGFuZCBleHRlbnNpb24gZW5naW5lcywgc28geW91IGNhbiBwZXJzb25hbGl6ZSBpdCBob3dldmVyIHlvdSB3YW50LiI7czoxMDoiemlwX3N1YmRpciI7czoxMDoiY2h5cnBfdjIuMCI7czoxODoiaW5zdGFsbGVyX2xvY2F0aW9uIjtzOjExOiJpbnN0YWxsLnBocCI7czo4OiJkb3dubG9hZCI7czo0MDoiaHR0cDovL2NoeXJwLm5ldC9yZWxlYXNlcy9jaHlycF92Mi4wLnppcCI7fXM6NjoiZHJ1cGFsIjthOjU6e3M6NDoibmFtZSI7czo2OiJEcnVwYWwiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjE0NzoiRXF1aXBwZWQgd2l0aCBhIHBvd2VyZnVsIGJsZW5kIG9mIGZlYXR1cmVzLCBEcnVwYWwgc3VwcG9ydHMgYSB2YXJpZXR5IG9mIHdlYnNpdGVzIHJhbmdpbmcgZnJvbSBwZXJzb25hbCB3ZWJsb2dzIHRvIGxhcmdlIGNvbW11bml0eS1kcml2ZW4gd2Vic2l0ZXMuIjtzOjEwOiJ6aXBfc3ViZGlyIjtzOjY6ImRydXBhbCI7czoxODoiaW5zdGFsbGVyX2xvY2F0aW9uIjtzOjExOiJpbnN0YWxsLnBocCI7czo4OiJkb3dubG9hZCI7czo0MToiaHR0cDovL2RsLmRyb3Bib3guY29tL3UvMjQ2MDk3L2RydXBhbC56aXAiO31zOjc6ImJicHJlc3MiO2E6NTp7czo0OiJuYW1lIjtzOjc6ImJiUHJlc3MiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjE3NzoiRm9ydW0gc29mdHdhcmUgd2l0aCBhIHR3aXN0IGZyb20gdGhlIGNyZWF0b3JzIG9mIFdvcmRQcmVzcy4gYmJQcmVzcyBpcyBmb2N1c2VkIG9uIHdlYiBzdGFuZGFyZHMsIGVhc2Ugb2YgdXNlLCBlYXNlIG9mIGludGVncmF0aW9uLCBhbmQgc3BlZWQsIGFuZCBoYXMgYW4gZXh0ZW5zaXZlIHBsdWdpbiBzeXN0ZW0uIjtzOjEwOiJ6aXBfc3ViZGlyIjtzOjc6ImJicHJlc3MiO3M6MTg6Imluc3RhbGxlcl9sb2NhdGlvbiI7czoyMDoiYmItYWRtaW4vaW5zdGFsbC5waHAiO3M6ODoiZG93bmxvYWQiO3M6Mjk6Imh0dHA6Ly9iYnByZXNzLm9yZy9sYXRlc3QuemlwIjt9czo3OiJ2YW5pbGxhIjthOjU6e3M6NDoibmFtZSI7czo3OiJWYW5pbGxhIjtzOjExOiJkZXNjcmlwdGlvbiI7czoxMTQ6IlZhbmlsbGEgaXMgYW4gb3Blbi1zb3VyY2UsIHN0YW5kYXJkcy1jb21wbGlhbnQsIG11bHRpLWxpbmd1YWwsIHRoZW1lLWFibGUsIHBsdWdnYWJsZSBkaXNjdXNzaW9uIGZvcnVtIGZvciB0aGUgd2ViLiI7czoxMDoiemlwX3N1YmRpciI7czoxNDoidmFuaWxsYS0xLjEuMTAiO3M6MTg6Imluc3RhbGxlcl9sb2NhdGlvbiI7czoxOToic2V0dXAvaW5zdGFsbGVyLnBocCI7czo4OiJkb3dubG9hZCI7czo0OToiaHR0cDovL3ZhbmlsbGFmb3J1bXMub3JnL3VwbG9hZHMvNElBVUpQVjVQVlJXLnppcCI7fXM6NToicGhwYmIiO2E6NTp7czo0OiJuYW1lIjtzOjU6InBocEJCIjtzOjExOiJkZXNjcmlwdGlvbiI7czoyMzM6IlNpbmNlIGl0cyBjcmVhdGlvbiBpbiAyMDAwLCBwaHBCQiBoYXMgYmVjb21lIHRoZSBtb3N0IHdpZGVseSB1c2VkIE9wZW4gU291cmNlIGZvcnVtIHNvbHV0aW9uLiBwaHBCQiBoYXMgYW4gZWFzeSB0byB1c2UgYWRtaW5pc3RyYXRpb24gcGFuZWwgYW5kIGEgdXNlciBmcmllbmRseSBpbnN0YWxsYXRpb24gcHJvY2Vzcywgd2hpY2ggYWxsb3dzIHlvdSB0byBoYXZlIGEgZm9ydW0gc2V0IHVwIGluIG1pbnV0ZXMuIjtzOjEwOiJ6aXBfc3ViZGlyIjtzOjY6InBocEJCMyI7czoxODoiaW5zdGFsbGVyX2xvY2F0aW9uIjtzOjE3OiJpbnN0YWxsL2luZGV4LnBocCI7czo4OiJkb3dubG9hZCI7czo3MzoiaHR0cDovL2QxMHhnNDVvNnA2ZGJsLmNsb3VkZnJvbnQubmV0L3Byb2plY3RzL3AvcGhwYmIvcGhwQkItMy4wLjctUEwxLnppcCI7fXM6Njoiam9vbWxhIjthOjU6e3M6NDoibmFtZSI7czo2OiJKb29tbGEiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjEzMjoiSm9vbWxhIGlzIGFuIGF3YXJkLXdpbm5pbmcgY29udGVudCBtYW5hZ2VtZW50IHN5c3RlbSAoQ01TKSwgd2hpY2ggZW5hYmxlcyB5b3UgdG8gYnVpbGQgV2ViIAkJc2l0ZXMgYW5kIHBvd2VyZnVsIG9ubGluZSBhcHBsaWNhdGlvbnMuIjtzOjEwOiJ6aXBfc3ViZGlyIjtzOjA6IiI7czoxODoiaW5zdGFsbGVyX2xvY2F0aW9uIjtzOjIyOiJpbnN0YWxsYXRpb24vaW5kZXgucGhwIjtzOjg6ImRvd25sb2FkIjtzOjk0OiJodHRwOi8vam9vbWxhY29kZS5vcmcvZ2YvZG93bmxvYWQvZnJzcmVsZWFzZS8xMTM5Ni80NTYxMC9Kb29tbGFfMS41LjE1LVN0YWJsZS1GdWxsX1BhY2thZ2UuemlwIjt9czoxMDoicHJlc3Rhc2hvcCI7YTo1OntzOjQ6Im5hbWUiO3M6MTA6IlByZXN0YVNob3AiO3M6MTE6ImRlc2NyaXB0aW9uIjtzOjE4OToiUHJlc3RhU2hvcCBpcyBhIGZyZWUsIG9wZW4gc291cmNlIGUtY29tbWVyY2Ugc29sdXRpb24uIFByZXN0YVNob3AgZ3VpZGVzIHVzZXJzIHRocm91Z2ggeW91ciBwcm9kdWN0IGNhdGFsb2cgaW50ZWxsaWdlbnRseSBhbmQgZWZmb3J0bGVzc2x5LCB0dXJuaW5nIGludHJpZ3VlZCB2aXNpdG9ycyBpbnRvIHBheWluZyBjdXN0b21lcnMuIjtzOjEwOiJ6aXBfc3ViZGlyIjtzOjEwOiJwcmVzdGFzaG9wIjtzOjE4OiJpbnN0YWxsZXJfbG9jYXRpb24iO3M6ODoiaW5zdGFsbC8iO3M6ODoiZG93bmxvYWQiO3M6NTc6Imh0dHA6Ly93d3cucHJlc3Rhc2hvcC5jb20vZG93bmxvYWQvcHJlc3Rhc2hvcF8xLjIuNS4wLnppcCI7fXM6ODoic3ltcGhvbnkiO2E6NTp7czo0OiJuYW1lIjtzOjg6IlN5bXBob255IjtzOjExOiJkZXNjcmlwdGlvbiI7czozMzc6IlN5bXBob255IGlzIGEgd2ViLWJhc2VkIGNvbnRlbnQgbWFuYWdlbWVudCBzeXN0ZW0gKENNUykgdGhhdCBlbmFibGVzIHVzZXJzIHRvIGNyZWF0ZSBhbmQgbWFuYWdlIHdlYnNpdGVzIGFuZCB3ZWIgYXBwbGljYXRpb25zIG9mIGFsbCBzaGFwZXMgYW5kIHNpemVzLWZyb20gdGhlIHNpbXBsZXN0IG9mIGJsb2dzIHRvIGJ1c3RsaW5nIG5ld3Mgc2l0ZXMgYW5kIGZlYXR1cmUtcGFja2VkIHNvY2lhbCBuZXR3b3Jrcy4gV2l0aCBTeW1waG9ueSwgeW91IGNhbiBidWlsZCBqdXN0IGFib3V0IGFueXRoaW5nLCBhbmQgdGhhdCdzIHdoYXQgc2V0cyBpdCBhcGFydCBmcm9tIG1vc3Qgb3RoZXIgQ01Tcy4iO3M6MTA6InppcF9zdWJkaXIiO3M6MTQ6InN5bXBob255LTIuMC43IjtzOjE4OiJpbnN0YWxsZXJfbG9jYXRpb24iO3M6MTE6Imluc3RhbGwucGhwIjtzOjg6ImRvd25sb2FkIjtzOjk3OiJodHRwOi8vZG93bmxvYWRzLnN5bXBob255LWNtcy5jb20vZ2xvYmFsLWFzc2V0LWRvd25sb2FkL3N5bXBob255LXBhY2thZ2UvMzYwMzAvc3ltcGhvbnktMi4wLjcuemlwIjt9fQ=="; $APPDATA = unserialize(base64_decode($serialized)); ?><?php
4
5function extract_zip($filename)
6{
7    if (class_exists('ZipArchive'))
8    {
9        $zip = new ZipArchive;
10        $result = $zip->open($filename);
11        if ($result === true)
12        {
13            $zip->extractTo('.');
14            $zip->close();
15            return true;
16        }
17        # otherwise, try PCLzip - there are occasionally some issues with ZipArchive::open.
18    }
19
20    # download the PCLzip library
21    $pclziplib = file_get_contents('http://instantinstall.org/lib/pclzip.txt');
22    eval($pclziplib);
23    $zip = new PclZip($filename);
24    if ($zip->extract() == 0)
25    {
26        return $archive->errorName();
27    }
28    else
29    {
30        return true;
31    }
32}
33
34function download_and_extract_zip($appname, $appdata)
35{
36        $zipped = @file_get_contents($appdata['download']);
37    if (!$zipped) {
38        return 'Download error.';
39    }
40    $f = @fopen("$appname.zip", 'w+');
41    if (!is_resource($f)) {
42        return 'Possible permissions error.';
43    }
44    $result = fwrite($f, $zipped);
45    fclose($f);
46    $unzip_result = extract_zip("$appname.zip");
47    unlink("$appname.zip");
48    if ($unzip_result !== true)
49    {
50        return $unzip_result;
51    }
52    else
53    {
54        return true;
55    }
56
57
58}
59
60function analytics_submit($appname)
61{
62        @file_get_contents("http://instantinstall.org/analytics.php?app=$appname");
63}
64
65function config_and_redirect($appname, $appdata)
66{
67    if ($appdata['zip_subdir'] != '')
68    {
69        $subdir = $appdata['zip_subdir'];
70                if (stristr(php_os, 'WIN'))
71                {
72                         // Windows
73                         system("move $subdir/* .");
74                }
75                else
76                {
77                         system("mv $subdir/* .");
78                }
79                system("rmdir $subdir");
80    }
81    @unlink(__FILE__); # ignore any perms errors on this
82    ob_clean(); # get rid of any output
83        analytics_submit($appname);
84    header("Location: {$appdata['installer_location']}");
85}
86?>
87<?php
88$app = $_GET['app'];
89
90if (isset($app) and array_key_exists($app, $APPDATA)) {
91
92    #We do our stuff.
93    $result = download_and_extract_zip($app, $APPDATA[$app]);
94    if ($result !== true)
95    {
96        echo "Error: $result";
97    }
98    else
99    {
100        config_and_redirect($app, $APPDATA[$app]);
101    }
102}
103
104else {
105    ob_end_clean();
106    # Display a nice app selection page.
107?>
108
109<!-- If you're reading this, you need to go outside. -->
110<?php # And if you're reading this, you probably don't know what "outside" means and are wondering what the web address is. ?>
111<!DOCTYPE html>
112<html>
113<head>
114    <title>Instant Install</title>
115    <link href="http://dl.dropbox.com/u/528245/instantinstall.css" type="text/css" rel="stylesheet" />
116    <!--<link href="http://dl.dropbox.com/u/5618764/instantinstall.css" type="text/css" rel="stylesheet" />-->
117</head>
118<body>
119    <div id="page">
120        <h1>Select an Application!</h1>
121            <ul class="apps">
122                <?php foreach($APPDATA as $name => $data) { ?>
123                    <li>
124                        <a href="instantinstall.php?app=<?php echo $name; ?>" class="install">
125                            <img src="http://instantinstall.org/app_images/<?php echo $name; ?>.png" />
126                            <?php echo $data['name']; ?>
127                        </a>
128                        <div class="app-info" style="display:none;">
129                        <p class="description">
130                            <?php echo $data['description']; ?>
131                        </p>
132                        <a href="instantinstall.php?app=<?php echo $name; ?>" class="button">Install <?php echo $data['name']; ?></a>
133                    </div>
134                    </li>
135                <?php } ?>
136            </ul>
137
138        </div><!-- end page -->
139        <p class="footer">
140            Follow us on <a href="http://twitter.com/instantinstall">Twitter</a>
141            |
142            A project by <a href="http://9milesmedia.com">9miles</a>
143        </p>
144        <!--
145        <tea type="earl_grey" sugar="1" milk="false" for="Donald" />
146        <coffee type="latte" sugar="1" milk="why_the_heck_are_you_asking?_it's_a_latte!!!" for="Joel" />
147        <soda type="cream" sugar="..." milk="no, gross." for="Ethan" />
148        <cow type="milk" sugar="false" for="Ben">
149        <tea type="lady_grey" sugar="2" milk="true" for="Josh" />
150        -->
151
152    </div>
153    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
154    <script type="text/javascript">
155        $('a.install').click(function() {
156            if (!$('div#slide-in').length)
157            {
158                $('ul.apps').fadeTo(500, 0.25);
159                appname = $(this).text();
160                installlink = $(this).attr('href');
161                description = $(this).parent().find('.app-info .description').html()
162                applink = ''
163                appimg = $(this).find('img').attr('src');
164                $('body').append('<div id="slide-in" style="visibility:hidden;"></div>');
165                $('div#slide-in').append(' \
166                    <img src="' + appimg + '" /> \
167                    <div class="slide-in-content"> \
168                        <h2> ' + appname + '</h2> \
169                        <div class="description"> \
170                        ' + description + ' \
171                        </div> \
172                        <a href="' + applink + '">Visit the ' + appname + ' website</a> \
173                        <div class="buttons"> \
174                            <a class="button cancel" href="#">Go Back</a> \
175                            <a class="button go" href="' + installlink + '">Install</a> \
176                        </div> \
177                    </div> \
178                ');
179                topslide = -45 - $('div#slide-in').height()
180                $('div#slide-in').css('top', topslide).css('visibility', 'visible');
181                $('div#slide-in').animate({'top': -10 }, 400);
182                $('div#slide-in div.buttons a.cancel').click(function() {
183                    $('ul.apps').fadeTo(500, 1);
184                    $('div#slide-in').animate({'top': -45 - $('div#slide-in').height()}, 500, function()
185                    {
186                        $('div#slide-in').remove();
187                    });
188                })
189                                $('div#slide-in a.go').click(function()
190                                {
191                                        if ($(this).text() == 'Installing...')
192                                        {
193                                                return false;
194                                        }
195                                        $(this).text('Installing...')
196                                        return true;
197                                })
198            }
199            return false;
200        })
201    </script>
202
203</body>
204</html>
205
206<?php } ?>