Skip to content

Commit

Permalink
pkp#229 OrcidProfilePlugin-705
Browse files Browse the repository at this point in the history
  • Loading branch information
withanage committed Jan 27, 2023
1 parent d94d133 commit 3eec210
Show file tree
Hide file tree
Showing 8 changed files with 350 additions and 39 deletions.
89 changes: 56 additions & 33 deletions OrcidProfilePlugin.inc.php
Original file line number Diff line number Diff line change
Expand Up @@ -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';
}


/**
Expand Down Expand Up @@ -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()
*/
Expand Down Expand Up @@ -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)
);
Expand All @@ -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)
Expand All @@ -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();
Expand All @@ -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
Expand Down Expand Up @@ -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)
],
Expand All @@ -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) {
Expand Down
38 changes: 38 additions & 0 deletions classes/OrcidValidator.inc.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php


class OrcidValidator {

/**
* OrcidValidator constructor.
* @param $plugin
*/
function __construct(&$plugin) {
$this->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;
}

}
138 changes: 138 additions & 0 deletions classes/form/OrcidProfileSettingsForm.inc.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
<?php

/**
* @file OrcidProfileSettingsForm.inc.php
*
* Copyright (c) 2015-2019 University of Pittsburgh
* Copyright (c) 2014-2021 Simon Fraser University
* Copyright (c) 2003-2021 John Willinsky
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
*
* @class OrcidProfileSettingsForm
* @ingroup plugins_generic_orcidProfile
*
* @brief Form for site admins to modify ORCID Profile plugin settings
*/


import('lib.pkp.classes.form.Form');
import('plugins.generic.orcidProfile.classes.OrcidValidator');

class OrcidProfileSettingsForm extends Form {

const CONFIG_VARS = array(
'orcidProfileAPIPath' => '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;
}


}

Loading

0 comments on commit 3eec210

Please sign in to comment.