source: trunk/www/ports.php @ 42662

Last change on this file since 42662 was 40385, checked in by jmpp@…, 12 years ago
  • Don't urlencode() the path to the Portfile in the trac browser as that, somehow, breaks the url; fixes #16672;
  • Don't htmlspecialchars the return of our obfuscate_email() function, as that turns valid html syntax into renderable text, thus breaking the html;

I noticed these problems a while back on my local server when I upgraded PHP to its latest 5.2.6 release, so I guess Mac OS Forge is now going through the
same process. But frankly I don't really understand how these problems hadn't surfaced before.

PS: A bit of further investigation releaved to me both Safari 3.1.2 and Firefox 3.0.3 rendered the ports.php page without any hiccups, and the problem
only surfaced when using the latest WebKit nightly builds (which I've been using for a while now). Nevertheless, the two fixes still stand.

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