diff --git a/OrcidProfilePlugin.inc.php b/OrcidProfilePlugin.inc.php index e8e2d469..53e28d0e 100755 --- a/OrcidProfilePlugin.inc.php +++ b/OrcidProfilePlugin.inc.php @@ -349,6 +349,14 @@ public function handleTemplateDisplay($hookName, $args) return false; } + /** + * Return the location of the plugin's CSS file + * + * @return string + */ + function getStyleSheet() { + return $this->getPluginPath() . '/css/orcidProfile.css'; + } /** @@ -699,14 +707,6 @@ public function handleAdditionalFieldNames($hookName, $params) return false; } - /** - * @copydoc Plugin::getDisplayName() - */ - public function getDisplayName() - { - return __('plugins.generic.orcidProfile.displayName'); - } - /** * @copydoc Plugin::getDescription() */ @@ -779,6 +779,12 @@ public function getActions($request, $actionArgs) __('manager.plugins.settings'), null ), + new LinkAction( + 'status', + new AjaxModal($router->url($request, null, null, 'manage', null, array('verb' => 'status', 'plugin' => $this->getName(), 'category' => 'generic')), $this->getDisplayName()), + __('common.status'), + null + ) ] : [], parent::getActions($request, $actionArgs) ); @@ -787,6 +793,35 @@ public function getActions($request, $actionArgs) /** * @see Plugin::manage() */ + function getDisplayName() { + return __('plugins.generic.orcidProfile.displayName'); + } + + + function setEnabled($enabled) { + $contextId = $this->getCurrentContextId(); + $request = Application::get()->getRequest(); + $validator = new OrcidValidator($this); + + if ($this->isSitePlugin()) { + $contextId = 0; + } + if ($request->getUserVar('save') == 1) { + $clientId = $request->getUserVar('orcidClientId'); + $clientSecret = $request->getUserVar('orcidClientSecret'); + } else { + $clientId = $this->getSetting($contextId, 'orcidClientId'); + $clientSecret = $this->getSetting($contextId, 'orcidClientSecret'); + + } + + if (!$validator->validateClientSecret($clientSecret) or !$validator->validateClientId($clientId)) { + $enabled = false; + + } + $this->updateSetting($contextId, 'enabled', $enabled, 'bool'); + } + public function manage($args, $request) @@ -809,7 +844,8 @@ public function manage($args, $request) 'ERROR' => 'plugins.generic.orcidProfile.manager.settings.logLevel.error', 'ALL' => 'plugins.generic.orcidProfile.manager.settings.logLevel.all' ]); - $this->import('OrcidProfileSettingsForm'); + + $this->import('classes.form.OrcidProfileSettingsForm'); $form = new OrcidProfileSettingsForm($this, $contextId); if ($request->getUserVar('save')) { $form->readInputData(); @@ -820,32 +856,16 @@ public function manage($args, $request) } else { $form->initData(); } + return new JSONMessage(true, $form->fetch($request)); + case 'status': + $this->import('classes.form.OrcidProfileStatusForm'); + $form = new OrcidProfileStatusForm($this, $contextId); + $form->initData(); return new JSONMessage(true, $form->fetch($request)); } return parent::manage($args, $request); } - /** - * Return the location of the plugin's CSS file - * - * @return string - */ - public function getStyleSheet() - { - return $this->getPluginPath() . '/css/orcidProfile.css'; - } - - /** - * Return a string of the ORCiD SVG icon - * - * @return string - */ - public function getIcon() - { - $path = Core::getBaseDir() . '/' . $this->getPluginPath() . '/templates/images/orcid.svg'; - return file_exists($path) ? file_get_contents($path) : ''; - } - /** * handlePublishIssue sends all submissions for which the authors hava an ORCID and access token @@ -1103,7 +1123,7 @@ public function buildOrcidWork($publication, $context, $authors, $request, $issu 'value' => $context->getName($publicationLocale) ?? '' ], 'short-description' => trim(strip_tags($publication->getLocalizedData('abstract', $publicationLocale))) ?? '', - 'type' => 'annotation', + 'external-ids' => [ 'external-id' => $this->buildOrcidExternalIds($submission, $publication, $context, $issue, $publicationUrl) ], @@ -1122,10 +1142,13 @@ public function buildOrcidWork($publication, $context, $authors, $request, $issu $bibtexCitation = trim(strip_tags($citationPlugin->getCitation($request, $submission, 'bibtex', $issue, $publication))); $orcidWork['citation'] = [ 'citation-type' => 'bibtex', - 'citation-value' => $bibtexCitation + 'citation-value' => $bibtexCitation, ]; + $orcidWork['type'] = 'journal-article'; } - + elseif ($applicationName == 'ops') { + $orcidWork['type'] = 'preprint'; + } $translatedTitleAvailable = false; foreach ($supportedSubmissionLocales as $defaultLanguage) { diff --git a/classes/OrcidValidator.inc.php b/classes/OrcidValidator.inc.php new file mode 100644 index 00000000..108b8ef5 --- /dev/null +++ b/classes/OrcidValidator.inc.php @@ -0,0 +1,38 @@ +plugin =& $plugin; + } + + /** + * @param $str + * @return bool + */ + public function validateClientId($str) { + $valid = false; + if (preg_match('/^APP-[\da-zA-Z]{16}|(\d{4}-){3,}\d{3}[\dX]/', $str) == 1) { + $valid = true; + } + return $valid; + } + + /** + * @param $str + * @return bool + */ + public function validateClientSecret($str) { + $valid = false; + if (preg_match('/^(\d|-|[a-f]){36,64}/', $str) == 1) { + $valid = true; + } + return $valid; + } + +} diff --git a/classes/form/OrcidProfileSettingsForm.inc.php b/classes/form/OrcidProfileSettingsForm.inc.php new file mode 100644 index 00000000..a9f06a5e --- /dev/null +++ b/classes/form/OrcidProfileSettingsForm.inc.php @@ -0,0 +1,138 @@ + 'string', + 'orcidClientId' => 'string', + 'orcidClientSecret' => 'string', + 'sendMailToAuthorsOnPublication' => 'bool', + 'logLevel' => 'string', + 'isSandBox' => 'bool', + 'country' => 'string', + 'city' => 'string' + + ); + /** @var $contextId int */ + var $contextId; + + /** @var $plugin object */ + var $plugin; + + var $validator; + + /** + * Constructor + * @param $plugin object + * @param $contextId int + */ + function __construct($plugin, $contextId) { + $this->contextId = $contextId; + $this->plugin = $plugin; + $orcidValidator = new OrcidValidator($plugin); + $this->validator = $orcidValidator; + parent::__construct($plugin->getTemplateResource('settingsForm.tpl')); + $this->addCheck(new FormValidatorPost($this)); + $this->addCheck(new FormValidatorCSRF($this)); + + if (!$this->plugin->isGloballyConfigured()) { + $this->addCheck(new FormValidator($this, 'orcidProfileAPIPath', 'required', 'plugins.generic.orcidProfile.manager.settings.orcidAPIPathRequired')); + $this->addCheck(new FormValidatorCustom($this, 'orcidClientId', 'required', 'plugins.generic.orcidProfile.manager.settings.orcidClientId.error', function ($clientId) { + return $this->validator->validateClientId($clientId); + })); + $this->addCheck(new FormValidatorCustom($this, 'orcidClientSecret', 'required', 'plugins.generic.orcidProfile.manager.settings.orcidClientSecret.error', function ($clientSecret) { + return $this->validator->validateClientSecret($clientSecret); + })); + } + + } + + /** + * Initialize form data. + */ + function initData() { + $contextId = $this->contextId; + $plugin =& $this->plugin; + $this->_data = array(); + foreach (self::CONFIG_VARS as $configVar => $type) { + $this->_data[$configVar] = $plugin->getSetting($contextId, $configVar); + } + } + + /** + * Assign form data to user-submitted data. + */ + function readInputData() { + $this->readUserVars(array_keys(self::CONFIG_VARS)); + } + + /** + * Fetch the form. + * @copydoc Form::fetch() + */ + function fetch($request, $template = null, $display = false) { + $templateMgr = TemplateManager::getManager($request); + $templateMgr->assign('globallyConfigured', $this->plugin->isGloballyConfigured()); + $templateMgr->assign('pluginName', $this->plugin->getName()); + $templateMgr->assign('applicationName', Application::get()->getName()); + return parent::fetch($request, $template, $display); + } + + /** + * @copydoc Form::execute() + */ + function execute(...$functionArgs) { + $plugin =& $this->plugin; + $contextId = $this->contextId; + foreach (self::CONFIG_VARS as $configVar => $type) { + if ($configVar === 'orcidProfileAPIPath') { + $plugin->updateSetting($contextId, $configVar, trim($this->getData($configVar), "\"\';"), $type); + } else { + $plugin->updateSetting($contextId, $configVar, $this->getData($configVar), $type); + } + } + if (strpos($this->getData("orcidProfileAPIPath"), "sandbox.orcid.org") == true) { + $plugin->updateSetting($contextId, "isSandBox", true, "bool"); + } + + parent::execute(...$functionArgs); + } + + public function _checkPrerequisites() { + $messages = array(); + + $clientId = $this->getData('orcidClientId'); + if (!$this->validator->validateClientId($clientId)) { + $messages[] = __('plugins.generic.orcidProfile.manager.settings.orcidClientId.error'); + } + $clientSecret = $this->getData('orcidClientSecret'); + if (!$this->validator->validateClientSecret($clientSecret)) { + $messages[] = __('plugins.generic.orcidProfile.manager.settings.orcidClientSecret.error'); + } + if (strlen($clientId) == 0 or strlen($clientSecret) == 0) { + $this->plugin->setEnabled(false); + } + return $messages; + } + + +} + diff --git a/classes/form/OrcidProfileStatusForm.inc.php b/classes/form/OrcidProfileStatusForm.inc.php new file mode 100644 index 00000000..bcf413fc --- /dev/null +++ b/classes/form/OrcidProfileStatusForm.inc.php @@ -0,0 +1,97 @@ + 'string', + 'orcidClientId' => 'string', + 'orcidClientSecret' => 'string', + 'sendMailToAuthorsOnPublication' => 'bool', + 'logLevel' => 'string', + 'isSandBox' => 'bool' + ); + + /** @var $contextId int */ + var $contextId; + + /** @var $plugin object */ + var $plugin; + + /** @var OrcidValidator */ + var $validator; + + /** + * Constructor + * @param $plugin object + * @param $contextId int + */ + function __construct($plugin, $contextId) { + $this->contextId = $contextId; + $this->plugin = $plugin; + $orcidValidator = new OrcidValidator($plugin); + $this->validator = $orcidValidator; + parent::__construct($plugin->getTemplateResource('statusForm.tpl')); + + if (!$this->plugin->isGloballyConfigured()) { + + } + + } + + /** + * Initialize form data. + */ + function initData() { + $contextId = $this->contextId; + $plugin =& $this->plugin; + $this->_data = array(); + foreach (self::CONFIG_VARS as $configVar => $type) { + $this->_data[$configVar] = $plugin->getSetting($contextId, $configVar); + } + } + + + /** + * Fetch the form. + * @copydoc Form::fetch() + */ + function fetch($request, $template = null, $display = false) { + $contextId = $request->getContext()->getId(); + $clientId = $this->plugin->getSetting($contextId, 'orcidClientId'); + $clientSecret = $this->plugin->getSetting($contextId, 'orcidClientSecret'); + + $templateMgr = TemplateManager::getManager($request); + $aboutUrl = $request->getDispatcher()->url($request, ROUTE_PAGE, null, 'orcidapi', 'about', null); + $templateMgr->assign(array( + 'globallyConfigured' => $this->plugin->isGloballyConfigured(), + 'orcidAboutUrl' => $aboutUrl, + 'pluginEnabled' => $this->plugin->getEnabled($contextId), + 'clientIdValid' => $this->validator->validateClientId($clientId), + 'clientSecretValid' => $this->validator->validateClientSecret($clientSecret), + + + )); + return parent::fetch($request, $template, $display); + } + + +} + diff --git a/pages/OrcidHandler.inc.php b/pages/OrcidHandler.inc.php index 90383c73..ddcf41ae 100644 --- a/pages/OrcidHandler.inc.php +++ b/pages/OrcidHandler.inc.php @@ -128,7 +128,7 @@ public function orcidAuthorize($args, $request) ] ); if ($response->getStatusCode() != 200) { - error_log('ORCID employments URL error: ' . $response->getStatusCode() . ' (' . __FILE__ . ' line ' . __LINE__ . ', URL ' . $url . ')'); + error_log('ORCID deployments URL error: ' . $response->getStatusCode() . ' (' . __FILE__ . ' line ' . __LINE__ . ', URL ' . $url . ')'); $employmentJson = null; } else { $employmentJson = json_decode($response->getBody(), true); @@ -188,6 +188,8 @@ public function orcidVerify($args, $request) ->filterByPublicationIds([$publicationId]) ->getMany(); + $isSandBox = $plugin->getSetting($contextId, 'orcidProfileAPIPath') == ORCID_API_URL_MEMBER_SANDBOX || + $plugin->getSetting($contextId, 'orcidProfileAPIPath') == ORCID_API_URL_PUBLIC_SANDBOX; $publication = Repo::publication()->get($publicationId); $authorToVerify = null; diff --git a/templates/orcidVerify.tpl b/templates/orcidVerify.tpl index e7f1d751..f7f2fc04 100644 --- a/templates/orcidVerify.tpl +++ b/templates/orcidVerify.tpl @@ -38,12 +38,17 @@ {/if} {else}
{translate key="plugins.generic.orcidProfile.manager.settings.review.help"}
+ {fbvElement id="country" label="plugins.generic.orcidProfile.manager.settings.country" name="country" type="select" from=$countries translate=false selected=$country} + {/fbvFormSection} + {fbvElement type="text" id="city" value=$city label="plugins.generic.orcidProfile.manager.settings.city" maxlength="40" size=$fbvStyles.size.MEDIUM } + {/if} + {fbvFormSection for="sendMailToAuthorsOnPublication" title="plugins.generic.orcidProfile.manager.settings.mailSectionTitle" list="true"} {fbvElement type="checkbox" name="sendMailToAuthorsOnPublication" label="plugins.generic.orcidProfile.manager.settings.sendMailToAuthorsOnPublication" id="sendMailToAuthorsOnPublication" checked=$sendMailToAuthorsOnPublication} {/fbvFormSection} diff --git a/version.xml b/version.xml index e0a5b6be..90359842 100755 --- a/version.xml +++ b/version.xml @@ -15,8 +15,8 @@