/** * Fetch informations about the user uploading, prepare prefixes list content, and * set the default item to select. It also updates the special page DestFileName * attribute. Attached to hooks: * <ul> * <li>$wgHooks['UploadForm:initial']</li> * <li>$wgHooks['UploadForm:BeforeProcessing']</li> * </ul> * @param SpecialPage $specialUploadObj current SpecialUpload page object * @todo if the user cannot upload a new file, maybe this function should * however return true, as seen in SpecialUpload page code comments (but if * true returned, the form is displayed with our error message on top) */ public static function fetchRequestInformations($specialUploadObj) { $user = $specialUploadObj->getUser(); self::$USER_IS_WP_ADMIN = $user->isAllowed(WP_ADMIN_RIGHT); if (self::$USER_IS_WP_ADMIN || !self::$DISPLAY_UPLOAD_MOD) { return true; // no informations to fetch and nothing to prepare, using standard form } $full_title = $specialUploadObj->getFullTitle(); $request = $specialUploadObj->getRequest(); // update special page DestFileName attribute $final_wp_filename = self::getDestinationFileName($request); if ($final_wp_filename != null) { $specialUploadObj->mDesiredDestName = $final_wp_filename; wfDebugLog('wikiplaces-debug', 'fetchRequestInformations, mDesiredDestName set to "' . $final_wp_filename . '"'); } $final_wp_file_title = Title::newFromText($final_wp_filename, NS_FILE); // is the user re uploading a new version of an existing file or followed a "upload a file with this name" link ? if ($request->getText('wpDestFile') && !$request->getText('wpDestFileMainPart')) { $result = true; wfRunHooks('userCan', array(&$final_wp_file_title, &$user, 'upload', &$result)); if ($result !== true) { wfDebugLog('wikiplaces-debug', 'WikiplaceUpload::fetchRequestInformations userCan returned ' . print_r($result, true)); $specialUploadObj->getOutput()->showErrorPage('sorry', wfMessage('badaccess-group0')); // not allowed return false; // break SpecialUpload page init/processing } // Check getUserPermissionsErrors hook (this behavior is suitable for nonessential UI // controls because it skips potentially expensive cascading permission checks, but may // provide false positives) wfRunHooks('getUserPermissionsErrors', array(&$final_wp_file_title, &$user, 'upload', &$result)); if ($result !== true) { wfDebugLog('wikiplaces-debug', print_r($result, true)); // WikiplacesHooks::getUserPermissionsErrors($final_wp_file_title, $user, 'upload', $result); if (is_array($result) && !empty($result)) { $key = array_shift($result); $specialUploadObj->getOutput()->showErrorPage('sorry', wfMessage($key, $result)); return false; // break SpecialUpload page init/processing } else { $specialUploadObj->getOutput()->showErrorPage('sorry', wfMessage('badaccess-group0')); // not allowed return false; // break SpecialUpload page init/processing } } // she is reuploading or has followed a "upload a file with this name" link wfDebugLog('wikiplaces-debug', 'fetchRequestInformations: reuploading, so disabling mod'); self::$WPDESTFILE_READONLY = true; // ensure that the filename field is readonly when create link followed self::$DISPLAY_UPLOAD_MOD = false; return true; // no informations to fetch and nothing to prepare } // ( if we arrive here, we are uploading a new file ) // is there a wikiplace specified in the url ? // search a GET parameter, as seen in SpecialPageFactory around line 408 $db_key = $full_title->getDBkey(); $bits = explode('/', $db_key, 2); $param = null; if (isset($bits[1])) { $param = $bits[1]; } // is the user trying to upload a public file ? if ($param === WP_PUBLIC_FILE_PREFIX || $final_wp_file_title instanceof Title && WpPage::isPublic(NS_FILE, $final_wp_file_title->getDBkey())) { // there is a "Public" param, there will be only one choice in the listbox wfDebugLog('wikiplaces-debug', 'fetchRequestInformations: only public prefix will be visible'); self::$FILE_PREFIXES[$param] = WP_PUBLIC_FILE_PREFIX; self::$FILE_PREFIXES_DEFAULT = $param; } else { // get all wikiplaces the user has access to $wikiplacesOwner = WpWikiplace::factoryAllOwnedByUserId($user->getId()); $wikiplacesMember = WpWikiplace::factoryAllWhereUserIsMember($user->getId()); // check if the user has access to at least one wikiplace if (count($wikiplacesOwner) + count($wikiplacesMember) == 0) { $specialUploadObj->getOutput()->showErrorPage('sorry', wfMessage('wp-create-wp-first')); return false; // break SpecialUpload page init/processing } // multiple choice: prepare full prefixes list foreach ($wikiplacesOwner as $wikiplace) { $wpw_name = $wikiplace->getName(); self::$FILE_PREFIXES[$wpw_name] = $wpw_name; } foreach ($wikiplacesMember as $wikiplace) { $wpw_name = $wikiplace->getName(); self::$FILE_PREFIXES[$wpw_name] = $wpw_name; } // do we have to set a default value ? if ($param != null && array_key_exists($param, self::$FILE_PREFIXES)) { if (!self::$FILE_PREFIXES_DEFAULT) { self::$FILE_PREFIXES_DEFAULT = $param; } } } return true; // continue hook processing }
/** * Hook: SpecialContributionsBeforeMainOutput * @param int $id * @param User $user * @param SpecialPage $page */ public static function addNewContributionButton($id, User $user, SpecialPage $page) { global $wgContentTranslationEventLogging; if ($user->getId() === $page->getUser()->getId() && ContentTranslationHooks::isEnabledForUser($user)) { // If EventLogging integration is enabled, load the event logging functions module if ($wgContentTranslationEventLogging) { $page->getOutput()->addModules('ext.cx.eventlogging'); } $page->getOutput()->addModules('ext.cx.contributions.init'); } }
/** * Links to different places. * * @note This function is also called in DeletedContributionsPage * @param SpecialPage $sp SpecialPage instance, for context * @param User $target Target user object * @return array */ public static function getUserLinks(SpecialPage $sp, User $target) { $id = $target->getId(); $username = $target->getName(); $userpage = $target->getUserPage(); $talkpage = $target->getTalkPage(); $linkRenderer = $sp->getLinkRenderer(); $tools['user-talk'] = $linkRenderer->makeLink($talkpage, $sp->msg('sp-contributions-talk')->text()); if ($id !== null || $id === null && IP::isIPAddress($username)) { if ($sp->getUser()->isAllowed('block')) { # Block / Change block / Unblock links if ($target->isBlocked() && $target->getBlock()->getType() != Block::TYPE_AUTO) { $tools['block'] = $linkRenderer->makeKnownLink(SpecialPage::getTitleFor('Block', $username), $sp->msg('change-blocklink')->text()); $tools['unblock'] = $linkRenderer->makeKnownLink(SpecialPage::getTitleFor('Unblock', $username), $sp->msg('unblocklink')->text()); } else { # User is not blocked $tools['block'] = $linkRenderer->makeKnownLink(SpecialPage::getTitleFor('Block', $username), $sp->msg('blocklink')->text()); } } # Block log link $tools['log-block'] = $linkRenderer->makeKnownLink(SpecialPage::getTitleFor('Log', 'block'), $sp->msg('sp-contributions-blocklog')->text(), [], ['page' => $userpage->getPrefixedText()]); # Suppression log link (bug 59120) if ($sp->getUser()->isAllowed('suppressionlog')) { $tools['log-suppression'] = $linkRenderer->makeKnownLink(SpecialPage::getTitleFor('Log', 'suppress'), $sp->msg('sp-contributions-suppresslog', $username)->text(), [], ['offender' => $username]); } } # Uploads $tools['uploads'] = $linkRenderer->makeKnownLink(SpecialPage::getTitleFor('Listfiles', $username), $sp->msg('sp-contributions-uploads')->text()); # Other logs link $tools['logs'] = $linkRenderer->makeKnownLink(SpecialPage::getTitleFor('Log', $username), $sp->msg('sp-contributions-logs')->text()); # Add link to deleted user contributions for priviledged users if ($sp->getUser()->isAllowed('deletedhistory')) { $tools['deletedcontribs'] = $linkRenderer->makeKnownLink(SpecialPage::getTitleFor('DeletedContributions', $username), $sp->msg('sp-contributions-deleted', $username)->text()); } # Add a link to change user rights for privileged users $userrightsPage = new UserrightsPage(); $userrightsPage->setContext($sp->getContext()); if ($userrightsPage->userCanChangeRights($target)) { $tools['userrights'] = $linkRenderer->makeKnownLink(SpecialPage::getTitleFor('Userrights', $username), $sp->msg('sp-contributions-userrights')->text()); } Hooks::run('ContributionsToolLinks', [$id, $userpage, &$tools, $sp]); return $tools; }
/** * Get the User being used for this instance. * SpecialPage extends ContextSource as of 1.18. * * @since 0.1 * * @return User */ public function getUser() { return version_compare($GLOBALS['wgVersion'], '1.18', '>') ? parent::getUser() : $GLOBALS['wgUser']; }