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 ;
2018-07-21 12:25:11 +00:00
use Friendica\Util\DateTimeFormat ;
2019-04-05 18:04:39 +00:00
use Friendica\Worker\Delivery ;
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
*
2019-06-23 17:56:21 +00:00
* Database structure changes are done in static / 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
2019-06-23 17:56:21 +00:00
* 2. Apply the needed structural changes in static / dbStructure . php
* 3. Set DB_UPDATE_VERSION in static / 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 ]]);
2019-04-05 18:04:39 +00:00
Worker :: add ( PRIORITY_LOW , 'ProfileUpdate' , $data [ 'id' ]);
2018-12-24 10:15:32 +00:00
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-04-05 18:04:39 +00:00
function update_1309 ()
{
$queue = DBA :: select ( 'queue' , [ 'id' , 'cid' , 'guid' ]);
while ( $entry = DBA :: fetch ( $queue )) {
$contact = DBA :: selectFirst ( 'contact' , [ 'uid' ], [ 'id' => $entry [ 'cid' ]]);
if ( ! DBA :: isResult ( $contact )) {
continue ;
}
$item = Item :: selectFirst ([ 'id' , 'gravity' ], [ 'uid' => $contact [ 'uid' ], 'guid' => $entry [ 'guid' ]]);
if ( ! DBA :: isResult ( $item )) {
continue ;
}
$deliver_options = [ 'priority' => PRIORITY_MEDIUM , 'dont_fork' => true ];
2019-06-10 14:19:24 +00:00
Worker :: add ( $deliver_options , 'Delivery' , Delivery :: POST , $item [ 'id' ], $entry [ 'cid' ]);
2019-04-05 18:04:39 +00:00
Logger :: info ( 'Added delivery worker' , [ 'command' => $cmd , 'item' => $item [ 'id' ], 'contact' => $entry [ 'cid' ]]);
2019-04-05 20:24:49 +00:00
DBA :: delete ( 'queue' , [ 'id' => $entry [ 'id' ]]);
2019-04-05 18:04:39 +00:00
}
return Update :: SUCCESS ;
}
2019-06-29 08:30:48 +00:00
function update_1315 ()
{
DBA :: delete ( 'item-delivery-data' , [ 'postopts' => '' , 'inform' => '' , 'queue_count' => 0 , 'queue_done' => 0 ]);
2019-07-09 07:23:36 +00:00
return Update :: SUCCESS ;
}
function update_1318 ()
{
DBA :: update ( 'profile' , [ 'marital' => " In a relation " ], [ 'marital' => " Unavailable " ]);
DBA :: update ( 'profile' , [ 'marital' => " Single " ], [ 'marital' => " Available " ]);
Worker :: add ( PRIORITY_LOW , 'ProfileUpdate' );
return Update :: SUCCESS ;
2019-07-07 22:00:48 +00:00
}
2019-09-19 03:54:54 +00:00
function update_1323 ()
{
$users = DBA :: select ( 'user' , [ 'uid' ]);
while ( $user = DBA :: fetch ( $users )) {
Contact :: updateSelfFromUserID ( $user [ 'uid' ]);
}
DBA :: close ( $users );
return Update :: SUCCESS ;
}
2019-12-17 07:10:55 +00:00
function update_1327 ()
{
$contacts = DBA :: select ( 'contact' , [ 'uid' , 'id' , 'blocked' , 'readonly' ], [ " `uid` != ? AND (`blocked` OR `readonly`) AND NOT `pending` " , 0 ]);
while ( $contact = DBA :: fetch ( $contacts )) {
Contact :: setBlockedForUser ( $contact [ 'id' ], $contact [ 'uid' ], $contact [ 'blocked' ]);
Contact :: setIgnoredForUser ( $contact [ 'id' ], $contact [ 'uid' ], $contact [ 'readonly' ]);
}
DBA :: close ( $contacts );
return Update :: SUCCESS ;
}