| 'initial' => $this->user->language,␊ | 
| 'widget' => 'Pluf_Form_Widget_SelectInput',␊ | 
| 'widget_attrs' => array(␊ | 
| 'choices' => ␊ | 
| 'choices' =>␊ | 
| Pluf_L10n::getInstalledLanguages()␊ | 
| ),␊ | 
| ));␊ | 
|  | 
| ),␊ | 
| ));␊ | 
| ␊ | 
| $this->fields['ssh_key'] = new Pluf_Form_Field_Varchar(␊ | 
| $this->fields['public_key'] = new Pluf_Form_Field_Varchar(␊ | 
| array('required' => false,␊ | 
| 'label' => __('Add a public SSH key'),␊ | 
| 'label' => __('Add a public key'),␊ | 
| 'initial' => '',␊ | 
| 'widget_attrs' => array('rows' => 3,␊ | 
| 'cols' => 40),␊ | 
| 'widget' => 'Pluf_Form_Widget_TextareaInput',␊ | 
| 'help_text' => __('Be careful to provide your public key and not your private key!')␊ | 
| ));␊ | 
| ␊ | 
| $this->fields['public_key_type'] = new Pluf_Form_Field_Varchar(␊ | 
| array('required' => true,␊ | 
| 'label' => __('Key type'),␊ | 
| 'initial' => 'ssh',␊ | 
| 'widget_attrs' => array('choices' => IDF_Key::getAvailableKeyTypes()),␊ | 
| 'widget' => 'Pluf_Form_Widget_SelectInput',␊ | 
| ));␊ | 
| ␊ | 
| }␊ | 
| ␊ | 
|  | 
| }␊ | 
| $this->user->setFromFormData($this->cleaned_data);␊ | 
| // Add key as needed.␊ | 
| if ('' !== $this->cleaned_data['ssh_key']) {␊ | 
| if ('' !== $this->cleaned_data['public_key']) {␊ | 
| $key = new IDF_Key();␊ | 
| $key->user = $this->user;␊ | 
| $key->content = $this->cleaned_data['ssh_key'];␊ | 
| $key->content = $this->cleaned_data['public_key'];␊ | 
| $key->type = $this->cleaned_data['public_key_type'];␊ | 
| if ($commit) {␊ | 
| $key->create();␊ | 
| }␊ | 
|  | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Check an ssh key.␊ | 
| * Check arbitrary public keys.␊ | 
| *␊ | 
| * It will throw a Pluf_Form_Invalid exception if it cannot␊ | 
| * validate the key.␊ | 
| *␊ | 
| * @param $key string The key␊ | 
| * @param $key string The type ('ssh' or 'mtn')␊ | 
| * @param $user int The user id of the user of the key (0)␊ | 
| * @return string The clean key␊ | 
| */␊ | 
| public static function checkSshKey($key, $user=0)␊ | 
| public static function checkPublicKey($key, $type, $user=0)␊ | 
| {␊ | 
| $key = trim($key);␊ | 
| if (strlen($key) == 0) {␊ | 
| if (strlen($key) == 0)␊ | 
| {␊ | 
| return '';␊ | 
| }␊ | 
| $key = str_replace(array("\n", "\r"), '', $key);␊ | 
| if (!preg_match('#^ssh\-[a-z]{3}\s(\S+)\s\S+$#', $key, $matches)) {␊ | 
| throw new Pluf_Form_Invalid(__('The format of the key is not valid. It must start with ssh-dss or ssh-rsa, a long string on a single line and at the end a comment.'));␊ | 
| ␊ | 
| if ($type == 'ssh')␊ | 
| {␊ | 
| $key = str_replace(array("\n", "\r"), '', $key);␊ | 
| if (!preg_match('#^ssh\-[a-z]{3}\s\S+\s\S+$#', $key))␊ | 
| {␊ | 
| throw new Pluf_Form_Invalid(␊ | 
| __('The format of the key is not valid. It must start '.␊ | 
| 'with ssh-dss or ssh-rsa, a long string on a single '.␊ | 
| 'line and at the end a comment.')␊ | 
| );␊ | 
| }␊ | 
| if (Pluf::f('idf_strong_key_check', false))␊ | 
| {␊ | 
| $tmpfile = Pluf::f('tmp_folder', '/tmp').'/'.$user.'-key';␊ | 
| file_put_contents($tmpfile, $key, LOCK_EX);␊ | 
| $cmd = Pluf::f('idf_exec_cmd_prefix', '').␊ | 
| 'ssh-keygen -l -f '.escapeshellarg($tmpfile).' > /dev/null 2>&1';␊ | 
| exec($cmd, $out, $return);␊ | 
| unlink($tmpfile);␊ | 
| if ($return != 0)␊ | 
| {␊ | 
| throw new Pluf_Form_Invalid(␊ | 
| __('Please check the key as it does not appears '.␊ | 
| 'to be a valid key.')␊ | 
| );␊ | 
| }␊ | 
| }␊ | 
| }␊ | 
| if (Pluf::f('idf_strong_key_check', false)) {␊ | 
| $tmpfile = Pluf::f('tmp_folder', '/tmp').'/'.$user.'-key';␊ | 
| file_put_contents($tmpfile, $key, LOCK_EX);␊ | 
| $cmd = Pluf::f('idf_exec_cmd_prefix', '').␊ | 
| 'ssh-keygen -l -f '.escapeshellarg($tmpfile).' > /dev/null 2>&1';␊ | 
| exec($cmd, $out, $return);␊ | 
| unlink($tmpfile);␊ | 
| if ($return != 0) {␊ | 
| throw new Pluf_Form_Invalid(__('Please check the key as it does not appears to be a valid key.'));␊ | 
| else if ($type == 'mtn')␊ | 
| {␊ | 
| if (!preg_match('#^\[pubkey [^\]]+\]\s*\S+\s*\[end\]$#', $key))␊ | 
| {␊ | 
| throw new Pluf_Form_Invalid(␊ | 
| __('The format of the key is not valid. It must start '.␊ | 
| 'with [pubkey KEYNAME], contain a long string on a single '.␊ | 
| 'line and end with [end] in the final third line.')␊ | 
| );␊ | 
| }␊ | 
| if (Pluf::f('idf_strong_key_check', false))␊ | 
| {␊ | 
| // if monotone can read it, it should be valid␊ | 
| $mtn_opts = implode(' ', Pluf::f('mtn_opts', array()));␊ | 
| $cmd = Pluf::f('idf_exec_cmd_prefix', '').␊ | 
| sprintf('%s %s -d :memory: read >/tmp/php-out 2>&1',␊ | 
| Pluf::f('mtn_path', 'mtn'), $mtn_opts);␊ | 
| $fp = popen($cmd, 'w');␊ | 
| fwrite($fp, $key);␊ | 
| $return = pclose($fp);␊ | 
| ␊ | 
| if ($return != 0)␊ | 
| {␊ | 
| throw new Pluf_Form_Invalid(␊ | 
| __('Please check the key as it does not appears '.␊ | 
| 'to be a valid key.')␊ | 
| );␊ | 
| }␊ | 
| }␊ | 
| }␊ | 
| else␊ | 
| {␊ | 
| throw new Pluf_Form_Invalid(__('Unknown key type'));␊ | 
| }␊ | 
| ␊ | 
| // If $user, then check if not the same key stored␊ | 
| if ($user) {␊ | 
| if ($user)␊ | 
| {␊ | 
| $ruser = Pluf::factory('Pluf_User', $user);␊ | 
| if ($ruser->id > 0) {␊ | 
| $sql = new Pluf_SQL('content=%s', array($key));␊ | 
| if ($ruser->id > 0)␊ | 
| {␊ | 
| $sql = new Pluf_SQL('content=%s AND type=%s', array($key, $type));␊ | 
| $keys = Pluf::factory('IDF_Key')->getList(array('filter' => $sql->gen()));␊ | 
| if (count($keys) > 0) {␊ | 
| throw new Pluf_Form_Invalid(__('You already have uploaded this SSH key.'));␊ | 
| if (count($keys) > 0)␊ | 
| {␊ | 
| throw new Pluf_Form_Invalid(␊ | 
| __('You already have uploaded this key.')␊ | 
| );␊ | 
| }␊ | 
| }␊ | 
| }␊ | 
| return $key;␊ | 
| }␊ | 
| ␊ | 
| function clean_ssh_key()␊ | 
| {␊ | 
| return self::checkSshKey($this->cleaned_data['ssh_key'], ␊ | 
| $this->user->id);␊ | 
| }␊ | 
| ␊ | 
| function clean_last_name()␊ | 
| {␊ | 
| $last_name = trim($this->cleaned_data['last_name']);␊ | 
| if ($last_name == mb_strtoupper($last_name)) {␊ | 
| return mb_convert_case(mb_strtolower($last_name), ␊ | 
| return mb_convert_case(mb_strtolower($last_name),␊ | 
| MB_CASE_TITLE, 'UTF-8');␊ | 
| }␊ | 
| return $last_name;␊ | 
|  | 
| {␊ | 
| $first_name = trim($this->cleaned_data['first_name']);␊ | 
| if ($first_name == mb_strtoupper($first_name)) {␊ | 
| return mb_convert_case(mb_strtolower($first_name), ␊ | 
| return mb_convert_case(mb_strtolower($first_name),␊ | 
| MB_CASE_TITLE, 'UTF-8');␊ | 
| }␊ | 
| return $first_name;␊ | 
|  | 
| {␊ | 
| $this->cleaned_data['email'] = mb_strtolower(trim($this->cleaned_data['email']));␊ | 
| $guser = new Pluf_User();␊ | 
| $sql = new Pluf_SQL('email=%s AND id!=%s', ␊ | 
| $sql = new Pluf_SQL('email=%s AND id!=%s',␊ | 
| array($this->cleaned_data['email'], $this->user->id));␊ | 
| if ($guser->getCount(array('filter' => $sql->gen())) > 0) {␊ | 
| throw new Pluf_Form_Invalid(sprintf(__('The email "%s" is already used.'), $this->cleaned_data['email']));␊ | 
|  | 
| }␊ | 
| ␊ | 
| /**␊ | 
| * Check to see if the 2 passwords are the same.␊ | 
| * Check to see if the 2 passwords are the same and if any␊ | 
| * given public key is valid␊ | 
| */␊ | 
| public function clean()␊ | 
| {␊ | 
| if (!isset($this->errors['password']) ␊ | 
| if (!isset($this->errors['password'])␊ | 
| && !isset($this->errors['password2'])) {␊ | 
| $password1 = $this->cleaned_data['password'];␊ | 
| $password2 = $this->cleaned_data['password2'];␊ | 
|  | 
| throw new Pluf_Form_Invalid(__('The passwords do not match. Please give them again.'));␊ | 
| }␊ | 
| }␊ | 
| ␊ | 
| $this->cleaned_data['public_key'] =␊ | 
| self::checkPublicKey($this->cleaned_data['public_key'],␊ | 
| $this->cleaned_data['public_key_type'],␊ | 
| $this->user->id);␊ | 
| ␊ | 
| return $this->cleaned_data;␊ | 
| }␊ | 
| }␊ |