X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FOStatus%2Fscripts%2Ffixup-shadow.php;h=817ef4eb166cc9f97225443fd57ac564e4a63bb2;hb=d3ef7d81e60c660b574aa681dcc7aed77841f509;hp=ec014c7878b5acaceae36b0610a0259128aaa13e;hpb=c0f657200165faeb1ddd60230d0dc2ca2f404cb4;p=quix0rs-gnu-social.git diff --git a/plugins/OStatus/scripts/fixup-shadow.php b/plugins/OStatus/scripts/fixup-shadow.php index ec014c7878..817ef4eb16 100644 --- a/plugins/OStatus/scripts/fixup-shadow.php +++ b/plugins/OStatus/scripts/fixup-shadow.php @@ -31,10 +31,106 @@ for local users and groups. END_OF_USERROLE_HELP; -require_once INSTALLDIR.'/scripts/commandline.inc'; +require_once INSTALLDIR.'/scripts/commandline.inc.php'; $dry = have_option('dry-run'); +// Look for user.uri matches... These may not match up with the current +// URL schema if the site has changed names. +echo "Checking for bogus ostatus_profile entries matching user.uri...\n"; + +$user = new User(); +$oprofile = new Ostatus_profile(); +$user->joinAdd($oprofile, 'INNER', 'oprofile', 'uri'); +$user->find(); +$count = $user->N; +echo "Found $count...\n"; + +while ($user->fetch()) { + $uri = $user->getUri(); + echo "user $user->id ($user->nickname) hidden by $uri"; + if ($dry) { + echo " - skipping\n"; + } else { + echo " - removing bogus ostatus_profile entry..."; + $evil = Ostatus_profile::getKV('uri', $uri); + $evil->delete(); + echo " ok\n"; + } +} +echo "\n"; + +// Also try user_group.uri matches for local groups. +// Not all group entries will have this filled out, though, as it's new! +echo "Checking for bogus ostatus_profile entries matching local user_group.uri...\n"; +$group = new User_group(); +$group->joinAdd(array('uri', 'ostatus_profile:uri')); +$group->joinAdd(array('id', 'local_group:group_id')); +$group->find(); +$count = $group->N; +echo "Found $count...\n"; + +while ($group->fetch()) { + $uri = $group->getUri(); + echo "group $group->id ($group->nickname) hidden by $uri"; + if ($dry) { + echo " - skipping\n"; + } else { + echo " - removing bogus ostatus_profile entry..."; + $evil = Ostatus_profile::getKV('uri', $uri); + $evil->delete(); + echo " ok\n"; + } +} +echo "\n"; + +// And there may be user_group entries remaining where we've already killed +// the ostatus_profile. These were "harmless" until our lookup started actually +// using the uri field, at which point we can clearly see it breaks stuff. +echo "Checking for leftover bogus user_group.uri entries obscuring local_group entries...\n"; + +$group = new User_group(); +$group->joinAdd(array('id', 'local_group:group_id'), 'LEFT'); +$group->whereAdd('group_id IS NULL'); + + +$marker = mt_rand(31337, 31337000); +$groupTemplate = common_local_url('groupbyid', array('id' => $marker)); +$encGroup = $group->escape($groupTemplate, true); +$encGroup = str_replace($marker, '%', $encGroup); +echo " LIKE '$encGroup'\n"; +$group->whereAdd("uri LIKE '$encGroup'"); + +$group->find(); +$count = $group->N; +echo "Found $count...\n"; + +while ($group->fetch()) { + $uri = $group->getUri(); + if (preg_match('!/group/(\d+)/id!', $uri, $matches)) { + $id = intval($matches[1]); + $local = Local_group::getKV('group_id', $id); + if ($local) { + $nick = $local->nickname; + } else { + $nick = ''; + } + echo "local group $id ($local->nickname) hidden by $uri (bogus group id $group->id)"; + if ($dry) { + echo " - skipping\n"; + } else { + echo " - removing bogus user_group entry..."; + $evil = User_group::getKV('id', $group->id); + $evil->delete(); + echo " ok\n"; + } + } +} +echo "\n"; + + +// Fallback? +echo "Checking for bogus profiles blocking local users/groups by URI pattern match...\n"; $oprofile = new Ostatus_profile(); $marker = mt_rand(31337, 31337000); @@ -42,28 +138,58 @@ $marker = mt_rand(31337, 31337000); $profileTemplate = common_local_url('userbyid', array('id' => $marker)); $encProfile = $oprofile->escape($profileTemplate, true); $encProfile = str_replace($marker, '%', $encProfile); +echo " LIKE '$encProfile'\n"; $groupTemplate = common_local_url('groupbyid', array('id' => $marker)); $encGroup = $oprofile->escape($groupTemplate, true); $encGroup = str_replace($marker, '%', $encGroup); +echo " LIKE '$encGroup'\n"; $sql = "SELECT * FROM ostatus_profile WHERE uri LIKE '%s' OR uri LIKE '%s'"; $oprofile->query(sprintf($sql, $encProfile, $encGroup)); -echo "Found $oprofile->N bogus ostatus_profile entries for local users and groups:\n"; +$count = $oprofile->N; +echo "Found $count...\n"; while ($oprofile->fetch()) { - echo "$oprofile->uri"; + $uri = $oprofile->getUri(); + if (preg_match('!/group/(\d+)/id!', $oprofile->getUri(), $matches)) { + $id = intval($matches[1]); + $group = Local_group::getKV('group_id', $id); + if ($group instanceof Local_group) { + $nick = $group->nickname; + } else { + $nick = ''; + } + echo "group $id ($nick) hidden by $uri"; + } else if (preg_match('!/user/(\d+)!', $uri, $matches)) { + $id = intval($matches[1]); + $user = User::getKV('id', $id); + + if ($user instanceof User) { + $nick = $user->nickname; + } else { + $nick = ''; + } + + echo "user $id ($nick) hidden by $uri"; + } else { + echo "$uri matched query, but we don't recognize it.\n"; + continue; + } if ($dry) { - echo " (unchanged)\n"; + echo " - skipping\n"; } else { - echo " removing bogus ostatus_profile entry..."; + echo " - removing bogus ostatus_profile entry..."; $evil = clone($oprofile); $evil->delete(); echo " ok\n"; } } -echo "done.\n"; - +if ($count && $dry) { + echo "NO CHANGES MADE -- To delete the bogus entries, run again without --dry-run option.\n"; +} else { + echo "done.\n"; +}