diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 163267ff52fc8114dde3436ae4dedca758d75241..94bc57e705057a491d14c034c1fda37e9afe6b44 100755 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1567,6 +1567,7 @@ KeyForApiAccess=Key to use API (parameter "api_key") ApiEndPointIs=You can access to the API at url ApiExporerIs=You can explore the API at url OnlyActiveElementsAreExposed=Only elements from enabled modules are exposed +ApiKey=Key for API ##### Bank ##### BankSetupModule=Bank module setup FreeLegalTextOnChequeReceipts=Free text on cheque receipts diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 42919207f21e42ded83a1da55d3958ca452300b0..a869097f629b0a04f1ba120eb69756f920a525d9 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -9,6 +9,7 @@ * Copyright (C) 2012 Juanjo Menent <jmenent@2byte.es> * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro> * Copyright (C) 2013-2015 Alexandre Spangaro <alexandre.spangaro@gmail.com> + * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -82,6 +83,7 @@ if ($user->id <> $id && ! $canreaduser) accessforbidden(); $langs->load("users"); $langs->load("companies"); $langs->load("ldap"); +$langs->load("admin"); $object = new User($db); $extrafields = new ExtraFields($db); @@ -189,6 +191,7 @@ if ($action == 'add' && $canadduser) $object->lastname = GETPOST("lastname",'alpha'); $object->firstname = GETPOST("firstname",'alpha'); $object->login = GETPOST("login",'alpha'); + $object->api_key = GETPOST("api_key",'alpha'); $object->gender = GETPOST("gender",'alpha'); $object->admin = GETPOST("admin",'alpha'); $object->office_phone = GETPOST("office_phone",'alpha'); @@ -343,6 +346,7 @@ if ($action == 'update' && ! $_POST["cancel"]) $object->login = GETPOST("login",'alpha'); $object->gender = GETPOST("gender",'alpha'); $object->pass = GETPOST("password"); + $object->api_key = GETPOST("api_key"); $object->admin = empty($user->admin)?0:GETPOST("admin"); // A user can only be set admin by an admin $object->office_phone=GETPOST("office_phone",'alpha'); $object->office_fax = GETPOST("office_fax",'alpha'); @@ -820,49 +824,62 @@ if (($action == 'create') || ($action == 'adduserldap')) } } print '</td></tr>'; - - // Administrator - if (! empty($user->admin)) - { - print '<tr><td>'.$langs->trans("Administrator").'</td>'; + + if(! empty($conf->api->enabled)) { + // API key + $generated_api_key = ''; + require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php'; + $generated_password=getRandomPassword(false); + print '<tr><td>'.$langs->trans("ApiKey").'</td>'; print '<td>'; - print $form->selectyesno('admin',GETPOST('admin'),1); + print '<input size="30" maxsize="32" type="text" id="api_key" name="api_key" value="'.$api_key.'" autocomplete="off">'; + if (! empty($conf->use_javascript_ajax)) + print ' '.img_picto($langs->trans('Generate'), 'refresh', 'id="generate_api_key" class="linkobject"'); + print '</td></tr>'; - if (! empty($conf->multicompany->enabled) && ! $user->entity && empty($conf->multicompany->transverse_mode)) + // Administrator + if (! empty($user->admin)) { - if (! empty($conf->use_javascript_ajax)) - { - print '<script type="text/javascript"> - $(function() { - $("select[name=admin]").change(function() { - if ( $(this).val() == 0 ) { - $("input[name=superadmin]") - .prop("disabled", true) - .prop("checked", false); - $("select[name=entity]") - .prop("disabled", false); - } else { - $("input[name=superadmin]") - .prop("disabled", false); - } - }); - $("input[name=superadmin]").change(function() { - if ( $(this).is(":checked") ) { - $("select[name=entity]") - .prop("disabled", true); - } else { - $("select[name=entity]") - .prop("disabled", false); - } - }); - }); - </script>'; - } - $checked=($_POST["superadmin"]?' checked':''); - $disabled=($_POST["superadmin"]?'':' disabled'); - print '<input type="checkbox" name="superadmin" value="1"'.$checked.$disabled.' /> '.$langs->trans("SuperAdministrator"); + print '<tr><td>'.$langs->trans("Administrator").'</td>'; + print '<td>'; + print $form->selectyesno('admin',GETPOST('admin'),1); + + if (! empty($conf->multicompany->enabled) && ! $user->entity && empty($conf->multicompany->transverse_mode)) + { + if (! empty($conf->use_javascript_ajax)) + { + print '<script type="text/javascript"> + $(function() { + $("select[name=admin]").change(function() { + if ( $(this).val() == 0 ) { + $("input[name=superadmin]") + .prop("disabled", true) + .prop("checked", false); + $("select[name=entity]") + .prop("disabled", false); + } else { + $("input[name=superadmin]") + .prop("disabled", false); + } + }); + $("input[name=superadmin]").change(function() { + if ( $(this).is(":checked") ) { + $("select[name=entity]") + .prop("disabled", true); + } else { + $("select[name=entity]") + .prop("disabled", false); + } + }); + }); + </script>'; + } + $checked=($_POST["superadmin"]?' checked':''); + $disabled=($_POST["superadmin"]?'':' disabled'); + print '<input type="checkbox" name="superadmin" value="1"'.$checked.$disabled.' /> '.$langs->trans("SuperAdministrator"); + } + print "</td></tr>\n"; } - print "</td></tr>\n"; } // Type @@ -1254,7 +1271,16 @@ else print "</td>"; } print '</tr>'."\n"; - + + // API key + if(! empty($conf->api->enabled) && $user->admin) { + print '<tr><td>'.$langs->trans("ApiKey").'</td>'; + print '<td colspan="2">'; + if (! empty($object->api_key)) + print $langs->trans("Hidden"); + print '<td>'; + } + // Administrator print '<tr><td>'.$langs->trans("Administrator").'</td><td colspan="2">'; if (! empty($conf->multicompany->enabled) && $object->admin && ! $object->entity) @@ -1824,6 +1850,16 @@ else } print $text; print "</td></tr>\n"; + + // API key + if(! empty($conf->api->enabled) && $user->admin) { + print '<tr><td>'.$langs->trans("ApiKey").'</td>'; + print '<td>'; + print '<input size="30" maxsize="32" type="text" id="api_key" name="api_key" value="'.$object->api_key.'" autocomplete="off">'; + if (! empty($conf->use_javascript_ajax)) + print ' '.img_picto($langs->trans('Generate'), 'refresh', 'id="generate_api_key" class="linkobject"'); + print '</td></tr>'; + } // Administrator print '<tr><td>'.$langs->trans("Administrator").'</td>'; @@ -2197,6 +2233,22 @@ else } } +if (! empty($conf->api->enabled) && ! empty($conf->use_javascript_ajax)) +{ + print "\n".'<script type="text/javascript">'; + print '$(document).ready(function () { + $("#generate_api_key").click(function() { + $.get( "'.DOL_URL_ROOT.'/core/ajax/security.php", { + action: \'getrandompassword\', + generic: true + }, + function(token) { + $("#api_key").val(token); + }); + }); + });'; + print '</script>'; +} llxFooter(); $db->close(); diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index b55723d37358e3d85c6e36d3911c7b0cf8542d3f..f7b5473967267f53257f66f990451ff07e17d856 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -61,6 +61,7 @@ class User extends CommonObject var $user_mobile; var $admin; var $login; + var $api_key; var $entity; //! Clear password in memory @@ -162,7 +163,7 @@ class User extends CommonObject // Get user $sql = "SELECT u.rowid, u.lastname, u.firstname, u.gender, u.email, u.job, u.skype, u.signature, u.office_phone, u.office_fax, u.user_mobile,"; $sql.= " u.admin, u.login, u.note,"; - $sql.= " u.pass, u.pass_crypted, u.pass_temp,"; + $sql.= " u.pass, u.pass_crypted, u.pass_temp, u.api_key,"; $sql.= " u.fk_soc, u.fk_socpeople, u.fk_member, u.fk_user, u.ldap_sid,"; $sql.= " u.statut, u.lang, u.entity,"; $sql.= " u.datec as datec,"; @@ -226,6 +227,7 @@ class User extends CommonObject $this->pass_indatabase_crypted = $obj->pass_crypted; $this->pass = $obj->pass; $this->pass_temp = $obj->pass_temp; + $this->api_key = $obj->api_key; $this->office_phone = $obj->office_phone; $this->office_fax = $obj->office_fax; $this->user_mobile = $obj->user_mobile; @@ -1143,6 +1145,7 @@ class User extends CommonObject $this->login = trim($this->login); $this->gender = trim($this->gender); $this->pass = trim($this->pass); + $this->api_key = trim($this->api_key); $this->office_phone = trim($this->office_phone); $this->office_fax = trim($this->office_fax); $this->user_mobile = trim($this->user_mobile); @@ -1174,6 +1177,7 @@ class User extends CommonObject $sql.= " lastname = '".$this->db->escape($this->lastname)."'"; $sql.= ", firstname = '".$this->db->escape($this->firstname)."'"; $sql.= ", login = '".$this->db->escape($this->login)."'"; + $sql.= ", api_key = '".$this->db->escape($this->api_key)."'"; $sql.= ", gender = ".($this->gender != -1 ? "'".$this->db->escape($this->gender)."'" : "null"); // 'man' or 'woman' $sql.= ", admin = ".$this->admin; $sql.= ", address = '".$this->db->escape($this->address)."'";