Add the possibility to save mtn public keys per user
* src/IDF/Key.php: new column "type" which is either "ssh" or "mtn"; utility functions to query the mtn key name and id as well as all available key types for the current IDF installation * src/IDF/Migrations/16KeyType.php: needed migration script * src/IDF/Plugin/SyncGit/Cron.php: ensure only SSH keys are handled * adapt forms and templates accordingly
This commit is contained in:
@@ -22,7 +22,7 @@
|
||||
# ***** END LICENSE BLOCK ***** */
|
||||
|
||||
/**
|
||||
* Storage of the SSH keys.
|
||||
* Storage of the public keys (ssh or monotone).
|
||||
*
|
||||
*/
|
||||
class IDF_Key extends Pluf_Model
|
||||
@@ -39,9 +39,9 @@ class IDF_Key extends Pluf_Model
|
||||
array(
|
||||
'type' => 'Pluf_DB_Field_Sequence',
|
||||
//It is automatically added.
|
||||
'blank' => true,
|
||||
'blank' => true,
|
||||
),
|
||||
'user' =>
|
||||
'user' =>
|
||||
array(
|
||||
'type' => 'Pluf_DB_Field_Foreignkey',
|
||||
'model' => 'Pluf_User',
|
||||
@@ -52,14 +52,21 @@ class IDF_Key extends Pluf_Model
|
||||
array(
|
||||
'type' => 'Pluf_DB_Field_Text',
|
||||
'blank' => false,
|
||||
'verbose' => __('ssh key'),
|
||||
'verbose' => __('public key'),
|
||||
),
|
||||
'type' =>
|
||||
array(
|
||||
'type' => 'Pluf_DB_Field_Varchar',
|
||||
'size' => 3,
|
||||
'blank' => false,
|
||||
'verbose' => __('key type'),
|
||||
),
|
||||
);
|
||||
// WARNING: Not using getSqlTable on the Pluf_User object to
|
||||
// avoid recursion.
|
||||
$t_users = $this->_con->pfx.'users';
|
||||
$t_users = $this->_con->pfx.'users';
|
||||
$this->_a['views'] = array(
|
||||
'join_user' =>
|
||||
'join_user' =>
|
||||
array(
|
||||
'join' => 'LEFT JOIN '.$t_users
|
||||
.' ON '.$t_users.'.id='.$this->_con->qn('user'),
|
||||
@@ -75,6 +82,46 @@ class IDF_Key extends Pluf_Model
|
||||
return Pluf_Template::markSafe(Pluf_esc(substr($this->content, 0, 25)).' [...] '.Pluf_esc(substr($this->content, -55)));
|
||||
}
|
||||
|
||||
private function parseMonotoneKeyData()
|
||||
{
|
||||
if ($this->type != "mtn")
|
||||
throw new IDF_Exception("key is not a monotone key type");
|
||||
|
||||
preg_match("#^\[pubkey ([^\]]+)\]\s*(\S+)\s*\[end\]$#", $this->content, $m);
|
||||
if (count($m) != 3)
|
||||
throw new IDF_Exception("invalid key data detected");
|
||||
|
||||
return array($m[1], $m[2]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the key name of the key, i.e. most of the time the email
|
||||
* address, which not neccessarily has to be unique across a project.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getMonotoneKeyName()
|
||||
{
|
||||
list($keyName, ) = $this->parseMonotoneKeyData();
|
||||
return $keyName;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function should be used to calculate the key id from the
|
||||
* public key hash for authentication purposes. This avoids clashes
|
||||
* in case the key name is not unique across the project
|
||||
*
|
||||
* And yes, this is actually how monotone itself calculates the key
|
||||
* id...
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getMonotoneKeyId()
|
||||
{
|
||||
list($keyName, $keyData) = $this->parseMonotoneKeyData();
|
||||
return sha1($keyName.":".$keyData);
|
||||
}
|
||||
|
||||
function postSave($create=false)
|
||||
{
|
||||
/**
|
||||
@@ -89,7 +136,7 @@ class IDF_Key extends Pluf_Model
|
||||
* [description]
|
||||
*
|
||||
* This signal allows an application to perform special
|
||||
* operations after the saving of a SSH Key.
|
||||
* operations after the saving of a public Key.
|
||||
*
|
||||
* [parameters]
|
||||
*
|
||||
@@ -128,4 +175,19 @@ class IDF_Key extends Pluf_Model
|
||||
'IDF_Key', $params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an associative array with available key types for this
|
||||
* idf installation, ready for consumption for a <select> widget
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public static function getAvailableKeyTypes()
|
||||
{
|
||||
$key_types = array(__("SSH") => 'ssh');
|
||||
if (array_key_exists('mtn', Pluf::f('allowed_scm', array())))
|
||||
{
|
||||
$key_types[__("monotone")] = 'mtn';
|
||||
}
|
||||
return $key_types;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user