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