2005-10-20 10:52:36 +00:00
< ? php
/*
$Id $
2009-10-27 18:47:12 +00:00
This code is part of LDAP Account Manager ( http :// www . ldap - account - manager . org / )
2013-01-15 21:53:45 +00:00
Copyright ( C ) 2005 - 2013 Roland Gruber
2005-10-20 10:52:36 +00:00
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
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
/**
* Manages SSH public keys .
*
* @ package modules
* @ author Roland Gruber
* @ author Andrew Dibble < adibble @ mobitv . com >
*/
/**
* Manages SSH public keys .
*
* @ package modules
*/
class ldapPublicKey extends baseModule {
2006-08-13 12:58:19 +00:00
2005-10-20 10:52:36 +00:00
/**
* Returns meta data that is interpreted by parent class
*
* @ return array array with meta data
2008-02-03 14:28:28 +00:00
*
* @ see baseModule :: get_metaData ()
2005-10-20 10:52:36 +00:00
*/
function get_metaData () {
$return = array ();
2007-11-19 18:42:03 +00:00
// icon
2007-12-01 12:34:52 +00:00
$return [ 'icon' ] = 'keyBig.png' ;
2005-10-20 10:52:36 +00:00
// manages host accounts
$return [ " account_types " ] = array ( " user " );
// alias name
$return [ " alias " ] = _ ( " SSH public key " );
// module dependencies
$return [ 'dependencies' ] = array ( 'depends' => array (), 'conflicts' => array ());
2006-04-05 15:48:27 +00:00
// managed object classes
$return [ 'objectClasses' ] = array ( 'ldapPublicKey' );
2006-05-13 08:55:31 +00:00
// managed attributes
$return [ 'attributes' ] = array ( 'sshPublicKey' );
2005-10-20 10:52:36 +00:00
// help Entries
$return [ 'help' ] = array (
'key' => array (
2012-02-04 15:56:31 +00:00
" Headline " => _ ( " SSH public key " ), 'attr' => 'sshPublicKey' ,
2005-10-20 10:52:36 +00:00
" Text " => _ ( " Please enter your public SSH key. " )
),
'keyList' => array (
2012-02-04 15:56:31 +00:00
" Headline " => _ ( " SSH public key " ), 'attr' => 'sshPublicKey' ,
2005-10-20 10:52:36 +00:00
" Text " => _ ( " Please a comma separated list of your public SSH keys. " )
)
);
// upload fields
$return [ 'upload_columns' ] = array (
array (
'name' => 'ldapPublicKey_sshPublicKey' ,
'description' => _ ( 'SSH public key' ),
'help' => 'keyList' ,
2007-06-10 14:51:35 +00:00
'example' => _ ( 'ssh-dss 234234 user@host' )
2005-10-20 10:52:36 +00:00
)
);
// available PDF fields
$return [ 'PDF_fields' ] = array (
2012-02-05 19:15:50 +00:00
'sshPublicKey' => _ ( 'SSH public keys' )
2005-10-20 10:52:36 +00:00
);
2013-01-15 21:53:45 +00:00
// self service field settings
$return [ 'selfServiceFieldSettings' ] = array (
'sshPublicKey' => _ ( 'SSH public keys' ),
);
$return [ 'selfServiceReadOnlyFields' ] = array ( 'sshPublicKey' );
2005-10-20 10:52:36 +00:00
return $return ;
}
/**
2007-11-03 14:17:19 +00:00
* Returns the HTML meta data for the main account page .
*
2010-09-20 17:41:20 +00:00
* @ return htmlElement HTML meta data
2007-11-03 14:17:19 +00:00
*/
2006-08-13 12:58:19 +00:00
function display_html_attributes () {
2010-09-20 17:41:20 +00:00
$return = new htmlTable ();
2010-05-19 19:22:29 +00:00
$keyCount = 0 ;
2005-10-20 10:52:36 +00:00
// list current keys
2010-05-19 19:22:29 +00:00
if ( isset ( $this -> attributes [ 'sshPublicKey' ])) {
$keyCount = sizeof ( $this -> attributes [ 'sshPublicKey' ]);
for ( $i = 0 ; $i < sizeof ( $this -> attributes [ 'sshPublicKey' ]); $i ++ ) {
2010-09-20 17:41:20 +00:00
$return -> addElement ( new htmlOutputText ( _ ( 'SSH public key' )));
$sshInput = new htmlInputField ( 'sshPublicKey' . $i , $this -> attributes [ 'sshPublicKey' ][ $i ]);
$sshInput -> setFieldSize ( 50 );
$sshInput -> setFieldMaxLength ( 4096 );
$return -> addElement ( $sshInput );
$return -> addElement ( new htmlButton ( 'delKey' . $i , 'del.png' , true ));
$return -> addElement ( new htmlHelpLink ( 'key' ), true );
2010-05-19 19:22:29 +00:00
}
2005-10-20 10:52:36 +00:00
}
// input box for new key
2010-09-20 17:41:20 +00:00
$return -> addElement ( new htmlOutputText ( _ ( 'New SSH public key' )));
$sshNewKey = new htmlInputField ( 'sshPublicKey' );
$sshNewKey -> setFieldSize ( 50 );
$sshNewKey -> setFieldMaxLength ( 4096 );
$return -> addElement ( $sshNewKey );
$return -> addElement ( new htmlButton ( 'addKey' , 'add.png' , true ));
$return -> addElement ( new htmlHelpLink ( 'key' ));
$return -> addElement ( new htmlHiddenInput ( 'key_number' , $keyCount ));
2005-10-20 10:52:36 +00:00
return $return ;
}
/**
* Processes user input of the primary module page .
* It checks if all input values are correct and updates the associated LDAP attributes .
*
* @ return array list of info / error messages
*/
2006-08-13 12:58:19 +00:00
function process_attributes () {
2005-10-20 10:52:36 +00:00
$this -> attributes [ 'sshPublicKey' ] = array ();
// check old keys
2006-08-13 12:58:19 +00:00
if ( isset ( $_POST [ 'key_number' ])) {
for ( $i = 0 ; $i < $_POST [ 'key_number' ]; $i ++ ) {
if ( isset ( $_POST [ 'delKey' . $i ])) continue ;
if ( isset ( $_POST [ 'sshPublicKey' . $i ]) && ( $_POST [ 'sshPublicKey' . $i ] != " " )) {
$this -> attributes [ 'sshPublicKey' ][] = $_POST [ 'sshPublicKey' . $i ];
2005-10-20 10:52:36 +00:00
}
}
}
// check new key
2006-08-13 12:58:19 +00:00
if ( isset ( $_POST [ 'sshPublicKey' ]) && ( $_POST [ 'sshPublicKey' ] != " " )) {
$this -> attributes [ 'sshPublicKey' ][] = $_POST [ 'sshPublicKey' ];
2005-10-20 10:52:36 +00:00
}
$this -> attributes [ 'sshPublicKey' ] = array_unique ( $this -> attributes [ 'sshPublicKey' ]);
2006-05-16 15:43:00 +00:00
return array ();
2005-10-20 10:52:36 +00:00
}
/**
* In this function the LDAP account is built up .
*
* @ param array $rawAccounts list of hash arrays ( name => value ) from user input
* @ param array $ids list of IDs for column position ( e . g . " posixAccount_uid " => 5 )
2012-07-15 12:05:47 +00:00
* @ param array $partialAccounts list of hash arrays ( name => value ) which are later added to LDAP
2010-02-15 20:21:44 +00:00
* @ param array $selectedModules list of selected account modules
2005-10-20 10:52:36 +00:00
* @ return array list of error messages if any
*/
2010-02-15 20:21:44 +00:00
function build_uploadAccounts ( $rawAccounts , $ids , & $partialAccounts , $selectedModules ) {
2005-10-20 10:52:36 +00:00
$messages = array ();
for ( $i = 0 ; $i < sizeof ( $rawAccounts ); $i ++ ) {
// add object class
if ( ! in_array ( " ldapPublicKey " , $partialAccounts [ $i ][ 'objectClass' ])) $partialAccounts [ $i ][ 'objectClass' ][] = " ldapPublicKey " ;
// add keys
if ( $rawAccounts [ $i ][ $ids [ 'ldapPublicKey_sshPublicKey' ]] != " " ) {
$keys = explode ( ',' , $rawAccounts [ $i ][ $ids [ 'ldapPublicKey_sshPublicKey' ]]);
// check format
for ( $m = 0 ; $m < sizeof ( $keys ); $m ++ ) {
$partialAccounts [ $i ][ 'sshPublicKey' ][] = $keys [ $m ];
}
}
}
return $messages ;
}
/**
* Returns a list of PDF entries
*/
function get_pdfEntries () {
$return = array ();
if ( sizeof ( $this -> attributes [ 'sshPublicKey' ]) > 0 ) {
2012-02-05 19:15:50 +00:00
$return [ 'ldapPublicKey_sshPublicKey' ][ 0 ] = '<block><key>' . _ ( 'SSH public keys' ) . '</key><tr><td align=\"L\">' . $this -> attributes [ 'sshPublicKey' ][ 0 ] . '</td></tr></block>' ;
2005-10-20 10:52:36 +00:00
for ( $i = 1 ; $i < sizeof ( $this -> attributes [ 'sshPublicKey' ]); $i ++ ) {
$return [ 'ldapPublicKey_sshPublicKey' ][] = '<block><tr><td align=\"L\">' . $this -> attributes [ 'sshPublicKey' ][ $i ] . '</td></tr></block>' ;
}
}
return $return ;
}
2013-01-15 21:53:45 +00:00
/**
* Returns the meta HTML code for each input field .
* format : array ( < field1 > => array ( < META HTML > ), ... )
* It is not possible to display help links .
*
* @ param array $fields list of active fields
* @ param array $attributes attributes of LDAP account
* @ param boolean $passwordChangeOnly indicates that the user is only allowed to change his password and no LDAP content is readable
* @ param array $readOnlyFields list of read - only fields
* @ return array list of meta HTML elements ( field name => htmlTableRow )
*/
function getSelfServiceOptions ( $fields , $attributes , $passwordChangeOnly , $readOnlyFields ) {
$return = array ();
if ( $passwordChangeOnly ) {
return $return ; // no fields as long no LDAP content can be read
}
if ( in_array ( 'sshPublicKey' , $fields )) {
$sshPublicKeys = array ();
if ( isset ( $attributes [ 'sshPublicKey' ][ 0 ])) {
$sshPublicKeys = $attributes [ 'sshPublicKey' ];
}
$sshPublicKeyField = new htmlInputTextarea ( 'ldapPublicKey_sshPublicKey' , implode ( " \r \n " , $sshPublicKeys ), 100 , 4 );
if ( in_array ( 'sshPublicKey' , $readOnlyFields )) {
$text = '' ;
for ( $i = 0 ; $i < sizeof ( $sshPublicKeys ); $i ++ ) {
if ( $i > 0 ) {
$text .= '<br>' ;
}
$text .= htmlspecialchars ( $sshPublicKeys [ $i ]);
}
$sshPublicKeyField = new htmlOutputText ( $text , false );
}
$label = new htmlOutputText ( _ ( 'SSH public keys' ));
$label -> alignment = htmlElement :: ALIGN_TOP ;
$return [ 'sshPublicKey' ] = new htmlTableRow ( array (
$label , $sshPublicKeyField
));
}
return $return ;
}
/**
* Checks if all input values are correct and returns the LDAP attributes which should be changed .
* < br > Return values :
* < br > messages : array of parameters to create status messages
* < br > add : array of attributes to add
* < br > del : array of attributes to remove
* < br > mod : array of attributes to modify
* < br > info : array of values with informational value ( e . g . to be used later by pre / postModify actions )
*
* Calling this method does not require the existence of an enclosing { @ link accountContainer } .
*
* @ param string $fields input fields
* @ param array $attributes LDAP attributes
* @ param boolean $passwordChangeOnly indicates that the user is only allowed to change his password and no LDAP content is readable
* @ param array $readOnlyFields list of read - only fields
* @ return array messages and attributes ( array ( 'messages' => array (), 'add' => array ( 'mail' => array ( 'test@test.com' )), 'del' => array (), 'mod' => array (), 'info' => array ()))
*/
public function checkSelfServiceOptions ( $fields , $attributes , $passwordChangeOnly , $readOnlyFields ) {
$return = array ( 'messages' => array (), 'add' => array (), 'del' => array (), 'mod' => array (), 'info' => array ());
if ( $passwordChangeOnly ) {
return $return ; // skip processing if only a password change is done
}
if ( in_array ( 'sshPublicKey' , $fields )) {
$newKeys = explode ( " \r \n " , trim ( $_POST [ 'ldapPublicKey_sshPublicKey' ]));
$count = sizeof ( $newKeys );
for ( $i = 0 ; $i < $count ; $i ++ ) {
if ( trim ( $newKeys [ $i ]) == '' ) {
unset ( $newKeys [ $i ]);
}
}
$newKeys = array_values ( array_unique ( $newKeys ));
$oldKeys = array ();
if ( isset ( $attributes [ 'sshPublicKey' ][ 0 ])) {
$oldKeys = $attributes [ 'sshPublicKey' ];
}
$update = false ;
if ( sizeof ( $newKeys ) != sizeof ( $oldKeys )) {
$update = true ;
}
else {
for ( $i = 0 ; $i < sizeof ( $newKeys ); $i ++ ) {
if ( ! in_array ( $newKeys [ $i ], $oldKeys )) {
$update = true ;
break ;
}
}
}
if ( $update ) {
if ( sizeof ( $oldKeys ) == 0 ) {
$return [ 'add' ][ 'sshPublicKey' ] = $newKeys ;
}
elseif ( sizeof ( $newKeys ) == 0 ) {
$return [ 'del' ][ 'sshPublicKey' ] = $newKeys ;
}
else {
$return [ 'mod' ][ 'sshPublicKey' ] = $newKeys ;
}
}
}
return $return ;
}
2005-10-20 10:52:36 +00:00
}
?>