diff --git a/dev/examples/zapier/authentication.js b/dev/examples/zapier/authentication.js index 3e595bddd6d..b746fba8b27 100644 --- a/dev/examples/zapier/authentication.js +++ b/dev/examples/zapier/authentication.js @@ -1,6 +1,6 @@ /*jshint esversion: 6 */ -const testAuth = (z , bundle) => { - const url = bundle.authData.url+'/api/index.php/login'; +const test = (z , bundle) => { + const url = bundle.authData.url+'/api/index.php/status'; // Normally you want to make a request to an endpoint that is either specifically designed to test auth, or one that // every user will have access to, such as an account or profile endpoint like /me. // In this example, we'll hit httpbin, which validates the Authorization Header against the arguments passed in the URL path @@ -11,67 +11,92 @@ const testAuth = (z , bundle) => { // This method can return any truthy value to indicate the credentials are valid. // Raise an error to show return promise.then((response) => { - if (response.status === 401) { - throw new Error('The Session Key you supplied is invalid'); + if (response.status === 400) { + throw new Error('400 -The Session Key you supplied is invalid'); + } + if (response.status === 403) { + throw new Error('403 -The Session Key you supplied is invalid'); } return response; }); }; -const getSessionKey = (z, bundle) => { +// To include the session key header on all outbound requests, simply define a function here. +// It runs runs before each request is sent out, allowing you to make tweaks to the request in a centralized spot +const includeSessionKeyHeader = (request, z, bundle) => { + if (bundle.authData.sessionKey) { + request.headers = request.headers || {}; + request.headers['DOLAPIKEY'] = bundle.authData.sessionKey; + } + return request; +}; + +// If we get a response and it is a 401, we can raise a special error telling Zapier to retry this after another exchange. +const sessionRefreshIf401 = (response, z, bundle) => { + if (bundle.authData.sessionKey) { + if (response.status === 401) { + throw new z.errors.RefreshAuthError('Session apikey needs refreshing.'); + } + } + return response; +}; + +const getSessionKey = async (z, bundle) => { const url = bundle.authData.url + '/api/index.php/login'; - const promise = z.request({ - method: 'POST', + const response = await z.request({ url: url, + method: 'POST', body: { login: bundle.authData.login, password: bundle.authData.password, - } + }, }); - return promise.then((response) => { - if (response.status === 401) { - throw new Error('The login/password you supplied is invalid'); - } - const json = JSON.parse(response.content); - return { - sessionKey: json.success.token || 'secret' - }; - }); + // if (response.status === 401) { + // throw new Error('The login/password you supplied is invalid'); + // } + const json = JSON.parse(response.content); + return { + sessionKey: json.success.token || '', + }; }; module.exports = { - type: 'session', - // Define any auth fields your app requires here. The user will be prompted to enter this info when - // they connect their account. - fields: [ - { - key: 'url', - label: 'Url of service without ending-slash', - required: true, - type: 'string' + config: { + type: 'session', + sessionConfig: { + perform: getSessionKey }, - { - key: 'login', - label: 'Login', - required: true, - type: 'string' - }, - { - key: 'password', - label: 'Password', - required: true, - type: 'password' - } - ], - // The test method allows Zapier to verify that the credentials a user provides are valid. We'll execute this - // method whenever a user connects their account for the first time. - test: testAuth, - // The method that will exchange the fields provided by the user for session credentials. - sessionConfig: { - perform: getSessionKey + // Define any auth fields your app requires here. The user will be prompted to enter this info when + // they connect their account. + fields: [ + { + key: 'url', + label: 'Url of service without ending-slash', + required: true, + type: 'string' + }, + { + key: 'login', + label: 'Login', + required: true, + type: 'string' + }, + { + key: 'password', + label: 'Password', + required: true, + type: 'password' + } + ], + // The test method allows Zapier to verify that the credentials a user provides are valid. We'll execute this + // method whenever a user connects their account for the first time. + test, + // The method that will exchange the fields provided by the user for session credentials. + // assuming "login" is a key returned from the test + connectionLabel: '{{login}}' }, - // assuming "login" is a key returned from the test - connectionLabel: '{{login}}' + befores: [includeSessionKeyHeader], + afters: [sessionRefreshIf401], }; diff --git a/dev/examples/zapier/index.js b/dev/examples/zapier/index.js index 0a46f7c38d0..bbd745f607b 100644 --- a/dev/examples/zapier/index.js +++ b/dev/examples/zapier/index.js @@ -8,27 +8,31 @@ const searchThirdparty = require('./searches/thirdparty'); const createThirdparty = require('./creates/thirdparty'); -const authentication = require('./authentication'); +const { + config: authentication, + befores = [], + afters = [], +} = require('./authentication'); // To include the session key header on all outbound requests, simply define a function here. // It runs runs before each request is sent out, allowing you to make tweaks to the request in a centralized spot -const includeSessionKeyHeader = (request, z, bundle) => { - if (bundle.authData.sessionKey) { - request.headers = request.headers || {}; - request.headers['DOLAPIKEY'] = bundle.authData.sessionKey; - } - return request; -}; +// const includeSessionKeyHeader = (request, z, bundle) => { +// if (bundle.authData.sessionKey) { +// request.headers = request.headers || {}; +// request.headers['DOLAPIKEY'] = bundle.authData.sessionKey; +// } +// return request; +// }; // If we get a response and it is a 401, we can raise a special error telling Zapier to retry this after another exchange. -const sessionRefreshIf401 = (response, z, bundle) => { - if (bundle.authData.sessionKey) { - if (response.status === 401) { - throw new z.errors.RefreshAuthError('Session apikey needs refreshing.'); - } - } - return response; -}; +// const sessionRefreshIf401 = (response, z, bundle) => { +// if (bundle.authData.sessionKey) { +// if (response.status === 401) { +// throw new z.errors.RefreshAuthError('Session apikey needs refreshing.'); +// } +// } +// return response; +// }; // We can roll up all our behaviors in an App. const App = { @@ -41,11 +45,12 @@ const App = { // beforeRequest & afterResponse are optional hooks into the provided HTTP client beforeRequest: [ - includeSessionKeyHeader + ...befores ], afterResponse: [ - sessionRefreshIf401 + ...afters + //sessionRefreshIf401 ], // If you want to define optional resources to simplify creation of triggers, searches, creates - do that here! diff --git a/dev/examples/zapier/triggers/action.js b/dev/examples/zapier/triggers/action.js index 8d55abc6ee0..7d453270f87 100644 --- a/dev/examples/zapier/triggers/action.js +++ b/dev/examples/zapier/triggers/action.js @@ -17,7 +17,7 @@ const subscribeHook = (z, bundle) => { const options = { url: url, method: 'POST', - body: JSON.stringify(data) + body: data, }; // You may return a promise or a normal data structure from any perform method. diff --git a/dev/examples/zapier/triggers/order.js b/dev/examples/zapier/triggers/order.js index c423583028c..02caacd5cf8 100644 --- a/dev/examples/zapier/triggers/order.js +++ b/dev/examples/zapier/triggers/order.js @@ -17,7 +17,7 @@ const subscribeHook = (z, bundle) => { const options = { url: url, method: 'POST', - body: JSON.stringify(data) + body: data, }; // You may return a promise or a normal data structure from any perform method. diff --git a/dev/examples/zapier/triggers/thirdparty.js b/dev/examples/zapier/triggers/thirdparty.js index dfad664d98c..aff9c84bf86 100644 --- a/dev/examples/zapier/triggers/thirdparty.js +++ b/dev/examples/zapier/triggers/thirdparty.js @@ -17,7 +17,7 @@ const subscribeHook = (z, bundle) => { const options = { url: url, method: 'POST', - body: JSON.stringify(data) + body: data, }; // You may return a promise or a normal data structure from any perform method. diff --git a/dev/examples/zapier/triggers/user.js b/dev/examples/zapier/triggers/user.js index 53afc5cf324..182b0f7ff4c 100644 --- a/dev/examples/zapier/triggers/user.js +++ b/dev/examples/zapier/triggers/user.js @@ -17,7 +17,7 @@ const subscribeHook = (z, bundle) => { const options = { url: url, method: 'POST', - body: JSON.stringify(data) + body: data, }; // You may return a promise or a normal data structure from any perform method. diff --git a/htdocs/core/db/DoliDB.class.php b/htdocs/core/db/DoliDB.class.php index 976770747c6..fea25df11c5 100644 --- a/htdocs/core/db/DoliDB.class.php +++ b/htdocs/core/db/DoliDB.class.php @@ -242,7 +242,7 @@ abstract class DoliDB implements Database $fields=explode(',', $sortfield); $orders=explode(',', $sortorder); $i=0; - foreach($fields as $val) + foreach ($fields as $val) { if (!$return) $return .= ' ORDER BY '; else $return .= ', '; diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 3be02e6f8c6..aa34399df0d 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -1125,21 +1125,7 @@ class User extends CommonObject global $mysoc; // Clean parameters -<<<<<<< HEAD - - if (!empty($conf->global->MAIN_FIRST_TO_UPPER)) { - $this->lastname = dol_ucwords(dol_strtolower($this->lastname)); - } - if (!empty($conf->global->MAIN_ALL_TO_UPPER)) { - $this->lastname = dol_strtoupper($this->lastname); - } - if (!empty($conf->global->MAIN_FIRST_TO_UPPER)) { - $this->firstname = dol_ucwords(dol_strtolower($this->firstname)); - } - -======= $this->setUpperOrLowerCase(); ->>>>>>> upstream/develop $this->login = trim($this->login); if (!isset($this->entity)) { $this->entity = $conf->entity; // If not defined, we use default value @@ -1476,20 +1462,6 @@ class User extends CommonObject dol_syslog(get_class($this)."::update notrigger=".$notrigger.", nosyncmember=".$nosyncmember.", nosyncmemberpass=".$nosyncmemberpass); // Clean parameters -<<<<<<< HEAD - - if (!empty($conf->global->MAIN_FIRST_TO_UPPER)) { - $this->lastname = dol_ucwords(dol_strtolower($this->lastname)); - } - if (!empty($conf->global->MAIN_ALL_TO_UPPER)) { - $this->lastname = dol_strtoupper($this->lastname); - } - if (!empty($conf->global->MAIN_FIRST_TO_UPPER)) { - $this->firstname = dol_ucwords(dol_strtolower($this->firstname)); - } - -======= ->>>>>>> upstream/develop $this->lastname = trim($this->lastname); $this->firstname = trim($this->firstname); $this->employee = $this->employee ? $this->employee : 0; diff --git a/htdocs/zapier/class/api_zapier.class.php b/htdocs/zapier/class/api_zapier.class.php index 5ad97434d07..6660c7ef9a0 100644 --- a/htdocs/zapier/class/api_zapier.class.php +++ b/htdocs/zapier/class/api_zapier.class.php @@ -110,6 +110,7 @@ class ZapierApi extends DolibarrApi 'orders' => 'Orders', 'thirdparties' => 'Thirparties', 'contacts' => 'Contacts', + 'users' => 'Users', ); // $result = $this->hook->fetch($id); // if (! $result ) { @@ -244,6 +245,7 @@ class ZapierApi extends DolibarrApi $fields = array( 'url', ); + dol_syslog("API Zapier create hook receive : " . print_r($request_data, true), LOG_NOTICE); $result = $this->validate($request_data, $fields); foreach ($request_data as $field => $value) {