isUploadAllowed() && $this->isUserUploadAllowed( $this->getUser() ) ) ) { return; } $this->setHeaders(); $this->outputHeader(); $req = $this->getRequest(); $urlArgs = [ 'caption', 'description', 'lat', 'lon', 'alt' ]; $urlDefaults = []; foreach ( $urlArgs as $arg ) { $value = $req->getText( $arg ); if ( $value ) { $urlDefaults[$arg] = $value; } } $categories = $req->getText( 'categories' ); if ( $categories ) { $urlDefaults['categories'] = explode( '|', $categories ); } $urlDefaults['objref'] = $req->getText( 'objref' ) ?: ''; $urlDefaults['updateList'] = $req->getText( 'updateList' ) ?: ''; UploadWizardConfig::setUrlSetting( 'defaults', $urlDefaults ); $fields = $req->getArray( 'fields' ); $fieldDefaults = []; # Support id and id2 for field0 and field1 # Legacy support for old URL structure. They override fields[] if ( $req->getText( 'id' ) ) { $fields[0] = $req->getText( 'id' ); } if ( $req->getText( 'id2' ) ) { $fields[1] = $req->getText( 'id2' ); } if ( $fields ) { foreach ( $fields as $index => $value ) { $fieldDefaults[$index]['initialValue'] = $value; } } UploadWizardConfig::setUrlSetting( 'fields', $fieldDefaults ); $this->handleCampaign(); $out = $this->getOutput(); // fallback for non-JS $out->addHTML( '
' ); $out->addHTML( '

' . $this->msg( 'mwe-upwiz-unavailable' )->parse() . '

