diff --git a/psalm.xml b/psalm.xml index c974a905..d0e426f3 100644 --- a/psalm.xml +++ b/psalm.xml @@ -9,6 +9,7 @@ + diff --git a/public/upgrade.php b/public/upgrade.php index f75c6afd..28ac79c8 100644 --- a/public/upgrade.php +++ b/public/upgrade.php @@ -331,7 +331,11 @@ function db_query_parsed($sql, $ignore_errors = 0, $attach_mysql = "") { } } } - +/** + * @param string $table + * @param string $index + * @return string + */ function _drop_index($table, $index) { global $CONF; $table = table_by_key($table); @@ -346,6 +350,12 @@ function _drop_index($table, $index) { } } +/** + * @return string + * @param string $table + * @param string $indexname + * @param string $fieldlist + */ function _add_index($table, $indexname, $fieldlist) { global $CONF; $table = table_by_key($table); @@ -362,6 +372,9 @@ function _add_index($table, $indexname, $fieldlist) { } } +/** + * @return void + */ function upgrade_1_mysql() { # # creating the tables in this very old layout (pre 2.1) causes trouble if the MySQL charset is not latin1 (multibyte vs. index length) @@ -469,6 +482,9 @@ function upgrade_1_mysql() { } } +/** + * @return void + */ function upgrade_2_mysql() { # # updating the tables in this very old layout (pre 2.1) causes trouble if the MySQL charset is not latin1 (multibyte vs. index length) @@ -489,6 +505,9 @@ function upgrade_2_mysql() { } } +/** + * @return void + */ function upgrade_2_pgsql() { if (!_pgsql_object_exists(table_by_key('domain'))) { db_query_parsed(" @@ -614,6 +633,9 @@ function upgrade_2_pgsql() { db_query_parsed("ALTER TABLE $table_domain ADD COLUMN backupmx BOOLEAN DEFAULT false", true); } +/** + * @return void + */ function upgrade_3_mysql() { # # updating the tables in this very old layout (pre 2.1) causes trouble if the MySQL charset is not latin1 (multibyte vs. index length) @@ -687,6 +709,9 @@ function upgrade_3_mysql() { db_query_parsed("UPDATE $table_vacation SET domain=SUBSTRING_INDEX(email, '@', -1) WHERE email=email;"); } +/** + * @return void + */ function upgrade_4_mysql() { # MySQL only # changes between 2.1 and moving to sourceforge $table_domain = table_by_key('domain'); @@ -697,6 +722,7 @@ function upgrade_4_mysql() { # MySQL only /** * Changes between 2.1 and moving to sf.net + * @return void */ function upgrade_4_pgsql() { $table_domain = table_by_key('domain'); @@ -793,6 +819,7 @@ function upgrade_4_pgsql() { * changes compared to DATABASE_MYSQL.txt: * - removed MySQL user and database creation * - removed creation of default superadmin + * @return void */ function upgrade_5_mysql() { db_query_parsed(" @@ -891,6 +918,7 @@ function upgrade_5_mysql() { /** * drop useless indicies (already available as primary key) + * @return void */ function upgrade_79_mysql() { # MySQL only db_query_parsed(_drop_index('admin', 'username'), true); @@ -899,6 +927,9 @@ function upgrade_79_mysql() { # MySQL only db_query_parsed(_drop_index('mailbox', 'username'), true); } +/** + * @return void + */ function upgrade_81_mysql() { # MySQL only $table_vacation = table_by_key('vacation'); $table_vacation_notification = table_by_key('vacation_notification'); @@ -921,6 +952,7 @@ function upgrade_81_mysql() { # MySQL only /** * Make logging translatable - i.e. create alias => create_alias + * @return void */ function upgrade_90_mysql_pgsql() { db_query_parsed("UPDATE " . table_by_key('log') . " SET action = REPLACE(action,' ','_')", true); @@ -930,6 +962,7 @@ function upgrade_90_mysql_pgsql() { /** * MySQL only allow quota > 2 GB + * @return void */ function upgrade_169_mysql() { $table_domain = table_by_key('domain'); @@ -944,6 +977,7 @@ function upgrade_169_mysql() { * Create / modify vacation_notification table. * Note: This might not work if users used workarounds to create the table before. * In this case, dropping the table is the easiest solution. + * @return void */ function upgrade_318_mysql() { $table_vacation_notification = table_by_key('vacation_notification'); @@ -980,6 +1014,7 @@ function upgrade_318_mysql() { /** * Create fetchmail table + * @return void */ function upgrade_344_mysql() { $table_fetchmail = table_by_key('fetchmail'); @@ -1006,6 +1041,9 @@ function upgrade_344_mysql() { "); } +/** + * @return void + */ function upgrade_344_pgsql() { $fetchmail = table_by_key('fetchmail'); // a field name called 'date' is probably a bad idea. @@ -1044,8 +1082,10 @@ function upgrade_344_pgsql() { /** * Create alias_domain table - MySQL + * function upgrade_362_mysql() # renamed to _438 to make sure it runs after an upgrade from 2.2.x + * + * @return void */ -# function upgrade_362_mysql() # renamed to _438 to make sure it runs after an upgrade from 2.2.x function upgrade_438_mysql() { # Table structure for table alias_domain # @@ -1066,8 +1106,9 @@ function upgrade_438_mysql() { /** * Create alias_domain table - PgSQL + * function upgrade_362_pgsql() # renamed to _438 to make sure it runs after an upgrade from 2.2.x + * @return void */ -# function upgrade_362_pgsql() # renamed to _438 to make sure it runs after an upgrade from 2.2.x function upgrade_438_pgsql() { # Table structure for table alias_domain $table_alias_domain = table_by_key('alias_domain'); @@ -1089,6 +1130,7 @@ function upgrade_438_pgsql() { /** * Change description fields to UTF-8 + * @return void */ function upgrade_373_mysql() { # MySQL only $table_domain = table_by_key('domain'); @@ -1107,6 +1149,7 @@ function upgrade_373_mysql() { # MySQL only /** * add ssl option for fetchmail + * @return void */ function upgrade_439_mysql() { $table_fetchmail = table_by_key('fetchmail'); @@ -1114,6 +1157,10 @@ function upgrade_439_mysql() { db_query_parsed("ALTER TABLE $table_fetchmail ADD `ssl` TINYINT( 1 ) UNSIGNED NOT NULL DEFAULT '0' AFTER `protocol` ; "); } } + +/** + * @return void + */ function upgrade_439_pgsql() { $table_fetchmail = table_by_key('fetchmail'); if (!_pgsql_field_exists($table_fetchmail, 'ssl')) { @@ -1121,6 +1168,9 @@ function upgrade_439_pgsql() { } } +/** + * @return void + */ function upgrade_473_mysql() { $table_admin = table_by_key('admin'); $table_alias = table_by_key('alias'); @@ -1176,6 +1226,9 @@ function upgrade_473_mysql() { } } +/** + * @return void + */ function upgrade_479_mysql() { # ssl is a reserved word in MySQL and causes several problems. Renaming the field... $table_fmail = table_by_key('fetchmail'); @@ -1183,6 +1236,11 @@ function upgrade_479_mysql() { db_query_parsed("ALTER TABLE $table_fmail CHANGE `ssl` `usessl` TINYINT( 1 ) UNSIGNED NOT NULL DEFAULT '0'"); } } + + +/** + * @return void + */ function upgrade_479_pgsql() { $table_fmail = table_by_key('fetchmail'); if (!_pgsql_field_exists($table_fmail, 'usessl')) { @@ -1190,14 +1248,20 @@ function upgrade_479_pgsql() { } } +/** + * @return void + */ function upgrade_483_mysql() { $table_log = table_by_key('log'); db_query_parsed("ALTER TABLE $table_log CHANGE `data` `data` TEXT {LATIN1} NOT NULL"); } -# Add a local_part field to the mailbox table, and populate it with the local part of the user's address. -# This is to make it easier (hopefully) to change the filesystem location of a mailbox in the future -# See https://sourceforge.net/forum/message.php?msg_id=5394663 +/** + * Add a local_part field to the mailbox table, and populate it with the local part of the user's address. + * This is to make it easier (hopefully) to change the filesystem location of a mailbox in the future + * See https://sourceforge.net/forum/message.php?msg_id=5394663 + * @return void + */ function upgrade_495_pgsql() { $table_mailbox = table_by_key('mailbox'); if (!_pgsql_field_exists($table_mailbox, 'local_part')) { @@ -1206,7 +1270,10 @@ function upgrade_495_pgsql() { db_query_parsed("ALTER TABLE $table_mailbox alter column local_part SET NOT NULL"); } } -# See https://sourceforge.net/forum/message.php?msg_id=5394663 +/** + * See https://sourceforge.net/forum/message.php?msg_id=5394663 + * @return void + */ function upgrade_495_mysql() { $table_mailbox = table_by_key('mailbox'); if (!_mysql_field_exists($table_mailbox, 'local_part')) { @@ -1216,11 +1283,17 @@ function upgrade_495_mysql() { } } +/** + * @return void + */ function upgrade_504_mysql() { $table_mailbox = table_by_key('mailbox'); db_query_parsed("ALTER TABLE $table_mailbox CHANGE `local_part` `local_part` VARCHAR( 255 ) {LATIN1} NOT NULL"); } +/** + * @return void + */ function upgrade_655_mysql_pgsql() { db_query_parsed(_add_index('mailbox', 'domain', 'domain')); db_query_parsed(_add_index('alias', 'domain', 'domain')); @@ -1288,6 +1361,9 @@ function upgrade_727_mysql() { } */ +/** + * @return void + */ function upgrade_729_mysql_pgsql() { $table_quota = table_by_key('quota'); $table_quota2 = table_by_key('quota2'); @@ -1316,6 +1392,9 @@ function upgrade_729_mysql_pgsql() { "); } +/** + * @return void + */ function upgrade_730_pgsql() { $table_quota = table_by_key('quota'); $table_quota2 = table_by_key('quota2'); @@ -1384,15 +1463,25 @@ function upgrade_730_pgsql() { "); } +/** + * @return void + */ function upgrade_945_mysql_pgsql() { _db_add_field('vacation', 'modified', '{DATECURRENT}', 'created'); } +/** + * @return void + */ function upgrade_946_mysql_pgsql() { # taken from upgrade_727_mysql, needs to be done for all databases _db_add_field('vacation', 'activefrom', '{DATE}', 'body'); _db_add_field('vacation', 'activeuntil', '{DATEFUTURE}', 'activefrom'); } + +/** + * @return void + */ function upgrade_968_pgsql() { # pgsql counterpart for upgrade_169_mysql() - allow really big quota $table_domain = table_by_key('domain'); @@ -1402,14 +1491,24 @@ function upgrade_968_pgsql() { db_query_parsed("ALTER TABLE $table_mailbox ALTER COLUMN quota type bigint"); } +/** + * @return void + */ function upgrade_1050_mysql_pgsql() { db_query_parsed(_add_index('log', 'domain_timestamp', 'domain,timestamp')); } + +/** + * @return void + */ function upgrade_1283_mysql_pgsql() { _db_add_field('admin', 'superadmin', '{BOOLEAN}', 'password'); } +/** + * @return void + */ function upgrade_1284_mysql_pgsql() { # migrate the ALL domain to the superadmin column # Note: The ALL domain is not (yet) deleted to stay backwards-compatible for now (will be done in a later upgrade function) @@ -1422,6 +1521,9 @@ function upgrade_1284_mysql_pgsql() { } } +/** + * @return void + */ function upgrade_1345_mysql() { # $table_vacation = table_by_key('vacation'); # adding and usage of reply_type field removed in r1610 @@ -1430,29 +1532,45 @@ function upgrade_1345_mysql() { # db_query_parsed("ALTER TABLE `$table_vacation` ADD `interval_time` INT NOT NULL DEFAULT '0' AFTER `reply_type` "); } +/** + * @return void + */ function upgrade_1519_mysql_pgsql() { _db_add_field('fetchmail', 'sslcertck', '{BOOLEAN}', 'usessl'); _db_add_field('fetchmail', 'sslcertpath', "VARCHAR(255) {UTF-8} DEFAULT ''", 'sslcertck'); _db_add_field('fetchmail', 'sslfingerprint', "VARCHAR(255) {LATIN1} DEFAULT ''", 'sslcertpath'); } +/** + * @return void + */ function upgrade_1610_mysql_pgsql() { # obsoletes upgrade_1345_mysql() - which means debug mode could print "field already exists" _db_add_field('vacation', 'interval_time', '{INT}', 'domain'); } +/** + * @return void + */ function upgrade_1685_mysql() { # Fix existing log entries broken by https://sourceforge.net/p/postfixadmin/bugs/317/ $table = table_by_key('log'); db_query_parsed("UPDATE $table SET data = domain WHERE data = '' AND domain LIKE '%@%'"); db_query_parsed("UPDATE $table SET domain=SUBSTRING_INDEX(domain, '@', -1) WHERE domain=data;"); } + +/** + * @return void + */ function upgrade_1685_pgsql() { $table = table_by_key('log'); db_query_parsed("UPDATE $table SET data = domain WHERE data = '' AND domain LIKE '%@%'"); db_query_parsed("UPDATE $table SET domain=SPLIT_PART(domain, '@', 2) WHERE domain=data;"); } +/** + * @return void + */ function upgrade_1761_mysql() { # upgrade_1762 adds the 'modified' column as {DATECURRENT}, therefore we first need to change # 'date' to {DATE} (mysql only allows one {DATECURRENT} column per table) @@ -1460,6 +1578,9 @@ function upgrade_1761_mysql() { db_query_parsed("ALTER TABLE $table_fetchmail CHANGE `date` `date` {DATE}"); } +/** + * @return void + */ function upgrade_1762_mysql_pgsql() { _db_add_field('fetchmail', 'domain', "VARCHAR(255) {LATIN1} DEFAULT ''", 'id'); _db_add_field('fetchmail', 'active', '{BOOLEAN}', 'date'); @@ -1471,27 +1592,44 @@ function upgrade_1762_mysql_pgsql() { _db_add_field('fetchmail', 'modified', '{DATECURRENT}', 'created'); } +/** + * @return void + */ function upgrade_1763_mysql() { $table = table_by_key('fetchmail'); db_query_parsed("UPDATE $table SET domain=SUBSTRING_INDEX(mailbox, '@', -1) WHERE domain='';"); } + + +/** + * @return void + */ function upgrade_1763_pgsql() { $table = table_by_key('fetchmail'); db_query_parsed("UPDATE $table SET domain=SPLIT_PART(mailbox, '@', 2) WHERE domain='';"); } +/** + * @return void + */ function upgrade_1767_mysql_pgsql() { # 'active' was just added, so make sure all existing jobs stay active $table = table_by_key('fetchmail'); db_query_parsed("UPDATE $table SET active='{BOOL_TRUE}'"); } +/** + * @return void + */ function upgrade_1795_mysql() { # upgrade_1761_mysql() was added later (in r1795) - make sure it runs for everybody # (running it twice doesn't hurt) upgrade_1761_mysql(); } +/** + * @return void + */ function upgrade_1824_sqlite() { $admin_table = table_by_key('admin'); $alias_table = table_by_key('alias'); @@ -1656,6 +1794,9 @@ function upgrade_1824_sqlite() { } +/** + * @return void + */ function upgrade_1835_mysql() { # change default values for existing datetime fields with a 0000-00-00 default to {DATETIME} @@ -1673,6 +1814,9 @@ function upgrade_1835_mysql() { db_query_parsed("ALTER TABLE $table CHANGE `timestamp` `timestamp` {DATETIME}"); } +/** + * @return void + */ function upgrade_1836_mysql() { $table_alias_domain = table_by_key('alias_domain'); $table_vacation_notification = table_by_key('vacation_notification'); @@ -1688,6 +1832,9 @@ function upgrade_1836_mysql() { } } +/** + * @return void + */ function upgrade_1837() { global $CONF; @@ -1717,6 +1864,9 @@ function upgrade_1837() { # - SQLite does not support ALTER COLUMN. At all. # TODO: Rename/create anew/migrate/drop tables for v1836... If it matters? +/** + * @return void + */ function upgrade_1837_sqlite() { # Add columns for the alternative contact to reset a forgotten password. foreach (array('admin', 'mailbox') as $table_to_change) { @@ -1730,11 +1880,15 @@ function upgrade_1837_sqlite() { } } -/* https://github.com/postfixadmin/postfixadmin/issues/89 */ -# upgrade_1838_mysql() renamed to upgrade_1839() to keep all databases in sync +/** + * https://github.com/postfixadmin/postfixadmin/issues/89 + * upgrade_1838_mysql() renamed to upgrade_1839() to keep all databases in sync + * @return void + */ function upgrade_1839() { if (!db_sqlite()) { - return _db_add_field('log', 'id', '{AUTOINCREMENT} {PRIMARY}', 'data'); + _db_add_field('log', 'id', '{AUTOINCREMENT} {PRIMARY}', 'data'); + return; } /* ONLY FOR Sqlite */ @@ -1753,13 +1907,19 @@ function upgrade_1839() { "); } +/** + * @return void + */ function upgrade_1840_mysql_pgsql() { # sqlite doesn't support changing the default value $vacation = table_by_key('vacation'); db_query_parsed("ALTER TABLE $vacation ALTER COLUMN activeuntil SET DEFAULT '2038-01-18'"); } -/* try and fix: https://github.com/postfixadmin/postfixadmin/issues/177 - sqlite missing columns */ +/** + * try and fix: https://github.com/postfixadmin/postfixadmin/issues/177 - sqlite missing columns + * @return void + */ function upgrade_1841_sqlite() { foreach (array('admin', 'mailbox') as $table) { _db_add_field($table, 'phone', "varchar(30) {UTF-8} NOT NULL DEFAULT ''", 'active'); @@ -1769,11 +1929,17 @@ function upgrade_1841_sqlite() { } } +/** + * @return void + */ function upgrade_1842() { _db_add_field('mailbox', 'password_expiry', "{DATETIME}"); // when a specific mailbox password expires _db_add_field('domain', 'password_expiry', 'int DEFAULT 0'); // expiry applied to mailboxes within that domain } +/** + * @return void + */ function upgrade_1843() { # Additional field for fetchmail to allow server with non-standard port number _db_add_field('fetchmail', 'src_port', "{INT}", 'src_server');