require_once 'Crypt/RSA.php';
-class Magicsig extends Memcached_DataObject
+class Magicsig extends Managed_DataObject
{
const PUBLICKEYREL = 'magic-public-key';
* @param mixed $v
* @return Magicsig
*/
- public /*static*/ function staticGet($k, $v=null)
+ static function getKV($k, $v=null)
{
- $obj = parent::staticGet(__CLASS__, $k, $v);
- if (!empty($obj)) {
+ $obj = parent::getKV($k, $v);
+ if ($obj instanceof Magicsig) {
+ // Please note we're replacing the $obj
+ // FIXME: There should be an import-key that modifies the fetched $obj
$obj = Magicsig::fromString($obj->keypair);
- // Double check keys: Crypt_RSA did not
- // consistently generate good keypairs.
- // We've also moved to 1024 bit keys.
- if (strlen($obj->publicKey->modulus->toBits()) != 1024) {
+ // Never allow less than 1024 bit keys.
+ // The only case these show up in would be imported or
+ // legacy very-old-StatusNet generated keypairs.
+ if (strlen($obj->publicKey->modulus->toBits()) < 1024) {
$obj->delete();
return false;
}
return $obj;
}
-
- function table()
+ public static function schemaDef()
{
return array(
- 'user_id' => DB_DATAOBJECT_INT,
- 'keypair' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
- 'alg' => DB_DATAOBJECT_STR
+ 'fields' => array(
+ 'user_id' => array('type' => 'int', 'not null' => true, 'description' => 'user id'),
+ 'keypair' => array('type' => 'text', 'description' => 'keypair text representation'),
+ 'alg' => array('type' => 'varchar', 'length' => 64, 'description' => 'algorithm'),
+ ),
+ 'primary key' => array('user_id'),
+ 'foreign keys' => array(
+ 'magicsig_user_id_fkey' => array('user', array('user_id' => 'id')),
+ ),
);
}
- static function schemaDef()
- {
- return array(new ColumnDef('user_id', 'integer',
- null, false, 'PRI'),
- new ColumnDef('keypair', 'text',
- false, false),
- new ColumnDef('alg', 'varchar',
- 64, false));
- }
-
- function keys()
- {
- return array_keys($this->keyTypes());
- }
-
- function keyTypes()
- {
- return array('user_id' => 'K');
- }
-
- function sequenceKey() {
- return array(false, false, false);
- }
-
/**
* Save this keypair into the database.
*
*
* @param int $user_id id of local user we're creating a key for
*/
- public function generate($user_id)
+ public function generate($user_id, $bits=1024)
{
$rsa = new Crypt_RSA();
- $keypair = $rsa->createKey();
+ $keypair = $rsa->createKey($bits);
$rsa->loadKey($keypair['privatekey']);
// parse components
if (!preg_match('/RSA\.([^\.]+)\.([^\.]+)(.([^\.]+))?/', $text, $matches)) {
+ common_debug('Magicsig error: RSA key not found in provided string.');
return false;
}