' ); // create a simple form for non-JS fallback, which targets the old Special:Upload page. // at some point, if we completely subsume its functionality, change that to point here again, // but then we'll need to process non-JS uploads in the same way Special:Upload does. $derivativeContext = new DerivativeContext( $this->getContext() ); $derivativeContext->setTitle( SpecialPage::getTitleFor( 'Upload' ) ); $simpleForm = new UploadWizardSimpleForm( [], $derivativeContext, $this->getLinkRenderer() ); $simpleForm->show(); $out->addHTML( '
' ); // global javascript variables $this->addJsVars( $subPage ); // dependencies (css, js) $out->addModules( 'uw.EventFlowLogger' ); $out->addModules( 'ext.uploadWizard.page' ); $out->addModuleStyles( 'ext.uploadWizard.page.styles' ); // where the uploadwizard will go // TODO import more from UploadWizard's createInterface call. $out->addHTML( $this->getWizardHtml() ); } /** * Handles the campaign parameter. * * @since 1.2 */ protected function handleCampaign() { $campaignName = $this->getRequest()->getVal( 'campaign' ); if ( is_null( $campaignName ) ) { $campaignName = UploadWizardConfig::getSetting( 'defaultCampaign' ); } if ( !is_null( $campaignName ) && $campaignName !== '' ) { $campaign = UploadWizardCampaign::newFromName( $campaignName ); if ( $campaign === false ) { $this->displayError( $this->msg( 'mwe-upwiz-error-nosuchcampaign', $campaignName )->text() ); } else { if ( $campaign->getIsEnabled() ) { $this->campaign = $campaignName; } else { $this->displayError( $this->msg( 'mwe-upwiz-error-campaigndisabled', $campaignName )->text() ); } } } } /** * Display an error message. * * @since 1.2 * * @param string $message */ protected function displayError( $message ) { $this->getOutput()->addHTML( Html::element( 'span', [ 'class' => 'errorbox' ], $message ) . '


' ); } /** * Adds some global variables for our use, as well as initializes the UploadWizard * * TODO once bug https://bugzilla.wikimedia.org/show_bug.cgi?id=26901 * is fixed we should package configuration with the upload wizard instead of * in uploadWizard output page. * * @param string $subPage subpage, e.g. the "foo" in Special:UploadWizard/foo */ public function addJsVars( $subPage ) { $config = UploadWizardConfig::getConfig( $this->campaign ); if ( array_key_exists( 'trackingCategory', $config ) ) { if ( array_key_exists( 'campaign', $config['trackingCategory'] ) ) { if ( $this->campaign !== null ) { $config['trackingCategory']['campaign'] = str_replace( '$1', $this->campaign, $config['trackingCategory']['campaign'] ); } else { unset( $config['trackingCategory']['campaign'] ); } } } // UploadFromUrl parameter set to true only if the user is allowed to upload a file // from a URL which we need to check in our Javascript implementation. if ( UploadFromUrl::isEnabled() && UploadFromUrl::isAllowed( $this->getUser() ) === true ) { $config['UploadFromUrl'] = true; } else { $config['UploadFromUrl'] = false; } // Get the user's default license. This will usually be 'default', but // can be a specific license like 'ownwork-cc-zero'. $userDefaultLicense = $this->getUser()->getOption( 'upwiz_deflicense' ); if ( $userDefaultLicense !== 'default' ) { $licenseParts = explode( '-', $userDefaultLicense, 2 ); $userLicenseType = $licenseParts[0]; $userDefaultLicense = $licenseParts[1]; // Determine if the user's default license is valid for this campaign switch ( $config['licensing']['ownWorkDefault'] ) { case "own": $defaultInAllowedLicenses = in_array( $userDefaultLicense, $config['licensing']['ownWork']['licenses'] ); break; case "notown": $defaultInAllowedLicenses = in_array( $userDefaultLicense, UploadWizardConfig::getThirdPartyLicenses() ); break; case "choice": $defaultInAllowedLicenses = ( in_array( $userDefaultLicense, $config['licensing']['ownWork']['licenses'] ) || in_array( $userDefaultLicense, UploadWizardConfig::getThirdPartyLicenses() ) ); break; } if ( $defaultInAllowedLicenses ) { if ( $userLicenseType === 'ownwork' ) { $userLicenseGroup = 'ownWork'; } else { $userLicenseGroup = 'thirdParty'; } $config['licensing'][$userLicenseGroup]['defaults'] = [ $userDefaultLicense ]; $config['licensing']['defaultType'] = $userLicenseType; if ( $userDefaultLicense === 'custom' ) { $config['licenses']['custom']['defaultText'] = $this->getUser()->getOption( 'upwiz_deflicense_custom' ); } } } // add an 'uploadwizard' tag, but only if it'll be allowed UploadWizardHooks::onListDefinedTags( $tags ); $status = ChangeTags::canAddTagsAccompanyingChange( $tags, $this->getUser() ); $config['CanAddTags'] = $status->isOK(); $bitmapHandler = new BitmapHandler(); $this->getOutput()->addJsConfigVars( [ 'UploadWizardConfig' => $config, 'wgFileCanRotate' => $bitmapHandler->canRotate(), ] ); } /** * Check if anyone can upload (or if other sitewide config prevents this) * Side effect: will print error page to wgOut if cannot upload. * @return boolean -- true if can upload */ private function isUploadAllowed() { // Check uploading enabled if ( !UploadBase::isEnabled() ) { $this->getOutput()->showErrorPage( 'uploaddisabled', 'uploaddisabledtext' ); return false; } // Check whether we actually want to allow changing stuff if ( wfReadOnly() ) { throw new ReadOnlyError; } // we got all the way here, so it must be okay to upload return true; } /** * Check if the user can upload * Side effect: will print error page to wgOut if cannot upload. * @param User $user * @throws PermissionsError * @throws UserBlockedError * @return boolean -- true if can upload */ private function isUserUploadAllowed( User $user ) { // Check permissions $permissionRequired = UploadBase::isAllowed( $user ); if ( $permissionRequired !== true ) { throw new PermissionsError( $permissionRequired ); } // Check blocks if ( $user->isBlocked() ) { throw new UserBlockedError( $user->getBlock() ); } // Global blocks if ( $user->isBlockedGlobally() ) { throw new UserBlockedError( $user->getGlobalBlock() ); } // we got all the way here, so it must be okay to upload return true; } /** * Return the basic HTML structure for the entire page * Will be enhanced by the javascript to actually do stuff * @return string html */ protected function getWizardHtml() { global $wgExtensionAssetsPath; $config = UploadWizardConfig::getConfig( $this->campaign ); if ( array_key_exists( 'display', $config ) && array_key_exists( 'headerLabel', $config['display'] ) ) { $this->getOutput()->addHtml( $config['display']['headerLabel'] ); } if ( array_key_exists( 'fallbackToAltUploadForm', $config ) && array_key_exists( 'altUploadForm', $config ) && $config['altUploadForm'] != '' && $config[ 'fallbackToAltUploadForm' ] ) { $linkHtml = ''; $altUploadForm = Title::newFromText( $config[ 'altUploadForm' ] ); if ( $altUploadForm instanceof Title ) { $linkHtml = Html::rawElement( 'p', [ 'style' => 'text-align: center;' ], Html::rawElement( 'a', [ 'href' => $altUploadForm->getLocalURL() ], $config['altUploadForm'] ) ); } return Html::rawElement( 'div', [], Html::rawElement( 'p', [ 'style' => 'text-align: center' ], wfMessage( 'mwe-upwiz-extension-disabled' )->text() ) . $linkHtml ); } // always load the html: even if the tutorial is skipped, users can // still move back to view it $tutorialHtml = UploadWizardTutorial::getHtml( $this->campaign ); // TODO move this into UploadWizard.js or some other javascript resource so the upload wizard // can be dynamically included ( for example the add media wizard ) // @codingStandardsIgnoreStart return '
' . '' . // if loading takes > 2 seconds display spinner. Note we are evading Resource Loader here, and linking directly. Because we want an image to appear if RL's package is late. // using some  's which is a bit of superstition, to make sure jQuery will hide this (it seems that it doesn't sometimes, when it has no content) // the min-width & max-width is copied from the #uploadWizard properties, so in nice browsers the spinner is right where the button will go. '
' . '  ' . '
' . '
'; // @codingStandardsIgnoreEnd } protected function getGroupName() { return 'media'; } }