Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
 
3
// This file is part of Moodle - http://moodle.org/
4
//
5
// Moodle is free software: you can redistribute it and/or modify
6
// it under the terms of the GNU General Public License as published by
7
// the Free Software Foundation, either version 3 of the License, or
8
// (at your option) any later version.
9
//
10
// Moodle is distributed in the hope that it will be useful,
11
// but WITHOUT ANY WARRANTY; without even the implied warranty of
12
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
// GNU General Public License for more details.
14
//
15
// You should have received a copy of the GNU General Public License
16
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17
 
18
 
19
/**
20
 * A namespace contains license specific functions
21
 *
22
 * @since      Moodle 2.0
23
 * @package    core
24
 * @subpackage lib
25
 * @copyright  2010 Dongsheng Cai <dongsheng@moodle.com>
26
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
27
 */
28
 
29
defined('MOODLE_INTERNAL') || die();
30
 
31
class license_manager {
32
 
33
    /**
34
     * License is a core license and can not be updated or deleted.
35
     */
36
    const CORE_LICENSE = 0;
37
 
38
    /**
39
     * License is a custom license and can be updated and/or deleted.
40
     */
41
    const CUSTOM_LICENSE = 1;
42
 
43
    /**
44
     * Integer representation of boolean for a license that is enabled.
45
     */
46
    const LICENSE_ENABLED = 1;
47
 
48
    /**
49
     * Integer representation of boolean for a license that is disabled.
50
     */
51
    const LICENSE_DISABLED = 0;
52
 
53
    /**
54
     * Integer for moving a license up order.
55
     */
56
    const LICENSE_MOVE_UP = -1;
57
 
58
    /**
59
     * Integer for moving a license down order.
60
     */
61
    const LICENSE_MOVE_DOWN = 1;
62
 
63
    /**
64
     * Save a license record.
65
     *
66
     * @param object $license {
67
     *            shortname => string a shortname of license, will be refered by files table[required]
68
     *            fullname  => string the fullname of the license [required]
69
     *            source => string the homepage of the license type[required]
70
     *            enabled => int is it enabled?
71
     *            version  => int a version number used by moodle [required]
72
     * }
73
     */
74
    public static function save($license) {
75
 
76
        $existinglicense = self::get_license_by_shortname($license->shortname);
77
 
78
        if (!empty($existinglicense)) {
79
            $id = $existinglicense->id;
80
            if ($existinglicense->custom == self::CORE_LICENSE) {
81
                // Can only update the enabled status and sortorder for core licenses.
82
                $existinglicense->enabled = $license->enabled;
83
                $existinglicense->sortorder = $license->sortorder;
84
                $license = $existinglicense;
85
            }
86
            $license->id = $id;
87
            self::update($license);
88
        } else {
89
            self::create($license);
90
        }
91
 
92
        return true;
93
    }
94
 
95
    /**
96
     * @deprecated Since Moodle 3.9, MDL-45184.
97
     */
98
    public function add() {
99
        throw new coding_exception('license_manager::add() is deprecated. Please use license_manager::save() instead.');
100
    }
101
 
102
    /**
103
     * Create a license record.
104
     *
105
     * @param object $license the license to create record for.
106
     */
107
    protected static function create($license) {
108
        global $DB;
109
 
110
        $licensecount = count(self::get_licenses());
111
        $license->sortorder = $licensecount + 1;
112
        // Enable all created license by default.
113
        $license->enabled = self::LICENSE_ENABLED;
114
        // API can only create custom licenses, core licenses
115
        // are directly created at install or upgrade.
116
        $license->custom = self::CUSTOM_LICENSE;
117
 
118
        $DB->insert_record('license', $license);
119
        self::reset_license_cache();
120
        // Update the config setting of active licenses.
121
        self::set_active_licenses();
122
    }
123
 
124
    /**
125
     * Read licens record(s) from database.
126
     *
127
     * @param array $params license parameters to return licenses for.
128
     *
129
     * @return array $filteredlicenses object[] of licenses.
130
     */
131
    public static function read(array $params = []) {
132
        $licenses = self::get_licenses();
133
 
134
        $filteredlicenses = [];
135
 
136
        foreach ($licenses as $shortname => $license) {
137
            $filtermatch = true;
138
            foreach ($params as $key => $value) {
139
                if ($license->$key != $value) {
140
                    $filtermatch = false;
141
                }
142
            }
143
            if ($filtermatch) {
144
                $filteredlicenses[$shortname] = $license;
145
            }
146
        }
147
        return $filteredlicenses;
148
 
149
    }
150
 
151
    /**
152
     * Update a license record.
153
     *
154
     * @param object $license the license to update record for.
155
     *
156
     * @throws \moodle_exception if attempting to update a core license.
157
     */
158
    protected static function update($license) {
159
        global $DB;
160
 
161
        $DB->update_record('license', $license);
162
        self::reset_license_cache();
163
    }
164
 
165
    /**
166
     * Delete a custom license.
167
     *
168
     * @param string $licenseshortname the shortname of license.
169
     *
170
     * @throws \moodle_exception when attempting to delete a license you are not allowed to.
171
     */
172
    public static function delete($licenseshortname) {
173
        global $DB;
174
 
175
        $licensetodelete = self::get_license_by_shortname($licenseshortname);
176
 
177
        if (!empty($licensetodelete)) {
178
            if ($licensetodelete->custom == self::CUSTOM_LICENSE) {
179
                // Check that the license is not in use by any non-draft files, if so it cannot be deleted.
180
                $countfilesselect = 'license = :license AND NOT (component = \'user\' AND filearea = \'draft\')';
181
                $countfilesusinglicense = $DB->count_records_select('files', $countfilesselect, ['license' => $licenseshortname]);
182
                if ($countfilesusinglicense > 0) {
183
                    throw new moodle_exception('cannotdeletelicenseinuse', 'license');
184
                }
185
                $deletedsortorder = $licensetodelete->sortorder;
186
                $DB->delete_records('license', ['id' => $licensetodelete->id]);
187
 
188
                // We've deleted a license, so update our list of licenses so we don't save the deleted license again.
189
                self::reset_license_cache();
190
                $licenses = self::get_licenses();
191
 
192
                foreach ($licenses as $license) {
193
                    if ($license->sortorder > $deletedsortorder) {
194
                        $license->sortorder = $license->sortorder - 1;
195
                        self::save($license);
196
                    }
197
                }
198
 
199
                // Update the config setting of active licenses as well.
200
                self::set_active_licenses();
201
 
202
            } else {
203
                throw new moodle_exception('cannotdeletecore', 'license');
204
            }
205
        } else {
206
            throw new moodle_exception('licensenotfoundshortname', 'license', $licenseshortname);
207
        }
208
    }
209
 
210
    /**
211
     * Get license records.
212
     *
213
     * @return array|false object[] of license records of false if none.
214
     */
215
    public static function get_licenses() {
216
        global $DB;
217
 
218
        $cache = \cache::make('core', 'license');
219
        $licenses = $cache->get('licenses');
220
 
221
        if ($licenses === false) {
222
            $licenses = [];
223
            $records = $DB->get_records_select('license', null, null, 'sortorder ASC');
224
            foreach ($records as $license) {
225
                $licenses[$license->shortname] = $license;
226
            }
227
            $cache->set('licenses', $licenses);
228
        }
229
 
230
        foreach ($licenses as $license) {
231
            // Localise the license names.
232
            if ($license->custom == self::CORE_LICENSE) {
233
                $license->fullname = get_string($license->shortname, 'core_license');
234
            } else {
235
                $license->fullname = format_string($license->fullname);
236
            }
237
        }
238
 
239
        return $licenses;
240
    }
241
 
242
    /**
243
     * Change the sort order of a license (and it's sibling license as a result).
244
     *
245
     * @param int $direction value to change sortorder of license by.
246
     * @param string $licenseshortname the shortname of license to changes sortorder for.
247
     *
248
     * @throws \moodle_exception if attempting to use invalid direction value.
249
     */
250
    public static function change_license_sortorder(int $direction, string $licenseshortname): void {
251
 
252
        if ($direction != self::LICENSE_MOVE_UP && $direction != self::LICENSE_MOVE_DOWN) {
253
            throw new coding_exception(
254
                'Must use a valid licence API move direction constant (LICENSE_MOVE_UP or LICENSE_MOVE_DOWN)');
255
        }
256
 
257
        $licenses = self::get_licenses();
258
        $licensetoupdate = $licenses[$licenseshortname];
259
 
260
        $currentsortorder = $licensetoupdate->sortorder;
261
        $targetsortorder = $currentsortorder + $direction;
262
 
263
        if ($targetsortorder > 0 && $targetsortorder <= count($licenses) ) {
264
            foreach ($licenses as $license) {
265
                if ($license->sortorder == $targetsortorder) {
266
                    $license->sortorder = $license->sortorder - $direction;
267
                    self::update($license);
268
                }
269
            }
270
            $licensetoupdate->sortorder = $targetsortorder;
271
            self::update($licensetoupdate);
272
        }
273
    }
274
 
275
    /**
276
     * Get license record by shortname
277
     *
278
     * @param string $name the shortname of license
279
     * @return object|null the license or null if no license found.
280
     */
281
    public static function get_license_by_shortname(string $name) {
282
        $licenses = self::read(['shortname' => $name]);
283
 
284
        if (!empty($licenses)) {
285
            $license = reset($licenses);
286
        } else {
287
            $license = null;
288
        }
289
 
290
        return $license;
291
    }
292
 
293
    /**
294
     * Enable a license
295
     * @param string $license the shortname of license
296
     * @return boolean
297
     */
298
    public static function enable($license) {
299
        if ($license = self::get_license_by_shortname($license)) {
300
            $license->enabled = self::LICENSE_ENABLED;
301
            self::update($license);
302
        }
303
        self::set_active_licenses();
304
 
305
        return true;
306
    }
307
 
308
    /**
309
     * Disable a license
310
     * @param string $license the shortname of license
311
     * @return boolean
312
     */
313
    public static function disable($license) {
314
        global $CFG;
315
        // Site default license cannot be disabled!
316
        if ($license == $CFG->sitedefaultlicense) {
317
            throw new \moodle_exception('error');
318
        }
319
        if ($license = self::get_license_by_shortname($license)) {
320
            $license->enabled = self::LICENSE_DISABLED;
321
            self::update($license);
322
        }
323
        self::set_active_licenses();
324
 
325
        return true;
326
    }
327
 
328
    /**
329
     * Store active licenses in global config.
330
     */
331
    protected static function set_active_licenses() {
332
        $licenses = self::read(['enabled' => self::LICENSE_ENABLED]);
333
        $result = array();
334
        foreach ($licenses as $l) {
335
            $result[] = $l->shortname;
336
        }
337
        set_config('licenses', implode(',', $result));
338
    }
339
 
340
    /**
341
     * Get the globally configured active licenses.
342
     *
343
     * @return array of license objects.
344
     * @throws \coding_exception
345
     */
346
    public static function get_active_licenses() {
347
        global $CFG;
348
 
349
        $result = [];
350
 
351
        if (!empty($CFG->licenses)) {
352
            $activelicenses = explode(',', $CFG->licenses);
353
            $licenses = self::get_licenses();
354
            foreach ($licenses as $license) {
355
                if (in_array($license->shortname, $activelicenses)) {
356
                    $result[$license->shortname] = $license;
357
                }
358
            }
359
        }
360
 
361
        return $result;
362
    }
363
 
364
    /**
365
     * Get the globally configured active licenses as an array.
366
     *
367
     * @return array $licenses an associative array of licenses shaped as ['shortname' => 'fullname']
368
     */
369
    public static function get_active_licenses_as_array() {
370
        $activelicenses = self::get_active_licenses();
371
 
372
        $licenses = [];
373
        foreach ($activelicenses as $license) {
374
            $licenses[$license->shortname] = $license->fullname;
375
        }
376
 
377
        return $licenses;
378
    }
379
 
380
    /**
381
     * Install moodle built-in licenses.
382
     */
383
    public static function install_licenses() {
384
        global $CFG;
385
 
386
        require_once($CFG->libdir . '/db/upgradelib.php');
387
 
388
        upgrade_core_licenses();
389
    }
390
 
391
    /**
392
     * Reset the license cache so it rebuilds next time licenses are fetched.
393
     */
394
    public static function reset_license_cache() {
395
        $cache = \cache::make('core', 'license');
396
        $cache->delete('licenses');
397
    }
398
}