Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/bin/update-hashes.php
blob: 1e5612ae48dfc6d44f20e0c01732de83044cb1dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
<?php
/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is addons.mozilla.org site.
 *
 * The Initial Developer of the Original Code is
 * The Mozilla Foundation.
 * Portions created by the Initial Developer are Copyright (C) 2006
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *   Mike Morgan <morgamic@mozilla.com>
 *   Justin Scott <fligtar@gmail.com>
 *
 *
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */

/**
 * The purpose of this script is to retro-actively update existing add-ons
 * with valid hashes.
 *
 * We may not necessarily use this, but it was written just in case we need
 * to run the update in the future.
 *
 * This script should not ever be accessed over HTTP, and instead run via cron.
 * Only sysadmins should be responsible for operating this script.
 *
 * @package amo
 * @subpackage bin
 */


// Before doing anything, test to see if we are calling this from the command
// line.  If this is being called from the web, HTTP environment variables will
// be automatically set by Apache.  If these are found, exit immediately.
if (isset($_SERVER['HTTP_HOST'])) {
    exit;
}

// If we get here, we're on the command line, which means we can continue.
// Include config file
require_once('../site/app/config/config.php');
require_once('../site/app/config/constants.php');

$versions = array();
$hashes = array();

// Connect to our read-only database.
$read = mysql_connect(SHADOW_DB_HOST, SHADOW_DB_USER, SHADOW_DB_PASS) or die('Could not connect: ' . mysql_error());
mysql_select_db(SHADOW_DB_NAME, $read) or die('Could not select database '.SHADOW_DB_NAME);

// Connect to our writable database.
$write = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die('Could not connect: ' . mysql_error());
mysql_select_db(DB_NAME, $write) or die('Could not select database '.DB_NAME);

$fileQry = mysql_query("SELECT
                           addons.id as addon_id,
                           translations.localized_string as name,
                           versions.version,
                           files.id as file_id,
                           files.filename,
                           files.hash,
                           files.size
                        FROM files
                        INNER JOIN versions ON files.version_id=versions.id
                        INNER JOIN addons ON versions.addon_id=addons.id
                        INNER JOIN translations ON addons.name=translations.id
                        WHERE
                            translations.locale='en-US'"
                    , $read);

while ($fileInfo = mysql_fetch_array($fileQry)) {

    $file = REPO_PATH."/{$fileInfo['addon_id']}/{$fileInfo['filename']}";

    // If the file exists, get its sum and update its record.
    if (file_exists($file) && is_file($file)) {
        $hash = sha1_file($file);
        $size = round((filesize($file) / 1024), 0); //in KB
        
        echo "{$fileInfo['name']} {$fileInfo['version']} (file {$fileInfo['file_id']}): ";
        if ('sha1:'.$hash != $fileInfo['hash'] || $size != $fileInfo['size']) {
            mysql_query("UPDATE files SET hash='sha1:{$hash}', size='{$size}' WHERE id={$fileInfo['file_id']}", $write);
            
            if ('sha1:'.$hash != $fileInfo['hash']) {
                echo "HASH - new: sha1:{$hash}; old: {$fileInfo['hash']}";
            }
            
            if ($size != $fileInfo['size']) {
                echo "SIZE - new: {$size} KB; old: {$fileInfo['size']} KB";
            }
            echo "\n";
        }
        else {
            echo "No update needed.\n";
        }
    }
}

exit;
?>