diff --git a/bin/delete-device.php b/bin/delete-device.php new file mode 100755 index 0000000..e791411 --- /dev/null +++ b/bin/delete-device.php @@ -0,0 +1,97 @@ +#!/usr/bin/env php + | + | | + | This program is free software: you can redistribute it and/or modify | + | it under the terms of the GNU Affero General Public License as published | + | by the Free Software Foundation, either version 3 of the License, or | + | (at your option) any later version. | + | | + | This program is distributed in the hope that it will be useful, | + | but WITHOUT ANY WARRANTY; without even the implied warranty of | + | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | + | GNU Affero General Public License for more details. | + | | + | You should have received a copy of the GNU Affero General Public License | + | along with this program. If not, see | + +--------------------------------------------------------------------------+ + | Author: Christian Mollekopf | + +--------------------------------------------------------------------------+ +*/ + + +define('RCUBE_INSTALL_PATH', realpath(dirname(__FILE__) . '/../') . '/'); +define('RCUBE_PLUGINS_DIR', RCUBE_INSTALL_PATH . 'lib/plugins/'); + +// Define include path +$include_path = RCUBE_INSTALL_PATH . 'lib' . PATH_SEPARATOR; +$include_path .= RCUBE_INSTALL_PATH . 'lib/ext' . PATH_SEPARATOR; +$include_path .= ini_get('include_path'); +set_include_path($include_path); + +// include composer autoloader (if available) +if (@file_exists(RCUBE_INSTALL_PATH . 'vendor/autoload.php')) { + require RCUBE_INSTALL_PATH . 'vendor/autoload.php'; +} + +// include global functions from Roundcube Framework +require_once 'Roundcube/bootstrap.php'; + +$opts = rcube_utils::get_opt([ + 's' => 'since', // Deletes *all* devices that haven't been used since the given timestamp. Doesn't take owner and device id into account. Timestamp format e.g.: "2024-11-01" + 'o' => 'owner', + 'd' => 'deviceid', +]); + +$rcube = \rcube::get_instance(); +$db = $rcube->get_dbh(); + +if (!empty($opts['since'])) { + $since = $opts['since']; + $since = new DateTime($since); + print("Removing all devices that haven't been used since: " . $since->format('Y-m-d H:i:s') . "\n"); + + $db->query( + "DELETE FROM `syncroton_device`" + . " WHERE `lastping` < ? OR `lastping` = NULL", + $since->format('Y-m-d H:i:s') + ); + return; +} + +if (empty($opts['deviceid'])) { + rcube::raise_error("Device id not specified (--deviceid).", false, true); +} +$device = $opts['deviceid']; + +if (empty($opts['owner'])) { + rcube::raise_error("owner not specified (--owner).", false, true); +} +$owner = $opts['owner']; + +$select = $db->query( + "SELECT `user_id` FROM `users`" + . " WHERE `username` = ?" + . " ORDER BY `user_id` DESC", + \strtolower($owner) +); + +if ($data = $db->fetch_assoc($select)) { + $userid = $data['user_id']; +} else { + rcube::raise_error("User not found in roundcube database, aborting: $email.", false, true); +} + +print("Found the user with id: $userid\n"); + +$db->query( + "DELETE FROM syncroton_device WHERE owner_id = ? AND deviceid = ?", + $userid, + $device +); + +print("Deleted the device with the deviceid: $deviceid\n");