Move Google authentication to an external plugin

This commit is contained in:
Frederic Guillot 2016-01-29 20:15:53 -05:00
parent 915bf58822
commit dae0c7391a
39 changed files with 41 additions and 574 deletions

View File

@ -1,6 +1,11 @@
Version 1.0.25 (unreleased)
--------------
Breaking changes:
* Core functionalities moved to external plugins:
- Google Auth: https://github.com/kanboard/plugin-google-auth
New features:
* Add project owner (Directly Responsible Individual)

View File

@ -1,143 +0,0 @@
<?php
namespace Kanboard\Auth;
use Kanboard\Core\Base;
use Kanboard\Core\Security\OAuthAuthenticationProviderInterface;
use Kanboard\User\GoogleUserProvider;
/**
* Google Authentication Provider
*
* @package auth
* @author Frederic Guillot
*/
class GoogleAuth extends Base implements OAuthAuthenticationProviderInterface
{
/**
* User properties
*
* @access protected
* @var \Kanboard\User\GoogleUserProvider
*/
protected $userInfo = null;
/**
* OAuth2 instance
*
* @access protected
* @var \Kanboard\Core\Http\OAuth2
*/
protected $service;
/**
* OAuth2 code
*
* @access protected
* @var string
*/
protected $code = '';
/**
* Get authentication provider name
*
* @access public
* @return string
*/
public function getName()
{
return 'Google';
}
/**
* Authenticate the user
*
* @access public
* @return boolean
*/
public function authenticate()
{
$profile = $this->getProfile();
if (! empty($profile)) {
$this->userInfo = new GoogleUserProvider($profile);
return true;
}
return false;
}
/**
* Set Code
*
* @access public
* @param string $code
* @return GoogleAuth
*/
public function setCode($code)
{
$this->code = $code;
return $this;
}
/**
* Get user object
*
* @access public
* @return GoogleUserProvider
*/
public function getUser()
{
return $this->userInfo;
}
/**
* Get configured OAuth2 service
*
* @access public
* @return \Kanboard\Core\Http\OAuth2
*/
public function getService()
{
if (empty($this->service)) {
$this->service = $this->oauth->createService(
GOOGLE_CLIENT_ID,
GOOGLE_CLIENT_SECRET,
$this->helper->url->to('oauth', 'google', array(), '', true),
'https://accounts.google.com/o/oauth2/auth',
'https://accounts.google.com/o/oauth2/token',
array('https://www.googleapis.com/auth/userinfo.email', 'https://www.googleapis.com/auth/userinfo.profile')
);
}
return $this->service;
}
/**
* Get Google profile
*
* @access public
* @return array
*/
public function getProfile()
{
$this->getService()->getAccessToken($this->code);
return $this->httpClient->getJson(
'https://www.googleapis.com/oauth2/v1/userinfo',
array($this->getService()->getAuthorizationHeader())
);
}
/**
* Unlink user
*
* @access public
* @param integer $userId
* @return bool
*/
public function unlink($userId)
{
return $this->user->update(array('id' => $userId, 'google_id' => ''));
}
}

View File

