array('through'=>'service__ssl'), ); protected $_display_filters = array( 'sign_cert'=>array( array('SSL::subject',array(':value')), ), ); public function rules() { return array( 'sign_cert'=>array( array(array($this,'isCert')), array(array($this,'isCA')), ), 'parent_ssl_ca_id'=>array( array(array($this,'Rule_ParentExists')), ), ); } public function filters() { return array( 'parent_ssl_ca_id'=>array( array(array($this,'Filter_GetParent')), ) ); } private $_so = NULL; /** * Resolve any queries to certificate details */ public function __call($name,$args) { $m = 'get_'.$name; if (method_exists($this->_so,$m)) return $this->_so->{$m}($args); else throw new Kohana_Exception('Unknown method :method',array(':method'=>$name)); } // We want to inject the SSL object into this Model protected function _load_values(array $values) { parent::_load_values($values); if ($this->sign_cert) $this->_so = SSL::instance($this->sign_cert); return $this; } // If we change the SSL certificate, we need to reload our SSL object public function values(array $values, array $expected = NULL) { parent::values($values,$expected); if (array_key_exists('sign_cert',$values)) $this->_so = SSL::instance($this->sign_cert); return $this; } // @todo This could require some optimisation, by storing the keyid in the database and then getting the DB just to return that parent public function Filter_GetParent() { foreach (ORM::factory($this->_object_name)->find_all() as $sco) if ($sco->aki_keyid() == $this->aki_keyid()) return $sco->id; } public function Rule_ParentExists() { // Our parent_ssl_ca_id should have been populated by Filter_GetParent(). return $this->parent_ssl_ca_id OR $this->isRoot(); } public function list_issued() { return $this->service->find_all(); } } ?>