aboutsummaryrefslogtreecommitdiff
path: root/db/migrations/1.144_files.php
blob: 4ef726fd0572d5e39b8d5e078c0d2ac4ff0f4689 (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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
<?php

/**
 * files.php
 *
 * Die Migration erzeugt alle Tabellen, die fuer den Betrieb des persoenlichen
 * Dateibereichs noetig sind. Dies sind:
 *
 * - die Kern-Tabellen zur Verwaltung der persoenlichen Verzeichnisse und
 *   Dateien
 *
 * - die Kern-Tabellen zur Verwaltung der vom Stud.IP-Systemadminstrator
 *   vorgenommenen Konfiguration des persoenlichen Dateibereichs und
 *
 * - die Kern-Tabelle zur Verwaltung der von einem Benutzer gewaehlten
 *   Anzeigeoptionen fuer "seinen" Dateimanager.
 *
 *  Zur physikalischen Speicherung persoenlicher Dateien auf dem lokalen Server
 *  richtet files das in der config_local.inc.php in der globalen Variablen
 *  "$USER_DOC_PATH" angegebene Verzeichnis ein.
 *
 * @category    Stud.IP
 * @version     3.1
 *
 * @author      Jan-Hendrik Willms <tleilax+studip@gmail.com>
 * @author      Stefan Osterloh <s.osterloh@uni-oldenburg.de>
 * @author      Gerd Hoffmann <gerd.hoffmann@uni-oldenburg.de>
 * @license     http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 or later
 */


class files extends Migration
{
    public function description()
    {
        return 'Setup db for personal file space';
    }

    public function up()
    {
        // Create directory
        if (empty($GLOBALS['USER_DOC_PATH'])) {
            throw new Exception('Config variable "USER_DOC_PATH" has not been set in file "config/config_local.inc.php". '
                               .'If you are upgrading to a newer release, please refer to the file "config/config_local.inc.php.dist" '
                               .'or just set it to default value of "$USER_DOC_PATH = $STUDIP_BASE_PATH . \'/data/user_doc\';".');
        }
        
        if (!file_exists($GLOBALS['USER_DOC_PATH'])) {
            $result = mkdir($GLOBALS['USER_DOC_PATH'], 0755, true);
            if ($result === false) {
                throw new Exception('Could not create user file path. Please check the config variable "USER_DOC_PATH" '
                                   .'in file "config/config_local.inc.php".');
            }
        }

        /*
         * Migration for API in lib/files
         */
        DBManager::get()->exec("CREATE TABLE IF NOT EXISTS files
            (file_id CHAR(32) NOT NULL,
            user_id CHAR(32) NOT NULL,
            filename VARCHAR(255) NOT NULL,
            mime_type VARCHAR(64) NOT NULL,
            size BIGINT UNSIGNED NOT NULL,
            restricted TINYINT(1) NOT NULL DEFAULT 0,
            storage VARCHAR(32) NOT NULL DEFAULT 'DiskFileStorage',
            storage_id VARCHAR(32) NOT NULL,
            mkdate INT(11) UNSIGNED NOT NULL DEFAULT 0,
            chdate INT(11) UNSIGNED NOT NULL DEFAULT 0,
            PRIMARY KEY (file_id)) ENGINE=MyISAM");

        DBManager::get()->exec("CREATE TABLE IF NOT EXISTS file_refs
            (id CHAR(32) NOT NULL,
            file_id CHAR(32) NOT NULL,
            parent_id CHAR(32) NOT NULL,
            name VARCHAR(255) NOT NULL,
            description TEXT NOT NULL,
            downloads INT NOT NULL DEFAULT 0,
            PRIMARY KEY (id)) ENGINE=MyISAM");

        DBManager::get()->exec("CREATE TABLE IF NOT EXISTS files_backend_studip
            (id INT UNSIGNED NOT NULL,
            files_id VARCHAR(64) NOT NULL,
            path VARCHAR(256) NOT NULL,
            PRIMARY KEY (id)) ENGINE=MyISAM");

        DBManager::get()->exec("CREATE TABLE IF NOT EXISTS files_backend_url
            (id INT UNSIGNED NOT NULL,
            files_id VARCHAR(64) NOT NULL,
            url VARCHAR(256) NOT NULL,
            PRIMARY KEY (id)) ENGINE=MyISAM");

        DBManager::get()->exec("CREATE TABLE IF NOT EXISTS files_share
            (files_id VARCHAR(64) NOT NULL,
            entity_id VARCHAR(32) NOT NULL,
            description MEDIUMTEXT NULL,
            read_perm BOOLEAN DEFAULT FALSE,
            write_perm BOOLEAN DEFAULT FALSE,
            start_date INT UNSIGNED NOT NULL,
            end_date INT UNSIGNED NOT NULL,
            PRIMARY KEY (files_id, entity_id)) ENGINE=MyISAM");

        /*
         * Migration for the Admin-Area
         */
        DBManager::get()->query("CREATE  TABLE IF NOT EXISTS `doc_filetype`
            (`id` INT NOT NULL AUTO_INCREMENT ,
            `type` VARCHAR(45) NOT NULL ,
            `description` TEXT NULL ,
            PRIMARY KEY (`id`)) ENGINE=MyISAM"
        );

        DBManager::get()->query("CREATE  TABLE IF NOT EXISTS `doc_usergroup_config`
            (`id` INT NOT NULL AUTO_INCREMENT ,
            `usergroup` VARCHAR(45) NOT NULL ,
            `upload_quota` TEXT NOT NULL ,
            `upload_unit` VARCHAR(45) NULL ,
            `quota` TEXT NULL ,
            `quota_unit` VARCHAR(45) NULL ,
            `upload_forbidden` INT NOT NULL DEFAULT 0 ,
            `area_close` INT NOT NULL DEFAULT 0 ,
            `area_close_text` TEXT NULL ,
            `is_group_config` INT NOT NULL DEFAULT 0 ,
            PRIMARY KEY (`id`, `usergroup`)) ENGINE=MyISAM"
        );

        DBManager::get()->query("CREATE  TABLE IF NOT EXISTS `doc_filetype_forbidden`
            (`id` INT NOT NULL AUTO_INCREMENT ,
            `usergroup` VARCHAR(45) NOT NULL ,
            `dateityp_id` INT NOT NULL ,
            PRIMARY KEY (`id`) ,
            INDEX `fk_dateityp_verbot_nutzerbereich_2_idx` (`dateityp_id` ASC) ,
            INDEX `fk_dateityp_verbot_nutzerbereich_1_idx` (`usergroup` ASC)) ENGINE=MyISAM"
        );

        /*
         * Set the entry into the table "config" to enable or disable the Personal Document Area
         */
        $query = "INSERT IGNORE INTO `config`
                  (`config_id`, `field`, `value`, `is_default`, `type`, `range`, `section`,
                   `mkdate`, `chdate`, `description`)
                  VALUES (:id, :field, :value, 1, :type, 'global', 'files', UNIX_TIMESTAMP(),
                          UNIX_TIMESTAMP(), :description)";
        $statement = DBManager::get()->prepare($query);
        $statement->execute([
            ':id' => md5(uniqid('PERSONALDOCUMENT_ENABLE')),
            ':field' => 'PERSONALDOCUMENT_ENABLE',
            ':value' => (int) false,
            ':type' => 'boolean',
            ':description' => 'Aktiviert den persoenlichen Dateibereich',
        ]);

        $query = "INSERT IGNORE INTO `doc_usergroup_config`
                     (`id`, `usergroup`, `upload_quota`, `upload_unit`,
                      `quota`, `quota_unit`, `is_group_config`)
                   VALUES (:id, :group, :uploadQuota, :uploadUnit, :quota,
                           :quotaUnit, :isGroupConfig)";

        $statement = DBManager::get()->prepare($query);
        $statement->execute([
            ':id' => '1',
            ':group' => 'default',
            ':uploadQuota' => '5242880',
            ':uploadUnit' => 'MB',
            ':quota' => '52428800',
            ':quotaUnit' => 'MB',
            ':isGroupConfig' => '1'
        ]);

        $query = "INSERT IGNORE INTO `doc_filetype` (`type`) VALUES (:type)";

        $statement = DBManager::get()->prepare($query);
        foreach (words('exe com pif bat scr') as $value) {
            $statement->execute([
                ':type' => $value
            ]);
        }
    }

    public function down()
    {
        // Remove user directories
        $this->rm_rf($GLOBALS['USER_DOC_PATH']);

        // Remove db tables
        DBManager::get()->exec("DROP TABLE IF EXISTS
            `files`,
            `files_layout`,
            `files_backend_studip`,
            `files_backend_url`,
            `files_share`,
            `doc_usergroup_config`,
            `doc_filetype`,
            `doc_filetype_forbidden`
        ");

        // Remove config entry
        DBManager::get()->query("DELETE FROM config WHERE field IN ('PERSONALDOCUMENT_ENABLE')");
    }
    
    protected function rm_rf($path)
    {
        $files = glob(rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . '*');
        foreach ($files as $file) {
            if (is_dir($file)) {
                $this->rm_rf($file);
            } else {
                unlink($file);
            }
        }
        rmdir($path);
    }
 }