@ -10,16 +10,6 @@ namespace Kanboard\Controller;
*/
class Oauth extends Base
{
/**
* Link or authenticate a Google account
*
* @access public
*/
public function google()
{
$this->step1('Google');
}
/**
* Link or authenticate a Github account
*
@ -65,7 +55,7 @@ class Oauth extends Base
* @access private
* @param string $provider
*/
private function step1($provider)
protected function step1($provider)
{
$code = $this->request->getStringParam('code');
@ -79,11 +69,11 @@ class Oauth extends Base
/**
* Link or authenticate the user
*
* @access private
* @access protected
* @param string $provider
* @param string $code
*/
private function step2($provider, $code)
protected function step2($provider, $code)
{
$this->authenticationManager->getProvider($provider)->setCode($code);
@ -97,10 +87,10 @@ class Oauth extends Base
/**
* Link the account
*
* @access private
* @access protected
* @param string $provider
*/
private function link($provider)
protected function link($provider)
{
$authProvider = $this->authenticationManager->getProvider($provider);
@ -117,10 +107,10 @@ class Oauth extends Base
/**
* Authenticate the account
*
* @access private
* @access protected
* @param string $provider
*/
private function authenticate($provider)
protected function authenticate($provider)
{
if ($this->authenticationManager->oauthAuthentication($provider)) {
$this->response->redirect($this->helper->url->to('app', 'index'));

View File

@ -260,9 +260,6 @@ return array(
'External authentication failed' => 'Vanjska autentikacija nije uspostavljena',
'Your external account is linked to your profile successfully.' => 'Uspješno uspostavljena vanjska autentikacija',
'Email' => 'E-mail',
'Link my Google Account' => 'Poveži sa Google nalogom',
'Unlink my Google Account' => 'Ukini vezu sa Google nalogom',
'Login with my Google Account' => 'Prijavi se preko Google naloga',
'Project not found.' => 'Projekat nije pronađen.',
'Task removed successfully.' => 'Zadatak uspješno uklonjen.',
'Unable to remove this task.' => 'Nemoguće uklanjanje zadatka.',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Promijeni šifru',
'Password modification' => 'Izmjena šifre',
'External authentications' => 'Vanjske autentikacije',
'Google Account' => 'Google korisnički račun',
'Github Account' => 'Github korisnički račun',
'Never connected.' => 'Bez konekcija.',
'No account linked.' => 'Bez povezanih korisničkih računa.',
@ -846,8 +842,6 @@ return array(
'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Ovaj grafik pokazuje prosjek vremena vođenja i vremenskog ciklusa za posljednjih %d zadataka tokom vremena.',
'Average time into each column' => 'Prosječno vrijeme u svakoj koloni',
'Lead and cycle time' => 'Vrijeme vođenja i vremenski ciklus',
'Google Authentication' => 'Google autentifikacija',
'Help on Google authentication' => 'Pomoć na Google autentifikacija',
'Github Authentication' => 'Github autentifikacija',
'Help on Github authentication' => 'Pomoć na Github autentifikacija',
'Lead time: ' => 'Vrijeme vođenja: ',
@ -858,7 +852,6 @@ return array(
'If the task is not closed the current time is used instead of the completion date.' => 'Ako zadatak nije zatvoren trenutno vrijeme je iskorišteno umjesto datuma završetka.',
'Set automatically the start date' => 'Automatski postavi početno vrijeme',
'Edit Authentication' => 'Uredi autentifikaciju',
'Google Id' => 'Google Id',
'Github Id' => 'Github Id',
'Remote user' => 'Vanjski korisnik',
'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Vanjski korisnik ne čuva šifru u Kanboard bazi, npr: LDAP, Google i Github korisnički računi.',

View File

@ -260,9 +260,6 @@ return array(
// 'External authentication failed' => '',
// 'Your external account is linked to your profile successfully.' => '',
'Email' => 'E-Mail',
'Link my Google Account' => 'Propojit s Google účtem',
'Unlink my Google Account' => 'Odpojit Google účet',
'Login with my Google Account' => 'Přihlášení pomocí Google účtu',
'Project not found.' => 'Projekt nebyl nalezen.',
'Task removed successfully.' => 'Úkol byl úspěšně odebrán.',
'Unable to remove this task.' => 'Tento úkol nelze odebrat.',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Změnit heslo',
'Password modification' => 'Změna hesla',
'External authentications' => 'Vzdálená autorizace',
'Google Account' => 'Google účet',
'Github Account' => 'github účet',
'Never connected.' => 'Zatím nikdy nespojen.',
'No account linked.' => 'Žádné propojení účtu.',
@ -846,8 +842,6 @@ return array(
'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Graf ukazuje průměrnou dodací lhůtu a dobu cyklu pro posledních %d úkolů v průběhu času',
'Average time into each column' => 'Průměrná doba v každé fázi',
'Lead and cycle time' => 'Dodací lhůta a doba cyklu',
'Google Authentication' => 'Ověřování pomocí služby Google',
'Help on Google authentication' => 'Nápověda k ověřování pomocí služby Google',
'Github Authentication' => 'Ověřování pomocí služby Github',
'Help on Github authentication' => 'Nápověda k ověřování pomocí služby Github',
'Lead time: ' => 'Dodací lhůta: ',
@ -858,7 +852,6 @@ return array(
'If the task is not closed the current time is used instead of the completion date.' => 'Jestliže není úkol uzavřen, místo termínu dokončení je použit aktuální čas.',
'Set automatically the start date' => 'Nastavit automaticky počáteční datum',
'Edit Authentication' => 'Upravit ověřování',
'Google Id' => 'Google ID',
'Github Id' => 'Github ID',
'Remote user' => 'Vzdálený uživatel',
'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Hesla vzdáleným uživatelům se neukládají do databáze Kanboard. Naříklad: LDAP, Google a Github účty.',

View File

@ -260,9 +260,6 @@ return array(
// 'External authentication failed' => '',
// 'Your external account is linked to your profile successfully.' => '',
'Email' => 'E-Mail',
'Link my Google Account' => 'Forbind min Google-konto',
'Unlink my Google Account' => 'Fjern forbindelsen til min Google-konto',
'Login with my Google Account' => 'Login med min Google-konto',
'Project not found.' => 'Projekt ikke fundet.',
'Task removed successfully.' => 'Opgaven er fjernet.',
'Unable to remove this task.' => 'Opgaven kunne ikke fjernes.',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Skift adgangskode',
'Password modification' => 'Adgangskode ændring',
'External authentications' => 'Ekstern autentificering',
'Google Account' => 'Google-konto',
'Github Account' => 'Github-konto',
'Never connected.' => 'Aldrig forbundet.',
'No account linked.' => 'Ingen kontoer forfundet.',
@ -846,8 +842,6 @@ return array(
// 'This chart show the average lead and cycle time for the last %d tasks over the time.' => '',
// 'Average time into each column' => '',
// 'Lead and cycle time' => '',
// 'Google Authentication' => '',
// 'Help on Google authentication' => '',
// 'Github Authentication' => '',
// 'Help on Github authentication' => '',
// 'Lead time: ' => '',
@ -858,7 +852,6 @@ return array(
// 'If the task is not closed the current time is used instead of the completion date.' => '',
// 'Set automatically the start date' => '',
// 'Edit Authentication' => '',
// 'Google Id' => '',
// 'Github Id' => '',
// 'Remote user' => '',
// 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '',

View File

@ -260,9 +260,6 @@ return array(
'External authentication failed' => 'Externe Authentifizierung fehlgeschlagen',
'Your external account is linked to your profile successfully.' => 'Dein externer Account wurde erfolgreich mit deinem Profil verbunden',
'Email' => 'E-Mail',
'Link my Google Account' => 'Verbinde meinen Google-Account',
'Unlink my Google Account' => 'Verbindung mit meinem Google-Account trennen',
'Login with my Google Account' => 'Anmelden mit meinem Google-Account',
'Project not found.' => 'Das Projekt wurde nicht gefunden.',
'Task removed successfully.' => 'Aufgabe erfolgreich gelöscht.',
'Unable to remove this task.' => 'Löschen der Aufgabe nicht möglich.',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Passwort ändern',
'Password modification' => 'Passwortänderung',
'External authentications' => 'Externe Authentisierungsmethoden',
'Google Account' => 'Google-Account',
'Github Account' => 'Github-Account',
'Never connected.' => 'Noch nie verbunden.',
'No account linked.' => 'Kein Account verbunden.',
@ -846,8 +842,6 @@ return array(
'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Das Diagramm zeigt die durchschnittliche Durchlauf- und Zykluszeit der letzten %d Aufgaben über die Zeit an.',
'Average time into each column' => 'Durchschnittzeit in jeder Spalte',
'Lead and cycle time' => 'Durchlauf- und Zykluszeit',
'Google Authentication' => 'Google-Authentifizierung',
'Help on Google authentication' => 'Hilfe bei Google-Authentifizierung',
'Github Authentication' => 'Github-Authentifizierung',
'Help on Github authentication' => 'Hilfe bei Github-Authentifizierung',
'Lead time: ' => 'Durchlaufzeit:',
@ -858,7 +852,6 @@ return array(
'If the task is not closed the current time is used instead of the completion date.' => 'Wenn die Aufgabe nicht geschlossen ist, wird die aktuelle Zeit statt der Fertigstellung verwendet.',
'Set automatically the start date' => 'Setze Startdatum automatisch',
'Edit Authentication' => 'Authentifizierung bearbeiten',
'Google Id' => 'Google Id',
'Github Id' => 'Github Id',
'Remote user' => 'Remote-Benutzer',
'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Remote-Benutzer haben kein Passwort in der Kanboard Datenbank, Beispiel LDAP, Goole und Github Accounts',

View File

@ -25,7 +25,7 @@ return array(
'Dark Grey' => 'Βαθύ γκρί',
'Pink' => 'Ρόζ',
'Teal' => 'Τουρκουάζ',
'Cyan'=> 'Γαλάζιο',
'Cyan' => 'Γαλάζιο',
'Lime' => 'Λεμονί',
'Light Green' => 'Ανοιχτό πράσινο',
'Amber' => 'Κεχριμπαρί',
@ -260,9 +260,6 @@ return array(
'External authentication failed' => 'Αποτυχία εξωτερικής σύνδεσης',
'Your external account is linked to your profile successfully.' => 'Ο λογαριασμός σας συνδέθηκε με το προφίλ σας με επιτυχία.',
'Email' => 'Email',
'Link my Google Account' => 'Σύνδεση του Google Account μου',
'Unlink my Google Account' => 'Αποσύνδεση του Google Account μου',
'Login with my Google Account' => 'Σύνδεση με Google Account',
'Project not found.' => 'Το έργο δεν βρέθηκε.',
'Task removed successfully.' => 'Η εργασία αφαιρέθηκε με επιτυχία.',
'Unable to remove this task.' => 'Δεν είναι δυνατή η αφαίρεση της εργασίας.',
@ -329,7 +326,7 @@ return array(
'Display another project' => 'Εμφάνιση άλλου έργου',
'Login with my Github Account' => 'Σύνδεση με το Github Account μου',
'Link my Github Account' => 'Σύνδεση Github Account',
'Unlink my Github Account' => 'Αποσύνδεση του Github Account μου',
'Unlink my Github Account' => 'Αποσύνδεση του Github Account μου',
'Created by %s' => 'Δημιουργήθηκε από %s',
'Last modified on %B %e, %Y at %k:%M %p' => 'Τελευταία ενημέρωση: %d/%m/%Y à %H:%M',
'Tasks Export' => 'Εξαγωγή εργασιών',
@ -355,14 +352,12 @@ return array(
'Time tracking:' => 'Παρακολούθηση του χρόνου :',
'New sub-task' => 'Νέα υπο-εργασία',
'New attachment added "%s"' => 'Νέα επικόλληση προστέθηκε « %s »',
'Comment updated' => 'Το σχόλιο ενημηρώθηκε',
'Comment updated' => 'Το σχόλιο ενημερώθηκε',
'New comment posted by %s' => 'Νέο σχόλιο από τον χρήστη « %s »',
'New attachment' => 'New attachment',
'New comment' => 'Νέο σχόλιο',
'Comment updated' => 'Το σχόλιο ενημερώθηκε',
'New subtask' => 'Νέα υπο-εργασία',
'Subtask updated' => 'Υπο-Εργασία ενημερώθηκε',
'New task' => 'Νέα εργασία',
'Task updated' => 'Η εργασία ενημερώθηκε',
'Task closed' => 'Η εργασία έκλεισε',
'Task opened' => 'Η εργασία άνοιξε',
@ -397,7 +392,6 @@ return array(
'Change password' => 'Αλλαγή password',
'Password modification' => 'Τροποποίηση password ',
'External authentications' => 'Εξωτερικές πιστοποιήσεις',
'Google Account' => 'Google Account',
'Github Account' => 'Github Account',
'Never connected.' => 'Ποτέ δεν συνδέθηκε.',
'No account linked.' => 'Δεν υπάρχουν ενεργοί λογαριασμοί',
@ -688,7 +682,6 @@ return array(
'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Πάρτε ένα screenshot και πατήστε CTRL+V or ⌘+V για να το επικολλήσετε εδώ.',
'Screenshot uploaded successfully.' => 'Το screenshot ανέβηκε με επιτυχία.',
'SEK - Swedish Krona' => 'SEK - Swedish Krona',
'The project identifier is an optional alphanumeric code used to identify your project.' => 'Το αναγνωριστικό έργου είναι ένας προαιρετικός αλφαριθμητικός κωδικός που χρησιμοποιείται για την αναγνώριση του έργου σας.',
'Identifier' => 'Αναγνωριστικό',
'Disable two factor authentication' => 'Απενεργοποίηση κωδικού ελέγχου ταυτότητας δύο παραγόντων',
'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Είστε σίγουροι ότι θέλετε να απενεργοποίησετε τον κωδικό ελέγχου ταυτότητας δύο παραγόντων : « %s » ?',
@ -849,8 +842,6 @@ return array(
'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Αυτό το γράφημα δείχνει το average lead and cycle time για τις τελευταίες %d εργασίες κατά τη διάρκεια του χρόνου.',
'Average time into each column' => 'Μέσος χρόνος σε κάθε στήλη',
'Lead and cycle time' => 'Lead et cycle time',
'Google Authentication' => 'Πιστοποίηση Google',
'Help on Google authentication' => 'Βοήθεια για την πιστοποίηση της Google',
'Github Authentication' => 'Πιστοποίηση Github',
'Help on Github authentication' => 'Βοήθεια για την πιστοποίηση της Github',
'Lead time: ' => 'Lead time : ',
@ -861,7 +852,6 @@ return array(
'If the task is not closed the current time is used instead of the completion date.' => 'Εάν η εργασία δεν έχει κλείσει η τρέχουσα ώρα χρησιμοποιείται αντί της ημερομηνίας ολοκλήρωσης.',
'Set automatically the start date' => 'Ρυθμίστε αυτόματα την ημερομηνία έναρξης',
'Edit Authentication' => 'Επεξεργασία ταυτοποίησης',
'Google Id' => 'Id Google',
'Github Id' => 'Id Github',
'Remote user' => 'Απομακρυσμένος χρήστης',
'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Στους απομακρυσμένους χρήστες δεν αποθηκεύονται οι κωδικοί πρόσβασης εντός της βάσης δεδομένων της τρέχουσας εφαρμογής, Παραδείγματα: LDAP, Google and Github accounts.',
@ -1014,7 +1004,6 @@ return array(
'Usernames must be lowercase and unique' => 'Οι ονομασίες χρηστών πρέπει να είναι σε μικρά γράμματα (lowercase) και μοναδικά',
'Passwords will be encrypted if present' => 'Οι κωδικοί πρόσβασης κρυπτογραφούνται, αν υπάρχουν',
'%s attached a new file to the task %s' => '%s νέο συνημμένο αρχείο της εργασίας %s',
'Link type' => 'Τύπος συνδέσμου',
'Assign automatically a category based on a link' => 'Ανατίθεται αυτόματα κατηγορία, βασισμένη στον σύνδεσμο',
'BAM - Konvertible Mark' => 'BAM - Konvertible Mark',
'Assignee Username' => 'Δικαιοδόχο όνομα χρήστη',
@ -1107,4 +1096,19 @@ return array(
'No plugin has registered a project notification method. You can still configure individual notifications in your user profile.' => 'Κανένα plugin δεν έχει καταχωρηθεί με τη μέθοδο της κοινοποίησης του έργου. Μπορείτε ακόμα να διαμορφώσετε τις μεμονωμένες κοινοποιήσεις στο προφίλ χρήστη σας.',
'My dashboard' => 'Το κεντρικό ταμπλό μου',
'My profile' => 'Το προφίλ μου',
// 'Project owner: ' => '',
// 'The project identifier is optional and must be alphanumeric, example: MYPROJECT.' => '',
// 'Project owner' => '',
// 'Those dates are useful for the project Gantt chart.' => '',
// 'Private projects do not have users and groups management.' => '',
// 'There is no project member.' => '',
// 'Priority' => '',
// 'Task priority' => '',
// 'General' => '',
// 'Dates' => '',
// 'Default priority' => '',
// 'Lowest priority' => '',
// 'Highest priority' => '',
// 'If you put zero to the low and high priority, this feature will be disabled.' => '',
// 'Priority: %d' => '',
);

View File

@ -260,9 +260,6 @@ return array(
'External authentication failed' => 'Falló la autenticación externa',
'Your external account is linked to your profile successfully.' => 'Su cuenta externa se ha vinculado exitosamente con su perfil.',
'Email' => 'Correo',
'Link my Google Account' => 'Vincular con mi Cuenta en Google',
'Unlink my Google Account' => 'Desvincular de mi Cuenta en Google',
'Login with my Google Account' => 'Ingresar con mi Cuenta de Google',
'Project not found.' => 'Proyecto no hallado.',
'Task removed successfully.' => 'Tarea suprimida correctamente.',
'Unable to remove this task.' => 'No pude suprimir esta tarea.',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Cambiar contraseña',
'Password modification' => 'Modificacion de contraseña',
'External authentications' => 'Autenticación externa',
'Google Account' => 'Cuenta de Google',
'Github Account' => 'Cuenta de Github',
'Never connected.' => 'Nunca se ha conectado.',
'No account linked.' => 'Sin vínculo con cuenta.',
@ -846,8 +842,6 @@ return array(
'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Esta gráfica muestra el plazo medio de entrega y de ciclo para las %d últimas tareas transcurridas.',
'Average time into each column' => 'Tiempo medio en cada columna',
'Lead and cycle time' => 'Plazo de entrega y de ciclo',
'Google Authentication' => 'Autenticación de Google',
'Help on Google authentication' => 'Ayuda con la aAutenticación de Google',
'Github Authentication' => 'Autenticación de Github',
'Help on Github authentication' => 'Ayuda con la autenticación de Github',
'Lead time: ' => 'Plazo de entrega: ',
@ -858,7 +852,6 @@ return array(
'If the task is not closed the current time is used instead of the completion date.' => 'Si la tarea no se cierra, se usa la fecha actual en lugar de la de terminación.',
'Set automatically the start date' => 'Poner la fecha de inicio de forma automática',
'Edit Authentication' => 'Editar autenticación',
'Google Id' => 'Id de Google',
'Github Id' => 'Id de Github',
'Remote user' => 'Usuario remoto',
'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Los usuarios remotos no almacenan sus contraseñas en la base de datos Kanboard, por ejemplo: cuentas de LDAP, Google y Github',

View File

@ -260,9 +260,6 @@ return array(
// 'External authentication failed' => '',
// 'Your external account is linked to your profile successfully.' => '',
'Email' => 'Sähköposti',
'Link my Google Account' => 'Linkitä Google-tili',
'Unlink my Google Account' => 'Poista Google-tilin linkitys',
'Login with my Google Account' => 'Kirjaudu Google tunnuksella',
'Project not found.' => 'Projektia ei löytynyt.',
'Task removed successfully.' => 'Tehtävä poistettiin onnistuneesti.',
'Unable to remove this task.' => 'Tehtävän poistaminen epäonnistui.',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Vaihda salasana',
'Password modification' => 'Salasanan vaihto',
'External authentications' => 'Muut tunnistautumistavat',
'Google Account' => 'Google-tili',
'Github Account' => 'Github-tili',
'Never connected.' => 'Ei koskaan liitetty.',
'No account linked.' => 'Tiliä ei ole liitetty.',
@ -846,8 +842,6 @@ return array(
// 'This chart show the average lead and cycle time for the last %d tasks over the time.' => '',
// 'Average time into each column' => '',
// 'Lead and cycle time' => '',
// 'Google Authentication' => '',
// 'Help on Google authentication' => '',
// 'Github Authentication' => '',
// 'Help on Github authentication' => '',
// 'Lead time: ' => '',
@ -858,7 +852,6 @@ return array(
// 'If the task is not closed the current time is used instead of the completion date.' => '',
// 'Set automatically the start date' => '',
// 'Edit Authentication' => '',
// 'Google Id' => '',
// 'Github Id' => '',
// 'Remote user' => '',
// 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '',

View File

@ -260,9 +260,6 @@ return array(
'External authentication failed' => 'Lauthentification externe a échoué',
'Your external account is linked to your profile successfully.' => 'Votre compte externe est désormais lié à votre profil.',
'Email' => 'Email',
'Link my Google Account' => 'Lier mon compte Google',
'Unlink my Google Account' => 'Ne plus utiliser mon compte Google',
'Login with my Google Account' => 'Se connecter avec mon compte Google',
'Project not found.' => 'Projet introuvable.',
'Task removed successfully.' => 'Tâche supprimée avec succès.',
'Unable to remove this task.' => 'Impossible de supprimer cette tâche.',
@ -397,7 +394,6 @@ return array(
'Change password' => 'Changer le mot de passe',
'Password modification' => 'Changement de mot de passe',
'External authentications' => 'Authentifications externes',
'Google Account' => 'Compte Google',
'Github Account' => 'Compte Github',
'Never connected.' => 'Jamais connecté.',
'No account linked.' => 'Aucun compte attaché.',
@ -848,8 +844,6 @@ return array(
'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Ce graphique montre la durée moyenne du lead et cycle time pour les %d dernières tâches.',
'Average time into each column' => 'Temps moyen dans chaque colonne',
'Lead and cycle time' => 'Lead et cycle time',
'Google Authentication' => 'Authentification Google',
'Help on Google authentication' => 'Aide sur l\'authentification Google',
'Github Authentication' => 'Authentification Github',
'Help on Github authentication' => 'Aide sur l\'authentification Github',
'Lead time: ' => 'Lead time : ',
@ -860,7 +854,6 @@ return array(
'If the task is not closed the current time is used instead of the completion date.' => 'Si la tâche n\'est pas fermée, l\'heure courante est utilisée à la place de la date de complétion.',
'Set automatically the start date' => 'Définir automatiquement la date de début',
'Edit Authentication' => 'Modifier l\'authentification',
'Google Id' => 'Identifiant Google',
'Github Id' => 'Identifiant Github',
'Remote user' => 'Utilisateur distant',
'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Les utilisateurs distants ne stockent pas leur mot de passe dans la base de données de Kanboard, exemples : comptes LDAP, Github ou Google.',

View File

@ -260,9 +260,6 @@ return array(
// 'External authentication failed' => '',
// 'Your external account is linked to your profile successfully.' => '',
'Email' => 'E-mail',
'Link my Google Account' => 'Kapcsold össze a Google fiókkal',
'Unlink my Google Account' => 'Válaszd le a Google fiókomat',
'Login with my Google Account' => 'Jelentkezzen be Google fiókkal',
'Project not found.' => 'A projekt nem található.',
'Task removed successfully.' => 'Feladat sikeresen törölve.',
'Unable to remove this task.' => 'A feladatot nem lehet törölni.',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Jelszó módosítása',
'Password modification' => 'Jelszó módosítása',
'External authentications' => 'Külső azonosítás',
'Google Account' => 'Google fiók',
'Github Account' => 'Github fiók',
'Never connected.' => 'Sosem csatlakozva.',
'No account linked.' => 'Nincs csatlakoztatott fiók.',
@ -846,8 +842,6 @@ return array(
// 'This chart show the average lead and cycle time for the last %d tasks over the time.' => '',
// 'Average time into each column' => '',
// 'Lead and cycle time' => '',
// 'Google Authentication' => '',
// 'Help on Google authentication' => '',
// 'Github Authentication' => '',
// 'Help on Github authentication' => '',
// 'Lead time: ' => '',
@ -858,7 +852,6 @@ return array(
// 'If the task is not closed the current time is used instead of the completion date.' => '',
// 'Set automatically the start date' => '',
// 'Edit Authentication' => '',
// 'Google Id' => '',
// 'Github Id' => '',
// 'Remote user' => '',
// 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '',

View File

@ -260,9 +260,6 @@ return array(
'External authentication failed' => 'Otentifikasi eksternal gagal',
'Your external account is linked to your profile successfully.' => 'Akun eksternal anda berhasil dihubungkan ke profil anda.',
'Email' => 'Email',
'Link my Google Account' => 'Hubungkan akun Google saya',
'Unlink my Google Account' => 'Putuskan akun Google saya',
'Login with my Google Account' => 'Masuk menggunakan akun Google saya',
'Project not found.' => 'Proyek tidak ditemukan.',
'Task removed successfully.' => 'Tugas berhasil dihapus.',
'Unable to remove this task.' => 'Tidak dapat menghapus tugas ini.',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Rubah kata sandri',
'Password modification' => 'Modifikasi kata sandi',
'External authentications' => 'Otentifikasi eksternal',
'Google Account' => 'Akun Google',
'Github Account' => 'Akun Github',
'Never connected.' => 'Tidak pernah terhubung.',
'No account linked.' => 'Tidak ada akun terhubung.',
@ -846,8 +842,6 @@ return array(
'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Grafik ini menunjukkan memimpin rata-rata dan waktu siklus untuk %d tugas terakhir dari waktu ke waktu.',
'Average time into each column' => 'Rata-rata waktu ke setiap kolom',
'Lead and cycle time' => 'Lead dan siklus waktu',
'Google Authentication' => 'Google Otentifikasi',
'Help on Google authentication' => 'Bantuan pada otentifikasi Google',
'Github Authentication' => 'Otentifikasi Github',
'Help on Github authentication' => 'Bantuan pada otentifikasi Github',
'Lead time: ' => 'Lead time : ',
@ -858,7 +852,6 @@ return array(
'If the task is not closed the current time is used instead of the completion date.' => 'Jika tugas tidak ditutup waktu saat ini yang digunakan sebagai pengganti tanggal penyelesaian.',
'Set automatically the start date' => 'Secara otomatis mengatur tanggal mulai',
'Edit Authentication' => 'Modifikasi Otentifikasi',
'Google Id' => 'Id Google',
'Github Id' => 'Id Github',
'Remote user' => 'Pengguna jauh',
'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Pengguna jauh tidak menyimpan kata sandi mereka dalam basis data Kanboard, contoh: akun LDAP, Google dan Github.',

View File

@ -260,9 +260,6 @@ return array(
'External authentication failed' => 'Autenticazione esterna fallita',
'Your external account is linked to your profile successfully.' => 'Il tuo account esterno è stato collegato al tuo profilo con successo.',
'Email' => 'E-mail',
'Link my Google Account' => 'Collegare il mio Account di Google',
'Unlink my Google Account' => 'Scollegare il mio account di Google',
'Login with my Google Account' => 'Entra con il mio Account di Google',
'Project not found.' => 'progetto non trovato.',
'Task removed successfully.' => 'Task cancellato correttamente.',
'Unable to remove this task.' => 'Impossibile cancellare questo task.',
@ -352,7 +349,7 @@ return array(
'Title:' => 'Titolo',
'Status:' => 'Stato',
'Assignee:' => 'Assegnatario:',
// 'Time tracking:' => 'Gestione del tempo:',
// 'Time tracking:' => '',
'New sub-task' => 'Nuovo sotto-task',
'New attachment added "%s"' => 'Nuovo allegato aggiunto "%s"',
'Comment updated' => 'Commento aggiornato',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Cambia password',
'Password modification' => 'Modifica della password',
'External authentications' => 'Autenticazione esterna',
'Google Account' => 'Account Google',
'Github Account' => 'Account Github',
'Never connected.' => 'Mai connesso.',
'No account linked.' => 'Nessun account collegato.',
@ -568,7 +564,7 @@ return array(
'Select the new status of the subtask: "%s"' => 'Seleziona il nuovo status per il sotto-task: "%s"',
'Subtask timesheet' => 'Timesheet del sotto-task',
'There is nothing to show.' => 'Nulla da mostrare.',
// 'Time Tracking' => 'Gestione del tempo',
// 'Time Tracking' => '',
'You already have one subtask in progress' => 'Hai già un sotto-task in corso',
'Which parts of the project do you want to duplicate?' => 'Quali parti del progetto vuoi duplicare?',
'Disallow login form' => 'Disabilita il form di login',
@ -686,7 +682,6 @@ return array(
'Take a screenshot and press CTRL+V or ⌘+V to paste here.' => 'Cattura una schermata e premi CTRL+V o ⌘+V per incollarla qui.',
'Screenshot uploaded successfully.' => 'Schermata caricata correttamente.',
'SEK - Swedish Krona' => 'SEK - Corona svedese',
'The project identifier is an optional alphanumeric code used to identify your project.' => 'L\'identificatore di progetto è un codice alfanumerico usato per indentificare il tuo progetto. ',
'Identifier' => 'Identificatore',
'Disable two factor authentication' => 'Disabilita l\'autenticazione "two-factor"',
'Do you really want to disable the two factor authentication for this user: "%s"?' => 'Vuoi davvero disabilitare l\'autenticazione "two-factor" per questo utente: "%s"?',
@ -815,7 +810,7 @@ return array(
'View advanced search syntax' => 'Visualizza la sintassi di ricerca avanzata',
'Overview' => 'Panoramica',
// '%b %e %Y' => '',
'Board/Calendar/List view' => '',
// 'Board/Calendar/List view' => '',
'Switch to the board view' => 'Passa alla vista "bacheca"',
'Switch to the calendar view' => 'Passa alla vista "calendario"',
'Switch to the list view' => 'Passa alla vista "elenco"',
@ -847,8 +842,6 @@ return array(
'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Questo grafico mostra i tempi medi di consegna (Lead Time) e lavorazione (Cycle Time) per gli ultimi %d task.',
'Average time into each column' => 'Tempo medio in ogni colonna',
'Lead and cycle time' => 'Tempo di consegna e lavorazione',
'Google Authentication' => 'Autenticazione con Google',
'Help on Google authentication' => 'Aiuto sull\'autenticazione con Google',
'Github Authentication' => 'Autenticazione con Github',
'Help on Github authentication' => 'Aiuto sull\'autenticazione con Github',
'Lead time: ' => 'Tempo di consegna (Lead Time): ',
@ -859,7 +852,6 @@ return array(
'If the task is not closed the current time is used instead of the completion date.' => 'Se il task non è chiuso sarà usata la data attuale invece della data di completamento.',
'Set automatically the start date' => 'Imposta automaticamente la data di inzio',
'Edit Authentication' => 'Modifica Autenticazione',
'Google Id' => 'Id Google',
'Github Id' => 'Id Github',
'Remote user' => 'Utente remoto',
'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'La password degli utenti remoti (ad esempio: LDAP, account Google e Github) non è salvata nel database di Kanboard',
@ -994,7 +986,6 @@ return array(
'Append/Replace' => 'Aggiungi/Sostituisci',
'Append' => 'Aggiungi',
'Replace' => 'Sostituisci',
'There is no notification method registered.' => 'Nessun metodo di notifica definito.',
'Import' => 'Importa',
'change sorting' => 'cambia ordinamento',
'Tasks Importation' => 'Importazione task',

View File

@ -260,9 +260,6 @@ return array(
// 'External authentication failed' => '',
// 'Your external account is linked to your profile successfully.' => '',
'Email' => 'Email',
'Link my Google Account' => 'Google アカウントをリンクする',
'Unlink my Google Account' => 'Google アカウントのリンクを解除する',
'Login with my Google Account' => 'Google アカウントでログインする',
'Project not found.' => 'プロジェクトが見つかりません。',
'Task removed successfully.' => 'タスクを削除しました。',
'Unable to remove this task.' => 'タスクの削除に失敗しました。',
@ -395,7 +392,6 @@ return array(
'Change password' => 'パスワードの変更',
'Password modification' => 'パスワードの変更',
'External authentications' => '外部認証',
'Google Account' => 'Google アカウント',
'Github Account' => 'Github アカウント',
'Never connected.' => '未接続。',
'No account linked.' => 'アカウントがリンクしていません。',
@ -846,8 +842,6 @@ return array(
// 'This chart show the average lead and cycle time for the last %d tasks over the time.' => '',
// 'Average time into each column' => '',
// 'Lead and cycle time' => '',
// 'Google Authentication' => '',
// 'Help on Google authentication' => '',
// 'Github Authentication' => '',
// 'Help on Github authentication' => '',
// 'Lead time: ' => '',
@ -858,7 +852,6 @@ return array(
// 'If the task is not closed the current time is used instead of the completion date.' => '',
// 'Set automatically the start date' => '',
// 'Edit Authentication' => '',
// 'Google Id' => '',
// 'Github Id' => '',
// 'Remote user' => '',
// 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '',

View File

@ -260,9 +260,6 @@ return array(
'External authentication failed' => 'Otentifikasi eksternal gagal',
'Your external account is linked to your profile successfully.' => 'Akaun eksternal anda berhasil dihubungkan ke profil anda.',
'Email' => 'Email',
'Link my Google Account' => 'Hubungkan Akaun Google saya',
'Unlink my Google Account' => 'Putuskan Akaun Google saya',
'Login with my Google Account' => 'Masuk menggunakan Akaun Google saya',
'Project not found.' => 'projek tidak ditemukan.',
'Task removed successfully.' => 'Tugas berhasil dihapus.',
'Unable to remove this task.' => 'Tidak dapat menghapus tugas ini.',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Rubah kata sandri',
'Password modification' => 'Modifikasi kata laluan',
'External authentications' => 'Otentifikasi eksternal',
'Google Account' => 'Akaun Google',
'Github Account' => 'Akaun Github',
'Never connected.' => 'Tidak pernah terhubung.',
'No account linked.' => 'Tidak ada Akaun terhubung.',
@ -846,8 +842,6 @@ return array(
'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Grafik ini menunjukkan memimpin rata-rata dan waktu siklus untuk %d tugas terakhir dari waktu ke waktu.',
'Average time into each column' => 'Rata-rata waktu ke setiap kolom',
'Lead and cycle time' => 'Lead dan siklus waktu',
'Google Authentication' => 'Google Otentifikasi',
'Help on Google authentication' => 'Bantuan pada otentifikasi Google',
'Github Authentication' => 'Otentifikasi Github',
'Help on Github authentication' => 'Bantuan pada otentifikasi Github',
'Lead time: ' => 'Lead time : ',
@ -858,7 +852,6 @@ return array(
'If the task is not closed the current time is used instead of the completion date.' => 'Jika tugas tidak ditutup waktu saat ini yang digunakan sebagai pengganti tanggal penyelesaian.',
'Set automatically the start date' => 'Secara otomatis mengatur tanggal mulai',
'Edit Authentication' => 'Modifikasi Otentifikasi',
'Google Id' => 'Id Google',
'Github Id' => 'Id Github',
'Remote user' => 'Pengguna jauh',
'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Pengguna jauh tidak menyimpan kata laluan mereka dalam basis data Kanboard, contoh: Akaun LDAP, Google dan Github.',

View File

@ -260,9 +260,6 @@ return array(
// 'External authentication failed' => '',
// 'Your external account is linked to your profile successfully.' => '',
'Email' => 'Epost',
'Link my Google Account' => 'Knytt til min Google-konto',
'Unlink my Google Account' => 'Fjern knytningen til min Google-konto',
'Login with my Google Account' => 'Login med min Google-konto',
'Project not found.' => 'Prosjekt ikke funnet.',
'Task removed successfully.' => 'Oppgaven er fjernet.',
'Unable to remove this task.' => 'Oppgaven kunne ikke fjernes.',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Endre passord',
'Password modification' => 'Passordendring',
'External authentications' => 'Ekstern godkjenning',
'Google Account' => 'Google-konto',
'Github Account' => 'GitHub-konto',
'Never connected.' => 'Aldri innlogget.',
'No account linked.' => 'Ingen kontoer knyttet.',
@ -846,8 +842,6 @@ return array(
// 'This chart show the average lead and cycle time for the last %d tasks over the time.' => '',
// 'Average time into each column' => '',
// 'Lead and cycle time' => '',
// 'Google Authentication' => '',
// 'Help on Google authentication' => '',
// 'Github Authentication' => '',
// 'Help on Github authentication' => '',
// 'Lead time: ' => '',
@ -858,7 +852,6 @@ return array(
// 'If the task is not closed the current time is used instead of the completion date.' => '',
// 'Set automatically the start date' => '',
// 'Edit Authentication' => '',
// 'Google Id' => '',
// 'Github Id' => '',
// 'Remote user' => '',
// 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '',

View File

@ -260,9 +260,6 @@ return array(
// 'External authentication failed' => '',
// 'Your external account is linked to your profile successfully.' => '',
'Email' => 'Email',
'Link my Google Account' => 'Link mijn Google Account',
'Unlink my Google Account' => 'Link met Google Account verwijderen',
'Login with my Google Account' => 'Inloggen met mijn Google Account',
'Project not found.' => 'Project niet gevonden.',
'Task removed successfully.' => 'Taak succesvol verwijderd.',
'Unable to remove this task.' => 'Taak verwijderen niet gelukt.',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Wachtwoord aanpassen',
'Password modification' => 'Wachtwoord aanpassen',
'External authentications' => 'Externe authenticatie',
'Google Account' => 'Google Account',
'Github Account' => 'Github Account',
'Never connected.' => 'Nooit verbonden.',
'No account linked.' => 'Geen account gelinkt.',
@ -846,8 +842,6 @@ return array(
// 'This chart show the average lead and cycle time for the last %d tasks over the time.' => '',
// 'Average time into each column' => '',
// 'Lead and cycle time' => '',
// 'Google Authentication' => '',
// 'Help on Google authentication' => '',
// 'Github Authentication' => '',
// 'Help on Github authentication' => '',
// 'Lead time: ' => '',
@ -858,7 +852,6 @@ return array(
// 'If the task is not closed the current time is used instead of the completion date.' => '',
// 'Set automatically the start date' => '',
// 'Edit Authentication' => '',
// 'Google Id' => '',
// 'Github Id' => '',
// 'Remote user' => '',
// 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '',

View File

@ -260,9 +260,6 @@ return array(
// 'External authentication failed' => '',
// 'Your external account is linked to your profile successfully.' => '',
'Email' => 'Email',
'Link my Google Account' => 'Połącz z kontem Google',
'Unlink my Google Account' => 'Rozłącz z kontem Google',
'Login with my Google Account' => 'Zaloguj przy pomocy konta Google',
'Project not found.' => 'Projek nieznaleziony.',
'Task removed successfully.' => 'Zadanie usunięto pomyślnie.',
'Unable to remove this task.' => 'Nie można usunąć tego zadania.',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Zmień hasło',
'Password modification' => 'Zmiana hasła',
'External authentications' => 'Autentykacja zewnętrzna',
'Google Account' => 'Konto Google',
'Github Account' => 'Konto Github',
'Never connected.' => 'Nigdy nie połączone.',
'No account linked.' => 'Brak połączonych kont.',
@ -846,8 +842,6 @@ return array(
// 'This chart show the average lead and cycle time for the last %d tasks over the time.' => '',
// 'Average time into each column' => '',
// 'Lead and cycle time' => '',
// 'Google Authentication' => '',
// 'Help on Google authentication' => '',
// 'Github Authentication' => '',
// 'Help on Github authentication' => '',
// 'Lead time: ' => '',
@ -858,7 +852,6 @@ return array(
// 'If the task is not closed the current time is used instead of the completion date.' => '',
// 'Set automatically the start date' => '',
'Edit Authentication' => 'Edycja autoryzacji',
// 'Google Id' => '',
// 'Github Id' => '',
// 'Remote user' => '',
// 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '',

View File

@ -260,9 +260,6 @@ return array(
'External authentication failed' => 'Autenticação externa falhou',
'Your external account is linked to your profile successfully.' => 'Sua conta externa está agora ligada ao seu perfil.',
'Email' => 'E-mail',
'Link my Google Account' => 'Vincular minha Conta do Google',
'Unlink my Google Account' => 'Desvincular minha Conta do Google',
'Login with my Google Account' => 'Entrar com minha Conta do Google',
'Project not found.' => 'Projeto não encontrado.',
'Task removed successfully.' => 'Tarefa removida com sucesso.',
'Unable to remove this task.' => 'Não foi possível remover esta tarefa.',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Alterar senha',
'Password modification' => 'Alteração de senha',
'External authentications' => 'Autenticação externa',
'Google Account' => 'Conta do Google',
'Github Account' => 'Conta do Github',
'Never connected.' => 'Nunca conectado.',
'No account linked.' => 'Nenhuma conta associada.',
@ -846,8 +842,6 @@ return array(
'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Este gráfico mostra o tempo médio do Lead and cycle time das últimas %d tarefas.',
'Average time into each column' => 'Tempo médio de cada coluna',
'Lead and cycle time' => 'Lead and cycle time',
'Google Authentication' => 'Autenticação Google',
'Help on Google authentication' => 'Ajuda com a autenticação Google',
'Github Authentication' => 'Autenticação Github',
'Help on Github authentication' => 'Ajuda com a autenticação Github',
'Lead time: ' => 'Lead time: ',
@ -858,7 +852,6 @@ return array(
'If the task is not closed the current time is used instead of the completion date.' => 'Se a tarefa não está fechada, a hora atual é usada no lugar da data de conclusão.',
'Set automatically the start date' => 'Definir automaticamente a data de início',
'Edit Authentication' => 'Modificar a autenticação',
'Google Id' => 'Google ID',
'Github Id' => 'Github Id',
'Remote user' => 'Usuário remoto',
'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Os usuários remotos não conservam as suas senhas no banco de dados Kanboard, exemplos: contas LDAP, Github ou Google.',

View File

@ -260,9 +260,6 @@ return array(
'External authentication failed' => 'Autenticação externa falhou',
'Your external account is linked to your profile successfully.' => 'A sua conta externa foi vinculada com sucesso ao seu perfil',
'Email' => 'E-mail',
'Link my Google Account' => 'Vincular a minha Conta do Google',
'Unlink my Google Account' => 'Desvincular a minha Conta do Google',
'Login with my Google Account' => 'Entrar com a minha Conta do Google',
'Project not found.' => 'Projecto não encontrado.',
'Task removed successfully.' => 'Tarefa removida com sucesso.',
'Unable to remove this task.' => 'Não foi possível remover esta tarefa.',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Alterar senha',
'Password modification' => 'Alteração de senha',
'External authentications' => 'Autenticação externa',
'Google Account' => 'Conta do Google',
'Github Account' => 'Conta do Github',
'Never connected.' => 'Nunca conectado.',
'No account linked.' => 'Nenhuma conta associada.',
@ -846,8 +842,6 @@ return array(
'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Este gráfico mostra o tempo médio de espera e ciclo para as últimas %d tarefas realizadas.',
'Average time into each column' => 'Tempo médio em cada coluna',
'Lead and cycle time' => 'Tempo de Espera e Ciclo',
'Google Authentication' => 'Autenticação Google',
'Help on Google authentication' => 'Ajuda com autenticação Google',
'Github Authentication' => 'Autenticação Github',
'Help on Github authentication' => 'Ajuda com autenticação Github',
'Lead time: ' => 'Tempo de Espera: ',
@ -858,7 +852,6 @@ return array(
'If the task is not closed the current time is used instead of the completion date.' => 'Se a tarefa não estiver fechada o hora actual será usada em vez da hora de conclusão',
'Set automatically the start date' => 'Definir data de inicio automáticamente',
'Edit Authentication' => 'Editar Autenticação',
'Google Id' => 'Id Google',
'Github Id' => 'Id Github',
'Remote user' => 'Utilizador remoto',
'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Utilizadores remotos não guardam a password na base de dados do Kanboard, por exemplo: LDAP, contas do Google e Github.',

View File

@ -260,9 +260,6 @@ return array(
'External authentication failed' => 'Внешняя авторизация не удалась',
'Your external account is linked to your profile successfully.' => 'Ваш внешний аккаунт успешно подключен к профилю.',
'Email' => 'E-mail',
'Link my Google Account' => 'Привязать мой профиль к Google',
'Unlink my Google Account' => 'Отвязать мой профиль от Google',
'Login with my Google Account' => 'Аутентификация через Google',
'Project not found.' => 'Проект не найден.',
'Task removed successfully.' => 'Задача удалена.',
'Unable to remove this task.' => 'Не удалось удалить эту задачу.',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Сменить пароль',
'Password modification' => 'Изменение пароля',
'External authentications' => 'Внешняя аутентификация',
'Google Account' => 'Профиль Google',
'Github Account' => 'Профиль Github',
'Never connected.' => 'Ранее не соединялось.',
'No account linked.' => 'Нет связанных профилей.',
@ -846,8 +842,6 @@ return array(
'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Эта диаграма показывает среднее время выполнения и цикла задачь в последние %d.',
'Average time into each column' => 'Среднее время в каждом столбце',
'Lead and cycle time' => 'Время выполнения и цикла',
'Google Authentication' => 'Авторизация Google',
'Help on Google authentication' => 'Помощь в авторизации Google',
'Github Authentication' => 'Авторизация Github',
'Help on Github authentication' => 'Помощь в авторизации Github',
'Lead time: ' => 'Время выполнения:',
@ -858,7 +852,6 @@ return array(
'If the task is not closed the current time is used instead of the completion date.' => 'Если задача не закрыта, то текущая дата будет указана в дате завершения задачи.',
'Set automatically the start date' => 'Установить автоматическую дату начала',
'Edit Authentication' => 'Редактировать авторизацию',
'Google Id' => 'Google Id',
'Github Id' => 'Github Id',
'Remote user' => 'Удаленный пользователь',
'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Учетные данные для входа через LDAP, Google и Github не будут сохранены в Kanboard.',

View File

@ -260,9 +260,6 @@ return array(
// 'External authentication failed' => '',
// 'Your external account is linked to your profile successfully.' => '',
'Email' => 'E-mail',
'Link my Google Account' => 'Poveži sa Google nalogom',
'Unlink my Google Account' => 'Ukini vezu sa Google nalogom',
'Login with my Google Account' => 'Prijavi se preko Google naloga',
'Project not found.' => 'Projekat nije pronađen.',
'Task removed successfully.' => 'Zadatak uspešno uklonjen.',
'Unable to remove this task.' => 'Nemoguće uklanjanje zadatka.',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Izmeni lozinku',
'Password modification' => 'Izmena lozinke',
'External authentications' => 'Spoljne akcije',
'Google Account' => 'Google nalog',
'Github Account' => 'Github nalog',
'Never connected.' => 'Bez konekcija.',
'No account linked.' => 'Bez povezanih naloga.',
@ -846,8 +842,6 @@ return array(
// 'This chart show the average lead and cycle time for the last %d tasks over the time.' => '',
// 'Average time into each column' => '',
// 'Lead and cycle time' => '',
// 'Google Authentication' => '',
// 'Help on Google authentication' => '',
// 'Github Authentication' => '',
// 'Help on Github authentication' => '',
// 'Lead time: ' => '',
@ -858,7 +852,6 @@ return array(
// 'If the task is not closed the current time is used instead of the completion date.' => '',
// 'Set automatically the start date' => '',
// 'Edit Authentication' => '',
// 'Google Id' => '',
// 'Github Id' => '',
// 'Remote user' => '',
// 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '',

View File

@ -260,9 +260,6 @@ return array(
'External authentication failed' => 'Extern autentisering misslyckades',
'Your external account is linked to your profile successfully.' => 'Ditt externa konto länkades till din profil.',
'Email' => 'Epost',
'Link my Google Account' => 'Länka till mitt Google-konto',
'Unlink my Google Account' => 'Ta bort länken till mitt Google-konto',
'Login with my Google Account' => 'Logga in med mitt Google-konto',
'Project not found.' => 'Projektet kunde inte hittas',
'Task removed successfully.' => 'Uppgiften har tagits bort',
'Unable to remove this task.' => 'Kunde inte ta bort denna uppgift',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Byt lösenord',
'Password modification' => 'Ändra lösenord',
'External authentications' => 'Extern autentisering',
'Google Account' => 'Googlekonto',
'Github Account' => 'Githubkonto',
'Never connected.' => 'Inte ansluten.',
'No account linked.' => 'Inget konto länkat.',
@ -846,8 +842,6 @@ return array(
'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Diagramet visar medel av led och cykeltid för de senaste %d uppgifterna över tiden.',
'Average time into each column' => 'Medeltidsåtgång i varje kolumn',
'Lead and cycle time' => 'Led och cykeltid',
'Google Authentication' => 'Google autentisering',
'Help on Google authentication' => 'Hjälp för Google autentisering',
'Github Authentication' => 'Github autentisering',
'Help on Github authentication' => 'Hjälp för Github autentisering',
'Lead time: ' => 'Ledtid',
@ -858,7 +852,6 @@ return array(
'If the task is not closed the current time is used instead of the completion date.' => 'Om uppgiften inte är stängd används nuvarande tid istället för slutförandedatum.',
'Set automatically the start date' => 'Sätt startdatum automatiskt',
'Edit Authentication' => 'Ändra autentisering',
'Google Id' => 'Google Id',
'Github Id' => 'Github Id',
'Remote user' => 'Extern användare',
'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Externa användares lösenord lagras inte i Kanboard-databasen, exempel: LDAP, Google och Github-konton.',

View File

@ -260,9 +260,6 @@ return array(
// 'External authentication failed' => '',
// 'Your external account is linked to your profile successfully.' => '',
'Email' => 'อีเมล',
'Link my Google Account' => 'เชื่อมต่อกับกูเกิลแอคเคาท์',
'Unlink my Google Account' => 'ไม่เชื่อมต่อกับกูเกิลแอคเคาท์',
'Login with my Google Account' => 'เข้าใช้ด้วยกูเกิลแอคเคาท์',
'Project not found.' => 'หาโปรเจคไม่พบ',
'Task removed successfully.' => 'ลบงานเรียบร้อยแล้ว',
'Unable to remove this task.' => 'ไม่สามารถลบงานนี้',
@ -395,7 +392,6 @@ return array(
'Change password' => 'เปลี่ยนรหัสผ่าน',
'Password modification' => 'แก้ไขรหัสผ่าน',
'External authentications' => 'การยืนยันภายนอก',
'Google Account' => 'กูเกิลแอคเคาท์',
'Github Account' => 'กิทฮับแอคเคาท์',
'Never connected.' => 'ไม่เชื่อมต่อ',
'No account linked.' => 'แอคเคาท์ไม่มีการเชื่อม',
@ -846,8 +842,6 @@ return array(
// 'This chart show the average lead and cycle time for the last %d tasks over the time.' => '',
// 'Average time into each column' => '',
// 'Lead and cycle time' => '',
// 'Google Authentication' => '',
// 'Help on Google authentication' => '',
// 'Github Authentication' => '',
// 'Help on Github authentication' => '',
// 'Lead time: ' => '',
@ -858,7 +852,6 @@ return array(
// 'If the task is not closed the current time is used instead of the completion date.' => '',
// 'Set automatically the start date' => '',
// 'Edit Authentication' => '',
// 'Google Id' => '',
// 'Github Id' => '',
// 'Remote user' => '',
// 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '',

View File

@ -260,9 +260,6 @@ return array(
'External authentication failed' => 'Harici hesap doğrulaması başarısız',
'Your external account is linked to your profile successfully.' => 'Harici hesabınız profilinizle başarıyla bağlandı.',
'Email' => 'E-posta',
'Link my Google Account' => 'Google hesabımla bağ oluştur',
'Unlink my Google Account' => 'Google hesabımla bağı kaldır',
'Login with my Google Account' => 'Google hesabımla giriş yap',
'Project not found.' => 'Proje bulunamadı',
'Task removed successfully.' => 'Görev başarıyla silindi.',
'Unable to remove this task.' => 'Görev silinemiyor.',
@ -395,7 +392,6 @@ return array(
'Change password' => 'Şifre değiştir',
'Password modification' => 'Şifre değişimi',
'External authentications' => 'Dış kimlik doğrulamaları',
'Google Account' => 'Google hesabı',
'Github Account' => 'Github hesabı',
'Never connected.' => 'Hiç bağlanmamış.',
'No account linked.' => 'Bağlanmış hesap yok.',
@ -846,8 +842,6 @@ return array(
'This chart show the average lead and cycle time for the last %d tasks over the time.' => 'Bu grafik son %d görev için zaman içinde gerçekleşen ortalama teslim ve çevrim sürelerini gösterir.',
'Average time into each column' => 'Her bir sütunda ortalama zaman',
'Lead and cycle time' => 'Teslim ve çevrim süresi',
'Google Authentication' => 'Google doğrulaması',
'Help on Google authentication' => 'Google doğrulaması hakkında yardım',
'Github Authentication' => 'Github doğrulaması',
'Help on Github authentication' => 'Github doğrulaması hakkında yardım',
'Lead time: ' => 'Teslim süresi: ',
@ -858,7 +852,6 @@ return array(
'If the task is not closed the current time is used instead of the completion date.' => 'Eğer görev henüz kapatılmamışsa, tamamlanma tarihi yerine şu anki tarih kullanılır.',
'Set automatically the start date' => 'Başlangıç tarihini otomatik olarak belirle',
'Edit Authentication' => 'Doğrulamayı düzenle',
'Google Id' => 'Google kimliği',
'Github Id' => 'Github Kimliği',
'Remote user' => 'Uzak kullanıcı',
'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => 'Uzak kullanıcıların şifreleri Kanboard veritabanında saklanmaz, örnek: LDAP, Google ve Github hesapları',

View File

@ -260,9 +260,6 @@ return array(
// 'External authentication failed' => '',
// 'Your external account is linked to your profile successfully.' => '',
'Email' => '电子邮件',
'Link my Google Account' => '关联我的google帐号',
'Unlink my Google Account' => '去除我的google帐号关联',
'Login with my Google Account' => '用我的google帐号登录',
'Project not found.' => '未发现项目',
'Task removed successfully.' => '任务成功去除',
'Unable to remove this task.' => '无法移除该任务。',
@ -395,7 +392,6 @@ return array(
'Change password' => '修改密码',
'Password modification' => '修改密码',
'External authentications' => '外部认证',
'Google Account' => '谷歌账号',
'Github Account' => 'Github 账号',
'Never connected.' => '从未连接。',
'No account linked.' => '未链接账号。',
@ -846,8 +842,6 @@ return array(
// 'This chart show the average lead and cycle time for the last %d tasks over the time.' => '',
// 'Average time into each column' => '',
// 'Lead and cycle time' => '',
// 'Google Authentication' => '',
// 'Help on Google authentication' => '',
// 'Github Authentication' => '',
// 'Help on Github authentication' => '',
// 'Lead time: ' => '',
@ -858,7 +852,6 @@ return array(
// 'If the task is not closed the current time is used instead of the completion date.' => '',
// 'Set automatically the start date' => '',
// 'Edit Authentication' => '',
// 'Google Id' => '',
// 'Github Id' => '',
// 'Remote user' => '',
// 'Remote users do not store their password in Kanboard database, examples: LDAP, Google and Github accounts.' => '',

View File

@ -48,20 +48,7 @@ class User extends Base
*/
public function getQuery()
{
return $this->db
->table(self::TABLE)
->columns(
'id',
'username',
'name',
'email',
'role',
'is_ldap_user',
'notifications_enabled',
'google_id',
'github_id',
'twofactor_activated'
);
return $this->db->table(self::TABLE);
}
/**

View File

@ -13,7 +13,6 @@ use Kanboard\Auth\DatabaseAuth;
use Kanboard\Auth\LdapAuth;
use Kanboard\Auth\GitlabAuth;
use Kanboard\Auth\GithubAuth;
use Kanboard\Auth\GoogleAuth;
use Kanboard\Auth\TotpAuth;
use Kanboard\Auth\ReverseProxyAuth;
@ -55,10 +54,6 @@ class AuthenticationProvider implements ServiceProviderInterface
$container['authenticationManager']->register(new GithubAuth($container));
}
if (GOOGLE_AUTH) {
$container['authenticationManager']->register(new GoogleAuth($container));
}
$container['projectAccessMap'] = $this->getProjectAccessMap();
$container['applicationAccessMap'] = $this->getApplicationAccessMap();
@ -126,7 +121,7 @@ class AuthenticationProvider implements ServiceProviderInterface
$acl->setRoleHierarchy(Role::APP_MANAGER, array(Role::APP_USER, Role::APP_PUBLIC));
$acl->setRoleHierarchy(Role::APP_USER, array(Role::APP_PUBLIC));
$acl->add('Oauth', array('google', 'github', 'gitlab'), Role::APP_PUBLIC);
$acl->add('Oauth', array('github', 'gitlab'), Role::APP_PUBLIC);
$acl->add('Auth', array('login', 'check'), Role::APP_PUBLIC);
$acl->add('Captcha', '*', Role::APP_PUBLIC);
$acl->add('PasswordReset', '*', Role::APP_PUBLIC);

View File

@ -205,7 +205,6 @@ class RouteProvider implements ServiceProviderInterface
$container['route']->addRoute('documentation', 'doc', 'show');
// Auth routes
$container['route']->addRoute('oauth/google', 'oauth', 'google');
$container['route']->addRoute('oauth/github', 'oauth', 'github');
$container['route']->addRoute('oauth/gitlab', 'oauth', 'gitlab');
$container['route']->addRoute('login', 'auth', 'login');

View File

@ -40,12 +40,8 @@
<?= $this->hook->render('template:auth:login-form:after') ?>
<?php if (GOOGLE_AUTH || GITHUB_AUTH || GITLAB_AUTH): ?>
<?php if (GITHUB_AUTH || GITLAB_AUTH): ?>
<ul class="no-bullet">
<?php if (GOOGLE_AUTH): ?>
<li><?= $this->url->link(t('Login with my Google Account'), 'oauth', 'google') ?></li>
<?php endif ?>
<?php if (GITHUB_AUTH): ?>
<li><?= $this->url->link(t('Login with my Github Account'), 'oauth', 'github') ?></li>
<?php endif ?>

View File

@ -3,17 +3,9 @@
</div>
<form method="post" action="<?= $this->url->href('config', 'integrations') ?>" autocomplete="off">
<?= $this->form->csrf() ?>
<?= $this->hook->render('template:config:integrations', array('values' => $values)) ?>
<h3><i class="fa fa-google"></i> <?= t('Google Authentication') ?></h3>
<div class="listing">
<input type="text" class="auto-select" readonly="readonly" value="<?= $this->url->href('oauth', 'google', array(), false, '', true) ?>"/><br/>
<p class="form-help"><?= $this->url->doc(t('Help on Google authentication'), 'google-authentication') ?></p>
</div>
<h3><i class="fa fa-github"></i> <?= t('Github Authentication') ?></h3>
<div class="listing">
<input type="text" class="auto-select" readonly="readonly" value="<?= $this->url->href('oauth', 'github', array(), false, '', true) ?>"/><br/>

View File

@ -8,8 +8,7 @@
<?= $this->form->hidden('id', $values) ?>
<?= $this->form->hidden('username', $values) ?>
<?= $this->form->label(t('Google Id'), 'google_id') ?>
<?= $this->form->text('google_id', $values, $errors) ?>
<?= $this->hook->render('template:user:authentication:form', array('values' => $values, 'errors' => $errors, 'user' => $user)) ?>
<?= $this->form->label(t('Github Id'), 'github_id') ?>
<?= $this->form->text('github_id', $values, $errors) ?>

View File

@ -2,21 +2,7 @@
<h2><?= t('External authentications') ?></h2>
</div>
<?php if (GOOGLE_AUTH): ?>
<h3><i class="fa fa-google"></i> <?= t('Google Account') ?></h3>
<p class="listing">
<?php if ($this->user->isCurrentUser($user['id'])): ?>
<?php if (empty($user['google_id'])): ?>
<?= $this->url->link(t('Link my Google Account'), 'oauth', 'google', array(), true) ?>
<?php else: ?>
<?= $this->url->link(t('Unlink my Google Account'), 'oauth', 'unlink', array('backend' => 'Google'), true) ?>
<?php endif ?>
<?php else: ?>
<?= empty($user['google_id']) ? t('No account linked.') : t('Account linked.') ?>
<?php endif ?>
</p>
<?php endif ?>
<?php $html = $this->hook->render('template:user:external', array('user' => $user)) ?>
<?php if (GITHUB_AUTH): ?>
<h3><i class="fa fa-github"></i> <?= t('Github Account') ?></h3>
@ -50,6 +36,8 @@
</p>
<?php endif ?>
<?php if (! GOOGLE_AUTH && ! GITHUB_AUTH && ! GITLAB_AUTH): ?>
<?php if (empty($html) && ! GITHUB_AUTH && ! GITLAB_AUTH): ?>
<p class="alert"><?= t('No external authentication enabled.') ?></p>
<?php else: ?>
<?= $html ?>
<?php endif ?>

View File

@ -1,23 +0,0 @@
<?php
namespace Kanboard\User;
/**
* Google OAuth User Provider
*
* @package user
* @author Frederic Guillot
*/
class GoogleUserProvider extends OAuthUserProvider
{
/**
* Get external id column name
*
* @access public
* @return string
*/
public function getExternalIdColumn()
{
return 'google_id';
}
}

View File

@ -51,11 +51,6 @@ defined('LDAP_GROUP_BASE_DN') or define('LDAP_GROUP_BASE_DN', '');
defined('LDAP_GROUP_FILTER') or define('LDAP_GROUP_FILTER', '');
defined('LDAP_GROUP_ATTRIBUTE_NAME') or define('LDAP_GROUP_ATTRIBUTE_NAME', 'cn');
// Google authentication
defined('GOOGLE_AUTH') or define('GOOGLE_AUTH', false);
defined('GOOGLE_CLIENT_ID') or define('GOOGLE_CLIENT_ID', '');
defined('GOOGLE_CLIENT_SECRET') or define('GOOGLE_CLIENT_SECRET', '');
// Github authentication
defined('GITHUB_AUTH') or define('GITHUB_AUTH', false);
defined('GITHUB_CLIENT_ID') or define('GITHUB_CLIENT_ID', '');

View File

@ -1,64 +0,0 @@
Google Authentication
=====================
Requirements
------------
OAuth Google API credentials (available in the Google Developer Console)
How does this work?
-------------------
- The Google authentication in Kanboard use the OAuth 2.0 protocol
- Any user account in Kanboard can be linked to a Google Account
- When a Kanboard user account is linked to Google, you can login with one click
Procedure to link a Google Account
----------------------------------
1. Go to your user profile
2. Click on **External accounts**
3. Click on the link **Link my Google Account**
4. You are redirected to the **Google Consent screen**
5. Authorize Kanboard by clicking on the button **Accept**
6. Your account is now linked
Now, on the login page you can be authenticated in one click with the link **Login with my Google Account**.
Your name and email are automatically updated from your Google Account.
Installation instructions
-------------------------
### Setting up OAuth 2.0 in Google Developer Console
- Follow the [official Google documentation](https://developers.google.com/accounts/docs/OAuth2Login#appsetup) to create a new application
- In Kanboard, you can get the **redirect url** in **Settings > Integrations > Google Authentication**
### Setting up Kanboad
Create a custom `config.php` file or copy the `config.default.php` file:
```php
<?php
// Enable/disable Google authentication
define('GOOGLE_AUTH', true); // Set this value to true
// Google client id (Get this value from the Google developer console)
define('GOOGLE_CLIENT_ID', 'YOUR_CLIENT_ID');
// Google client secret key (Get this value from the Google developer console)
define('GOOGLE_CLIENT_SECRET', 'YOUR_CLIENT_SECRET');
```
Notes
-----
Kanboard use these information from your Google profile:
- Full name
- Email address
- Google unique id
The Google unique id is used to link together the local user account and the Google account.

View File

@ -118,7 +118,6 @@ Technical details
- [LDAP authentication](ldap-authentication.markdown)
- [LDAP group synchronization](ldap-group-sync.markdown)
- [LDAP parameters](ldap-parameters.markdown)
- [Google authentication](google-authentication.markdown)
- [Github authentication](github-authentication.markdown)
- [Gitlab authentication](gitlab-authentication.markdown)
- [Reverse proxy authentication](reverse-proxy-authentication.markdown)

View File

@ -1,89 +0,0 @@
<?php
require_once __DIR__.'/../Base.php';
use Kanboard\Auth\GoogleAuth;
use Kanboard\Model\User;
class GoogleAuthTest extends Base
{
public function testGetName()
{
$provider = new GoogleAuth($this->container);
$this->assertEquals('Google', $provider->getName());
}
public function testAuthenticationSuccessful()
{
$profile = array(
'id' => 1234,
'email' => 'test@localhost',
'name' => 'Test',
);
$provider = $this
->getMockBuilder('\Kanboard\Auth\GoogleAuth')
->setConstructorArgs(array($this->container))
->setMethods(array(
'getProfile',
))
->getMock();
$provider->expects($this->once())
->method('getProfile')
->will($this->returnValue($profile));
$this->assertInstanceOf('Kanboard\Auth\GoogleAuth', $provider->setCode('1234'));
$this->assertTrue($provider->authenticate());
$user = $provider->getUser();
$this->assertInstanceOf('Kanboard\User\GoogleUserProvider', $user);
$this->assertEquals('Test', $user->getName());
$this->assertEquals('', $user->getInternalId());
$this->assertEquals(1234, $user->getExternalId());
$this->assertEquals('', $user->getRole());
$this->assertEquals('', $user->getUsername());
$this->assertEquals('test@localhost', $user->getEmail());
$this->assertEquals('google_id', $user->getExternalIdColumn());
$this->assertEquals(array(), $user->getExternalGroupIds());
$this->assertEquals(array(), $user->getExtraAttributes());
$this->assertFalse($user->isUserCreationAllowed());
}
public function testAuthenticationFailed()
{
$provider = $this
->getMockBuilder('\Kanboard\Auth\GoogleAuth')
->setConstructorArgs(array($this->container))
->setMethods(array(
'getProfile',
))
->getMock();
$provider->expects($this->once())
->method('getProfile')
->will($this->returnValue(array()));
$this->assertFalse($provider->authenticate());
$this->assertEquals(null, $provider->getUser());
}
public function testGetService()
{
$provider = new GoogleAuth($this->container);
$this->assertInstanceOf('Kanboard\Core\Http\OAuth2', $provider->getService());
}
public function testUnlink()
{
$userModel = new User($this->container);
$provider = new GoogleAuth($this->container);
$this->assertEquals(2, $userModel->create(array('username' => 'test', 'google_id' => '1234')));
$this->assertNotEmpty($userModel->getByExternalId('google_id', 1234));
$this->assertTrue($provider->unlink(2));
$this->assertEmpty($userModel->getByExternalId('google_id', 1234));
}
}