source: trunk/www/ports.php @ 145724

Last change on this file since 145724 was 104212, checked in by wsiegrist@…, 6 years ago

Protect against XSS

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-php
File size: 13.1 KB
RevLine 
[17249]1<?php
[48228]2    /* -*- coding: utf-8; mode: php; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:set fenc=utf-8 filetype=php et sw=4 ts=4 sts=4: */
[31374]3    /* Web client to the PortIndex2MySQL script located in MacPorts base/portmgr/jobs svn directory. */
[28903]4    /* $Id: ports.php 104212 2013-03-20 20:35:59Z wsiegrist@apple.com $ */
[30431]5    /* Copyright (c) 2004, OpenDarwin. */
6    /* Copyright (c) 2004-2007, The MacPorts Project. */
[35131]7   
[43661]8    include_once("includes/common.inc");
[35168]9   
[31983]10    $portsdb_info = portsdb_connect($portsdb_host, $portsdb_user, $portsdb_passwd);
[35220]11    $sql = "SELECT UNIX_TIMESTAMP(activity_time) FROM $portsdb_name.log ORDER BY UNIX_TIMESTAMP(activity_time) DESC";
[31566]12    $result = mysql_query($sql);
13    if ($result && $row = mysql_fetch_row($result)) {
14        $date = date('Y-m-d', $row[0]);
[34244]15        $time = date('H:i:s e', $row[0]);
[35131]16    } else {
17        $date = '(unknown)';
18        $time = '(unknown)';
[31566]19    }
[35168]20    $by = isset($_GET['by']) ? $_GET['by'] : '';
21    $substr = isset($_GET['substr']) ? $_GET['substr'] : '';
[97681]22    $page = isset($_GET['page']) ? max(intval($_GET['page']), 1) : '1';
23    $pagesize = isset($_GET['pagesize']) ? max(intval($_GET['pagesize']), 1) : 50; # arbitrary setting
[35222]24
[104212]25    # protect against XSS
26    $phpself = htmlspecialchars($_SERVER['PHP_SELF']);
27
[35222]28    print_header('The MacPorts Project -- Available Ports', 'utf-8');
[28903]29?>
[35131]30
31<div id="content">
32
33    <h2 class="hdr">MacPorts Portfiles</h2>
34
[32237]35    <p>The MacPorts Project currently distributes <b><?php print $portsdb_info['num_ports']; ?></b> ports, organized across
36    <?php print $portsdb_info['num_categories']; ?> different categories and available below for viewing. This form allows
[35131]37    you to search the MacPorts software index, last updated on <?php print '<b>' . $date . '</b> at <b>' . $time . '</b>'; ?>.
[32237]38    </p>
39   
[31574]40    <br />
[31573]41
[104212]42    <form action="<?php print $phpself; ?>" method="get">
[31573]43        <p>
44            <label>Search by:</label>
45            <select name="by">
[35214]46                <option value="name"<?php if ($by == 'name') { print ' selected="selected"'; } ?>>Software Title</option>
47                <option value="category"<?php if ($by == 'category') { print ' selected="selected"'; } ?>>Category</option>
48                <option value="maintainer"<?php if ($by == 'maintainer') { print ' selected="selected"'; } ?>>Maintainer</option>
49<!--                <option value="library"<?php if ($by == 'dependency') { print ' selected="selected"'; } ?>>Dependency</option> -->
50                <option value="variant"<?php if ($by == 'variant') { print ' selected="selected"'; } ?>>Variant</option>
51                <option value="platform"<?php if ($by == 'platform') { print ' selected="selected"'; } ?>>Platform</option>
[56622]52<!--                <option value="license"<?php if ($by == 'license') { print ' selected="selected"'; } ?>>License</option> -->
[31573]53            </select>
[100022]54            <input type="text" name="substr" value="<?php print htmlspecialchars($substr); ?>" size="40" />
[31580]55            <input type="submit" value="Search" />
[31573]56        </p>
[31563]57    </form>
[31566]58
[104212]59    <p>Or view the complete <a href="<?php print $phpself; ?>?by=all">ports list (<?php print $portsdb_info['num_ports']; ?>
[31583]60    ports)</a>.</p>
[31580]61    <br />
[31566]62
[28903]63<?php
[35214]64    /* If no valid search criteria is specified (by set and not equal to all and a valid substring) we output port categories
65     as possible searches */
66    if (!$by || ($by != 'all' && !$substr)) {
[35220]67        $query = "SELECT DISTINCT category FROM $portsdb_name.categories ORDER BY category";
[31572]68        $result = mysql_query($query);
69        if ($result) {
[35130]70            $max_entries_per_column = floor($portsdb_info['num_categories']/4);
71            $columns = 0;
[35214]72            print '<h3>Port Categories</h3><div id="categories"><ul>';
[35130]73            while ($columns < 4) {
[100015]74                $entries_per_column = 0;
[35214]75                print '<li><ul>';
[35130]76                while ($row = mysql_fetch_assoc($result)) {
[104212]77                    print "<li><a href=\"$phpself?by=category&amp;substr=" . urlencode($row['category']) . '">'
[35130]78                    . htmlspecialchars($row['category']) . '</a></li>';
[100015]79                    if ($entries_per_column == $max_entries_per_column) break;
80                    $entries_per_column++;
[35130]81                }
[35214]82                print '</ul></li>';
[35130]83                $columns++;
84            }
[35214]85            print '</ul></div>';
[31566]86        }
[31572]87    }
[3987]88
[35214]89    /* If valid criteria is specified (by set and a valid substring, or by set to all) we poll the db and display the results */
90    if ($by && ($substr || $by == 'all')) {
91        $fields = 'name, path, version, description';
[35219]92        $tables = "$portsdb_name.portfiles AS p";
93        switch ($by) {
94        case 'name':
[35220]95            $criteria = "p.name LIKE '%" . mysql_real_escape_string($substr) . "%'";
[35219]96            break;
97        case 'category':
98            $tables .= ", $portsdb_name.categories AS c";
[35220]99            $criteria = "c.portfile = p.name AND c.category = '" . mysql_real_escape_string($substr) . "'";
[35219]100            break;
101        case 'maintainer':
102            $tables .= ", $portsdb_name.maintainers AS m";
[35220]103            $criteria = "m.portfile = p.name AND m.maintainer LIKE '%" . mysql_real_escape_string($substr) . "%'";
[35219]104            break;
105        case 'library':
[35220]106            $criteria = "p.name = '" . mysql_real_escape_string($substr) . "'";
[35219]107            break;
108        case 'variant':
109            $tables .= ", $portsdb_name.variants AS v";
[35220]110            $criteria = "v.portfile = p.name AND v.variant = '" . mysql_real_escape_string($substr) . "'";
[35219]111            break;
112        case 'platform':
113            $tables .= ", $portsdb_name.platforms AS pl";
[35220]114            $criteria = "pl.portfile = p.name AND pl.platform = '" . mysql_real_escape_string($substr) . "'";
[35219]115            break;
[56622]116/*
117        case 'license':
118            $tables .= ", $portsdb_name.licenses AS lc";
119            $criteria = "lc.portfile = p.name AND lc.license = '" . mysql_real_escape_string($substr) . "'";
120            break;
121*/
[35219]122        case 'all':
123            $criteria = '';
124            break;
[35221]125        default:
126            $criteria = '0';
127            break;
[31572]128        }
[35219]129        $where = ($criteria == '' ? '' : "WHERE $criteria");
130        $query = "SELECT DISTINCT $fields FROM $tables $where ORDER BY name";
[31572]131        $result = mysql_query($query);
[35214]132       
133        /* Main query sent to the DB */
[31580]134        if ($result) {
[66180]135            $paging = false;
[35225]136            $numrows = mysql_num_rows($result);
137            if ($numrows > $pagesize) {
138                $paging = true;
139                $pagecount = ceil($numrows / $pagesize);
140                $page = min($page, $pagecount);
141                $offset = $pagesize * ($page-1);
142                $curpagesize = min($pagesize, $numrows - $offset);
143                # generate a paging control and cache it so we can show it twice
144                $pagecontrol = "<p>Page ";
145                for ($i = 1; $i <= $pagecount; $i++) {
146                    if ($i != 1) {
147                        $pagecontrol .= " | ";
148                    }
149                    if ($i == $page) {
150                        $pagecontrol .= "<b>$i</b>";
151                    } else {
[104212]152                        $pagecontrol .= "<a href=\"$phpself?by=$by&amp;substr=" . urlencode($substr) . "&amp;page=$i&amp;pagesize=$pagesize\">$i</a>";
[35225]153                    }
154                }
155                $pagecontrol .= "</p>";
156
157                # seek the data pointer
158                mysql_data_seek($result, $offset);
159            }
160
[35223]161            print '<h3>Query Results</h3>';
162            if ($paging) {
163                print $pagecontrol;
[35225]164                $numrowtext = ($offset+1) . "-" . ($offset + $curpagesize) . " of $numrows Portfile" . ($curpagesize == 1 ? '' : 's');
[35223]165            } else {
[35225]166                $numrowtext = "$numrows Portfile" . ($numrows == 1 ? '' : 's');
[35223]167            }
[35225]168            print "<p><i>$numrowtext Selected</i></p>";
[31580]169
[35214]170            print '<dl>';
171            /* Iterate over the entire set of returned ports */
[35225]172            for ($row = mysql_fetch_assoc($result), $i = 0;
173                 $row && (!$paging || $i < $curpagesize);
174                 $row = mysql_fetch_assoc($result), $i++) {
[31566]175
[35214]176                /* Port name and Portfile URL */
[40385]177                print "<dt><b><a href=\"${trac_url}browser/trunk/dports/" . $row['path'] . "/Portfile\">" . htmlspecialchars($row['name'])
[35214]178                . '</a></b> ' . htmlspecialchars($row['version']) . '</dt>';
179               
180                print '<dd>';
181                /* Port short description */
182                print htmlspecialchars($row['description']) . '<br />';
183               
[56622]184                /* Licenses */
185                $nquery = "SELECT license FROM $portsdb_name.licenses WHERE portfile='" . mysql_real_escape_string($row['name']) .
186                "' ORDER BY license";
187                $nresult = mysql_query($nquery);
188                if ($nresult && mysql_num_rows($nresult) > 0) {
189                    print '<i>Licenses:</i> ';
190                    while ($nrow = mysql_fetch_row($nresult)) {
[104212]191                        print "<a href=\"$phpself?by=license&amp;substr=" . urlencode($nrow[0]) . '">'
[56622]192                        . htmlspecialchars($nrow[0]) . '</a> ';
193                    }
194                    print "<br />";
195                }
196
[35214]197                /* Maintainers */
[35220]198                $nquery = "SELECT maintainer FROM $portsdb_name.maintainers WHERE portfile='" . mysql_real_escape_string($row['name']) .
199                "' ORDER BY is_primary DESC, maintainer";
[35215]200                $nresult = mysql_query($nquery);
201                if ($nresult) {
202                    $primary = 1;
203                    print '<i>Maintained by:</i>';
[35216]204                    while ($nrow = mysql_fetch_row($nresult)) {
[35215]205                        if ($primary) { print ' <b>'; }
206                        else { print ' '; }
[40385]207                        print obfuscate_email($nrow[0]);
[35215]208                        if ($primary) { print '</b>'; }
209                        $primary = 0;
[31572]210                    }
[35215]211                }
[3987]212
[35215]213                /* Categories */
[35220]214                $nquery = "SELECT category FROM $portsdb_name.categories WHERE portfile='" . mysql_real_escape_string($row['name']) .
215                "' ORDER BY is_primary DESC, category";
[35215]216                $nresult = mysql_query($nquery);
217                if ($nresult) {
218                    $primary = 1;
219                    print '<br /><i>Categories:</i>';
[35216]220                    while ($nrow = mysql_fetch_row($nresult)) {
[35215]221                        if ($primary) { print ' <b>'; }
222                        else { print ' '; }
[104212]223                        print "<a href=\"$phpself?by=category&amp;substr=" . urlencode($nrow[0]) . '">'
[35216]224                        . htmlspecialchars($nrow[0]) . '</a>';
[35215]225                        if ($primary) { print '</b>'; }
226                        $primary = 0;
[31572]227                    }
[35215]228                }
[3987]229
[35215]230                /* Platforms */
[35220]231                $nquery = "SELECT platform FROM $portsdb_name.platforms WHERE portfile='" . mysql_real_escape_string($row['name']) .
232                "' ORDER BY platform";
[35215]233                $nresult = mysql_query($nquery);
[35217]234                if ($nresult) {
[35215]235                    print '<br /><i>Platforms:</i> ';
[35216]236                    while ($nrow = mysql_fetch_row($nresult)) {
[104212]237                        print "<a href=\"$phpself?by=platform&amp;substr=" . urlencode($nrow[0]) . '">'
[35215]238                        . htmlspecialchars($nrow[0]) . '</a> ';
[31572]239                    }
[35215]240                }
[3987]241
[35215]242                /* Dependencies */
[35220]243                $nquery = "SELECT library FROM $portsdb_name.dependencies WHERE portfile='" . mysql_real_escape_string($row['name']) .
244                "' ORDER BY library";
[35215]245                $nresult = mysql_query($nquery);
246                if ($nresult && mysql_num_rows($nresult) > 0) {
247                    print '<br /><i>Dependencies:</i> ';
[35216]248                    while ($nrow = mysql_fetch_row($nresult)) {
[100018]249                        $library = preg_replace('/^(?:[^:]*:){1,2}/', '', $nrow[0]);
[104212]250                        print "<a href=\"$phpself?by=library&amp;substr=" . urlencode($library) . '">'
[35215]251                        . htmlspecialchars($library) . '</a> ';
[31572]252                    }
[35215]253                }
[31375]254
[35215]255                /* Variants */
[35220]256                $nquery = "SELECT variant FROM $portsdb_name.variants WHERE portfile='" . mysql_real_escape_string($row['name']) .
257                "' ORDER BY variant";
[35215]258                $nresult = mysql_query($nquery);
259                if ($nresult && mysql_num_rows($nresult) > 0) {
260                    print '<br /><i>Variants:</i> ';
[35216]261                    while ($nrow = mysql_fetch_row($nresult)) {
[104212]262                        print "<a href=\"$phpself?by=variant&amp;substr=" . urlencode($nrow[0]) . '">'
[35215]263                        . htmlspecialchars($nrow[0]) . '</a> ';
[31566]264                    }
[35215]265                }
[56622]266
[35215]267                print '<br /><br /></dd>';
[100015]268            } /* while (listing of matching ports) */
[35214]269            print '</dl>';
[31579]270
[35223]271            if ($paging) {
272                print $pagecontrol;
273            }
274
[35214]275        /* When we hit this else, the query failed for some reason */
[31572]276        } else {
[35168]277            print '<p>An Error Occurred: '. mysql_error($portsdb_info['connection_handler']) . '</p>';
[31572]278        }
[35214]279       
280    } /* if (main query sent to the DB) */
[28916]281?>
[31572]282
[28903]283</div>
[28916]284
[30043]285
[8310]286<?php
[28903]287    print_footer();
[35168]288    mysql_close($portsdb_info['connection_handler']);
[15413]289?>
Note: See TracBrowser for help on using the repository browser.