2010-09-09 03:14:17 +00:00
< ? php
2018-01-17 18:42:40 +00:00
use Friendica\Core\Addon ;
2017-11-07 02:22:52 +00:00
use Friendica\Core\Config ;
2018-07-20 02:15:21 +00:00
use Friendica\Core\L10n ;
2019-01-01 16:42:08 +00:00
use Friendica\Core\Logger ;
2017-11-07 02:22:52 +00:00
use Friendica\Core\PConfig ;
2018-10-14 11:19:37 +00:00
use Friendica\Core\Update ;
2017-11-05 12:15:53 +00:00
use Friendica\Core\Worker ;
2018-07-20 12:19:26 +00:00
use Friendica\Database\DBA ;
2018-05-08 17:50:06 +00:00
use Friendica\Model\Contact ;
2018-12-24 10:29:37 +00:00
use Friendica\Model\GContact ;
2018-05-08 17:50:06 +00:00
use Friendica\Model\Item ;
2018-01-21 03:37:13 +00:00
use Friendica\Model\User ;
2019-03-23 14:40:09 +00:00
use Friendica\Util\Config\ConfigCacheSaver ;
2018-07-21 12:25:11 +00:00
use Friendica\Util\DateTimeFormat ;
2017-11-05 12:15:53 +00:00
2010-12-10 04:41:42 +00:00
/**
*
* update . php - automatic system update
*
2017-12-22 14:48:29 +00:00
* This function is responsible for doing post update changes to the data
* ( not the structure ) in the database .
2014-06-03 22:44:58 +00:00
*
2018-11-25 06:07:31 +00:00
* Database structure changes are done in config / dbstructure . config . php
2010-12-10 04:41:42 +00:00
*
2017-12-22 20:06:15 +00:00
* If there is a need for a post process to a structure change , update this file
2017-12-22 21:31:32 +00:00
* by adding a new function at the end with the number of the new DB_UPDATE_VERSION .
2010-12-10 04:41:42 +00:00
*
2017-12-22 21:31:32 +00:00
* The numbered script in this file has to be exactly like the DB_UPDATE_VERSION
2010-12-10 04:41:42 +00:00
*
2017-12-22 14:48:29 +00:00
* Example :
* You are currently on version 4711 and you are preparing changes that demand an update script .
2010-12-10 04:41:42 +00:00
*
2017-12-22 21:31:32 +00:00
* 1. Create a function " update_4712() " here in the update . php
2018-10-21 05:56:58 +00:00
* 2. Apply the needed structural changes in config / dbStructure . php
2018-11-25 06:07:31 +00:00
* 3. Set DB_UPDATE_VERSION in config / dbstructure . config . php to 4712.
2018-07-20 19:47:16 +00:00
*
* If you need to run a script before the database update , name the function " pre_update_4712() "
2010-12-10 04:41:42 +00:00
*/
2018-12-21 09:36:01 +00:00
function update_1178 ()
{
2017-12-22 14:48:29 +00:00
require_once 'mod/profiles.php' ;
2015-01-26 00:07:15 +00:00
$profiles = q ( " SELECT `uid`, `about`, `locality`, `pub_keywords`, `gender` FROM `profile` WHERE `is-default` " );
2018-12-21 09:36:01 +00:00
foreach ( $profiles as $profile ) {
if ( $profile [ " about " ] . $profile [ " locality " ] . $profile [ " pub_keywords " ] . $profile [ " gender " ] == " " ) {
2015-01-26 00:07:15 +00:00
continue ;
2018-12-21 09:36:01 +00:00
}
2015-01-26 00:07:15 +00:00
$profile [ " pub_keywords " ] = profile_clean_keywords ( $profile [ " pub_keywords " ]);
2018-12-21 10:49:38 +00:00
$r = q ( " UPDATE `contact` SET `about` = '%s', `location` = '%s', `keywords` = '%s', `gender` = '%s' WHERE `self` AND `uid` = %d " ,
2018-12-21 09:36:01 +00:00
DBA :: escape ( $profile [ " about " ]),
DBA :: escape ( $profile [ " locality " ]),
DBA :: escape ( $profile [ " pub_keywords " ]),
DBA :: escape ( $profile [ " gender " ]),
intval ( $profile [ " uid " ])
);
2015-01-26 00:07:15 +00:00
}
}
2015-02-08 15:03:23 +00:00
2018-12-21 09:36:01 +00:00
function update_1179 ()
{
if ( Config :: get ( 'system' , 'no_community_page' )) {
Config :: set ( 'system' , 'community_page_style' , CP_NO_COMMUNITY_PAGE );
}
2015-02-08 19:35:40 +00:00
2015-02-08 15:03:23 +00:00
// Update the central item storage with uid=0
2017-11-05 12:15:53 +00:00
Worker :: add ( PRIORITY_LOW , " threadupdate " );
2015-02-08 15:03:23 +00:00
2018-10-14 11:19:37 +00:00
return Update :: SUCCESS ;
2015-02-08 15:03:23 +00:00
}
2015-03-07 20:24:39 +00:00
2018-12-21 09:36:01 +00:00
function update_1181 ()
{
2015-03-07 20:24:39 +00:00
// Fill the new fields in the term table.
2017-11-15 21:12:33 +00:00
Worker :: add ( PRIORITY_LOW , " TagUpdate " );
2015-03-07 20:24:39 +00:00
2018-10-14 11:19:37 +00:00
return Update :: SUCCESS ;
2015-03-07 20:24:39 +00:00
}
2015-10-17 13:26:11 +00:00
2018-12-21 09:36:01 +00:00
function update_1189 ()
{
2015-10-17 13:26:11 +00:00
2018-12-21 09:36:01 +00:00
if ( strlen ( Config :: get ( 'system' , 'directory_submit_url' )) &&
! strlen ( Config :: get ( 'system' , 'directory' ))) {
Config :: set ( 'system' , 'directory' , dirname ( Config :: get ( 'system' , 'directory_submit_url' )));
Config :: delete ( 'system' , 'directory_submit_url' );
2015-10-17 13:26:11 +00:00
}
2018-10-14 11:19:37 +00:00
return Update :: SUCCESS ;
2015-10-17 13:26:11 +00:00
}
2015-11-11 22:39:14 +00:00
2018-12-21 09:36:01 +00:00
function update_1191 ()
{
2017-11-07 02:22:52 +00:00
Config :: set ( 'system' , 'maintenance' , 1 );
2015-11-11 22:39:14 +00:00
2018-01-17 18:42:40 +00:00
if ( Addon :: isEnabled ( 'forumlist' )) {
2018-01-17 19:22:38 +00:00
$addon = 'forumlist' ;
$addons = Config :: get ( 'system' , 'addon' );
$addons_arr = [];
2015-11-12 15:42:27 +00:00
2018-01-17 19:22:38 +00:00
if ( $addons ) {
2018-12-21 09:36:01 +00:00
$addons_arr = explode ( " , " , str_replace ( " " , " " , $addons ));
2015-11-12 15:42:27 +00:00
2018-01-17 19:22:38 +00:00
$idx = array_search ( $addon , $addons_arr );
2018-12-21 09:36:01 +00:00
if ( $idx !== false ) {
2018-01-17 19:22:38 +00:00
unset ( $addons_arr [ $idx ]);
2016-10-02 01:40:41 +00:00
//delete forumlist manually from addon and hook table
2018-01-17 18:42:40 +00:00
// since Addon::uninstall() don't work here
2015-11-12 23:16:39 +00:00
q ( " DELETE FROM `addon` WHERE `name` = 'forumlist' " );
q ( " DELETE FROM `hook` WHERE `file` = 'addon/forumlist/forumlist.php' " );
2018-12-21 09:36:01 +00:00
Config :: set ( 'system' , 'addon' , implode ( " , " , $addons_arr ));
2015-11-11 22:39:14 +00:00
}
}
}
2015-11-12 15:42:27 +00:00
// select old formlist addon entries
2018-12-21 10:49:38 +00:00
$r = q ( " SELECT `uid`, `cat`, `k`, `v` FROM `pconfig` WHERE `cat` = '%s' " ,
2018-07-21 13:10:13 +00:00
DBA :: escape ( 'forumlist' )
2015-11-11 22:40:26 +00:00
);
2015-11-11 22:39:14 +00:00
2015-11-12 15:42:27 +00:00
// convert old forumlist addon entries in new config entries
2018-07-21 12:46:04 +00:00
if ( DBA :: isResult ( $r )) {
2015-11-12 15:42:27 +00:00
foreach ( $r as $rr ) {
$uid = $rr [ 'uid' ];
$family = $rr [ 'cat' ];
$key = $rr [ 'k' ];
$value = $rr [ 'v' ];
2015-11-11 22:39:14 +00:00
2018-12-21 09:36:01 +00:00
if ( $key === 'randomise' ) {
PConfig :: delete ( $uid , $family , $key );
}
2015-11-11 22:39:14 +00:00
2015-11-12 15:42:27 +00:00
if ( $key === 'show_on_profile' ) {
2018-12-21 09:36:01 +00:00
if ( $value ) {
PConfig :: set ( $uid , feature , forumlist_profile , $value );
}
2015-11-11 22:39:14 +00:00
2018-12-21 09:36:01 +00:00
PConfig :: delete ( $uid , $family , $key );
2015-11-12 15:42:27 +00:00
}
2015-11-11 22:39:14 +00:00
2015-11-12 15:42:27 +00:00
if ( $key === 'show_on_network' ) {
2018-12-21 09:36:01 +00:00
if ( $value ) {
PConfig :: set ( $uid , feature , forumlist_widget , $value );
}
2015-11-11 22:39:14 +00:00
2018-12-21 09:36:01 +00:00
PConfig :: delete ( $uid , $family , $key );
2015-11-12 15:42:27 +00:00
}
2015-11-11 22:39:14 +00:00
}
}
2015-11-12 15:42:27 +00:00
2017-11-07 02:22:52 +00:00
Config :: set ( 'system' , 'maintenance' , 0 );
2015-11-12 15:42:27 +00:00
2018-10-14 11:19:37 +00:00
return Update :: SUCCESS ;
2015-11-11 22:39:14 +00:00
}
2016-09-26 19:35:01 +00:00
2018-12-21 09:36:01 +00:00
function update_1203 ()
{
2018-12-21 10:49:38 +00:00
$r = q ( " UPDATE `user` SET `account-type` = %d WHERE `page-flags` IN (%d, %d) " ,
2019-01-07 04:49:13 +00:00
DBA :: escape ( User :: ACCOUNT_TYPE_COMMUNITY ),
2019-01-06 17:37:48 +00:00
DBA :: escape ( User :: PAGE_FLAGS_COMMUNITY ),
DBA :: escape ( User :: PAGE_FLAGS_PRVGROUP )
2018-12-21 09:36:01 +00:00
);
2016-10-09 07:01:19 +00:00
}
2018-01-21 03:37:13 +00:00
2018-12-21 09:36:01 +00:00
function update_1244 ()
{
2018-01-21 03:37:13 +00:00
// Sets legacy_password for all legacy hashes
2018-07-20 12:19:26 +00:00
DBA :: update ( 'user' , [ 'legacy_password' => true ], [ 'SUBSTR(password, 1, 4) != "$2y$"' ]);
2018-01-21 03:37:13 +00:00
// All legacy hashes are re-hashed using the new secure hashing function
2018-07-20 12:19:26 +00:00
$stmt = DBA :: select ( 'user' , [ 'uid' , 'password' ], [ 'legacy_password' => true ]);
2018-12-21 09:36:01 +00:00
while ( $user = DBA :: fetch ( $stmt )) {
2018-07-20 12:19:26 +00:00
DBA :: update ( 'user' , [ 'password' => User :: hashPassword ( $user [ 'password' ])], [ 'uid' => $user [ 'uid' ]]);
2018-01-21 03:37:13 +00:00
}
// Logged in users are forcibly logged out
2018-07-20 12:19:26 +00:00
DBA :: delete ( 'session' , [ '1 = 1' ]);
2018-01-21 03:37:13 +00:00
2018-10-14 11:19:37 +00:00
return Update :: SUCCESS ;
2018-01-21 03:37:13 +00:00
}
2018-01-22 22:58:03 +00:00
2018-12-21 09:36:01 +00:00
function update_1245 ()
{
2018-01-22 22:58:03 +00:00
$rino = Config :: get ( 'system' , 'rino_encrypt' );
if ( ! $rino ) {
2018-10-14 11:19:37 +00:00
return Update :: SUCCESS ;
2018-01-22 22:58:03 +00:00
}
Config :: set ( 'system' , 'rino_encrypt' , 1 );
2018-10-14 11:19:37 +00:00
return Update :: SUCCESS ;
2018-01-22 22:58:03 +00:00
}
2018-01-23 23:57:51 +00:00
2018-12-21 09:36:01 +00:00
function update_1247 ()
{
2018-01-23 23:57:51 +00:00
// Removing hooks with the old name
2018-07-20 12:19:26 +00:00
DBA :: e ( " DELETE FROM `hook`
2018-01-23 23:57:51 +00:00
WHERE `hook` LIKE 'plugin_%' " );
// Make sure we install the new renamed ones
Addon :: reload ();
}
2018-05-08 17:50:06 +00:00
2018-12-21 09:36:01 +00:00
function update_1260 ()
{
2018-05-08 17:50:06 +00:00
Config :: set ( 'system' , 'maintenance' , 1 );
2018-12-21 09:42:24 +00:00
Config :: set (
'system' ,
'maintenance_reason' ,
L10n :: t (
'%s: Updating author-id and owner-id in item and thread table. ' ,
DateTimeFormat :: utcNow () . ' ' . date ( 'e' )
)
);
2018-05-08 17:50:06 +00:00
2018-07-20 12:19:26 +00:00
$items = DBA :: p ( " SELECT `id`, `owner-link`, `owner-name`, `owner-avatar`, `network` FROM `item`
2018-05-08 17:50:06 +00:00
WHERE `owner-id` = 0 AND `owner-link` != '' " );
2018-07-20 12:19:26 +00:00
while ( $item = DBA :: fetch ( $items )) {
2018-05-08 17:50:06 +00:00
$contact = [ 'url' => $item [ 'owner-link' ], 'name' => $item [ 'owner-name' ],
2018-05-09 07:09:47 +00:00
'photo' => $item [ 'owner-avatar' ], 'network' => $item [ 'network' ]];
2018-05-08 17:50:06 +00:00
$cid = Contact :: getIdForURL ( $item [ 'owner-link' ], 0 , false , $contact );
if ( empty ( $cid )) {
continue ;
}
Item :: update ([ 'owner-id' => $cid ], [ 'id' => $item [ 'id' ]]);
}
2018-07-20 12:19:26 +00:00
DBA :: close ( $items );
2018-05-08 17:50:06 +00:00
2018-07-20 12:19:26 +00:00
DBA :: e ( " UPDATE `thread` INNER JOIN `item` ON `thread`.`iid` = `item`.`id`
2018-05-08 17:50:06 +00:00
SET `thread` . `owner-id` = `item` . `owner-id` WHERE `thread` . `owner-id` = 0 " );
2018-07-20 12:19:26 +00:00
$items = DBA :: p ( " SELECT `id`, `author-link`, `author-name`, `author-avatar`, `network` FROM `item`
2018-05-08 17:50:06 +00:00
WHERE `author-id` = 0 AND `author-link` != '' " );
2018-07-20 12:19:26 +00:00
while ( $item = DBA :: fetch ( $items )) {
2018-05-08 17:50:06 +00:00
$contact = [ 'url' => $item [ 'author-link' ], 'name' => $item [ 'author-name' ],
2018-05-09 07:09:47 +00:00
'photo' => $item [ 'author-avatar' ], 'network' => $item [ 'network' ]];
2018-05-08 17:50:06 +00:00
$cid = Contact :: getIdForURL ( $item [ 'author-link' ], 0 , false , $contact );
if ( empty ( $cid )) {
continue ;
}
Item :: update ([ 'author-id' => $cid ], [ 'id' => $item [ 'id' ]]);
}
2018-07-20 12:19:26 +00:00
DBA :: close ( $items );
2018-05-08 17:50:06 +00:00
2018-07-20 12:19:26 +00:00
DBA :: e ( " UPDATE `thread` INNER JOIN `item` ON `thread`.`iid` = `item`.`id`
2018-05-08 17:50:06 +00:00
SET `thread` . `author-id` = `item` . `author-id` WHERE `thread` . `author-id` = 0 " );
Config :: set ( 'system' , 'maintenance' , 0 );
2018-10-14 11:19:37 +00:00
return Update :: SUCCESS ;
2018-05-08 17:50:06 +00:00
}
2018-05-10 10:41:32 +00:00
2018-12-21 09:36:01 +00:00
function update_1261 ()
{
2018-05-10 10:41:32 +00:00
// This fixes the results of an issue in the develop branch of 2018-05.
2018-12-21 10:30:13 +00:00
DBA :: update ( 'contact' , [ 'blocked' => false , 'pending' => false ], [ 'uid' => 0 , 'blocked' => true , 'pending' => true ]);
2018-10-14 11:19:37 +00:00
return Update :: SUCCESS ;
2018-05-10 10:41:32 +00:00
}
2018-07-19 13:52:05 +00:00
2018-12-21 09:36:01 +00:00
function update_1278 ()
{
2018-07-19 13:52:05 +00:00
Config :: set ( 'system' , 'maintenance' , 1 );
2018-12-21 09:42:24 +00:00
Config :: set (
'system' ,
'maintenance_reason' ,
L10n :: t (
'%s: Updating post-type.' ,
DateTimeFormat :: utcNow () . ' ' . date ( 'e' )
)
);
2018-07-19 13:52:05 +00:00
Item :: update ([ 'post-type' => Item :: PT_PAGE ], [ 'bookmark' => true ]);
Item :: update ([ 'post-type' => Item :: PT_PERSONAL_NOTE ], [ 'type' => 'note' ]);
Config :: set ( 'system' , 'maintenance' , 0 );
2018-10-14 11:19:37 +00:00
return Update :: SUCCESS ;
2018-07-19 13:52:05 +00:00
}
2018-10-17 18:34:24 +00:00
2018-12-21 09:36:01 +00:00
function update_1288 ()
{
2018-10-17 18:34:24 +00:00
// Updates missing `uri-id` values
2018-12-21 10:30:13 +00:00
DBA :: e ( " UPDATE `item-activity` INNER JOIN `item` ON `item`.`iaid` = `item-activity`.`id` SET `item-activity`.`uri-id` = `item`.`uri-id` WHERE `item-activity`.`uri-id` IS NULL OR `item-activity`.`uri-id` = 0 " );
DBA :: e ( " UPDATE `item-content` INNER JOIN `item` ON `item`.`icid` = `item-content`.`id` SET `item-content`.`uri-id` = `item`.`uri-id` WHERE `item-content`.`uri-id` IS NULL OR `item-content`.`uri-id` = 0 " );
2018-10-17 18:34:24 +00:00
2018-10-29 09:16:07 +00:00
return Update :: SUCCESS ;
2018-10-17 18:34:24 +00:00
}
2018-12-18 16:53:00 +00:00
// Post-update script of PR 5751
2018-12-24 10:15:32 +00:00
function update_1298 ()
2018-12-20 10:49:58 +00:00
{
2018-12-24 10:15:32 +00:00
$keys = [ 'gender' , 'marital' , 'sexual' ];
foreach ( $keys as $translateKey ) {
$allData = DBA :: select ( 'profile' , [ 'id' , $translateKey ]);
$allLangs = L10n :: getAvailableLanguages ();
$success = 0 ;
$fail = 0 ;
foreach ( $allData as $key => $data ) {
$toTranslate = $data [ $translateKey ];
if ( $toTranslate != '' ) {
foreach ( $allLangs as $key => $lang ) {
$a = new \stdClass ();
$a -> strings = [];
// First we get the the localizations
if ( file_exists ( " view/lang/ $lang /strings.php " )) {
include " view/lang/ $lang /strings.php " ;
}
if ( file_exists ( " addon/morechoice/lang/ $lang /strings.php " )) {
include " addon/morechoice/lang/ $lang /strings.php " ;
}
$localizedStrings = $a -> strings ;
unset ( $a );
$key = array_search ( $toTranslate , $localizedStrings );
if ( $key !== false ) {
break ;
}
// defaulting to empty string
$key = '' ;
2018-12-20 16:43:07 +00:00
}
2018-12-24 10:15:32 +00:00
if ( $key == '' ) {
$fail ++ ;
} else {
DBA :: update ( 'profile' , [ $translateKey => $key ], [ 'id' => $data [ 'id' ]]);
2018-12-30 20:42:56 +00:00
Logger :: notice ( 'Updated contact' , [ 'action' => 'update' , 'contact' => $data [ 'id' ], " $translateKey " => $key ,
'was' => $data [ $translateKey ]]);
2018-12-24 10:15:32 +00:00
Worker :: add ( PRIORITY_LOW , 'ProfileUpdate' , $data [ 'id' ]);
Contact :: updateSelfFromUserID ( $data [ 'id' ]);
GContact :: updateForUser ( $data [ 'id' ]);
$success ++ ;
2018-12-20 16:43:07 +00:00
}
2018-12-18 16:53:00 +00:00
}
}
2018-12-24 09:53:44 +00:00
2018-12-30 20:42:56 +00:00
Logger :: notice ( $translateKey . " fix completed " , [ 'action' => 'update' , 'translateKey' => $translateKey , 'Success' => $success , 'Fail' => $fail ]);
2018-12-24 09:53:44 +00:00
}
return Update :: SUCCESS ;
}
2019-03-23 14:40:09 +00:00
/**
* @ see https :// github . com / friendica / friendica / pull / 6815
*
* @ return int Success
*/
function update_1303 ()
{
$app = \Friendica\BaseObject :: getApp ();
$configCache = $app -> getConfigCache ();
$configCacheSaver = new ConfigCacheSaver ( $app -> getBasePath ());
$updateConfigEntry = function ( $cat , $key ) use ( $configCache , $configCacheSaver ) {
// check if the config file differs from the whole configuration (= The db contains other values)
$fileConfig = $configCache -> get ( $cat , $key );
if ( $fileConfig === '!<unset>!' ) {
$fileConfig = null ;
}
$savedConfig = Config :: get ( $cat , $key , null , true );
if ( $fileConfig !== $savedConfig ) {
Logger :: info ( 'Difference in config found' , [ 'cat' => $cat , 'key' => $key , 'file' => $fileConfig , 'saved' => $savedConfig ]);
$configCacheSaver -> saveToConfigFile ( $cat , $key , $savedConfig );
} else {
Logger :: info ( 'No Difference in config found' , [ 'cat' => $cat , 'key' => $key , 'value' => $fileConfig , 'saved' => $savedConfig ]);
}
};
$updateConfigEntry ( 'config' , 'hostname' );
$updateConfigEntry ( 'system' , 'basepath' );
return Update :: SUCCESS ;
}