1+ <?php
2+ error_reporting (E_ALL );
3+ $ TAB = 'USER ' ;
4+
5+ // Main include
6+ include ($ _SERVER ['DOCUMENT_ROOT ' ]."/inc/main.php " );
7+
8+ //check for valid format ssh key. Doesn't check it is working!
9+ //https://gist.github.com/jupeter/3248095
10+ function validateKey ($ value )
11+ {
12+ $ key_parts = explode (' ' , $ value , 3 );
13+ if (count ($ key_parts ) < 2 ) {
14+ return false ;
15+ }
16+ if (count ($ key_parts ) > 3 ) {
17+ return false ;
18+ }
19+
20+ $ algorithm = $ key_parts [0 ];
21+ $ key = $ key_parts [1 ];
22+
23+ if (!in_array ($ algorithm , array ('ssh-rsa ' , 'ssh-dss ' ))) {
24+ return false ;
25+ }
26+
27+ $ key_base64_decoded = base64_decode ($ key , true );
28+ if ($ key_base64_decoded == FALSE ) {
29+ return false ;
30+ }
31+
32+ $ check = base64_decode (substr ($ key ,0 ,16 ));
33+ $ check = preg_replace ("/[^\w\-]/ " ,"" , $ check );
34+
35+ if ((string ) $ check !== (string ) $ algorithm ) {
36+ return false ;
37+ }
38+ return true ;
39+ }
40+
41+ // Check POST request
42+ if (!empty ($ _POST ['ok ' ])) {
43+ // Check token
44+ if ((!isset ($ _POST ['token ' ])) || ($ _SESSION ['token ' ] != $ _POST ['token ' ])) {
45+ header ('location: /login/ ' );
46+ exit ();
47+ }
48+
49+ if (empty ($ _POST ['v_key ' ])){
50+ $ _SESSION ['error_msg ' ] = __ ('Field SSH_KEY can not be blank. ' );
51+ }
52+
53+ if (!$ _SESSION ['error_msg ' ]){
54+ switch ($ _POST ['v_key ' ]){
55+ default :
56+ //key if key already exisits
57+ exec (HESTIA_CMD . "v-list-user-ssh-key " .$ user ." json " , $ output , $ return_var );
58+ $ data = json_decode (implode ('' , $ output ), true );
59+ $ keylist = array ();
60+ foreach ($ data as $ key => $ value ){
61+ $ idlist [] = trim ($ data [$ key ]['ID ' ]);
62+ $ keylist [] = trim ($ data [$ key ]['KEY ' ]);
63+ }
64+
65+ if (!validateKey ($ _POST ['v_key ' ])){
66+ $ _SESSION ['error_msg ' ] = __ ('SSH KEY is invalid ' );
67+ break ;
68+ }
69+
70+ $ v_key_parts = explode (' ' ,$ _POST ['v_key ' ]);
71+ $ key_id = trim ($ v_key_parts [2 ]);
72+ if ($ v_key_parts [2 ] == '' ){
73+ $ _SESSION ['error_msg ' ] = __ ('SSH KEY is invalid ' );
74+ break ;
75+ }
76+
77+ //for deleting / revoking key the last part user@domain is used therefore needs to be unique
78+ //maybe consider adding random generated message or even an human read able string set by user?
79+ if (in_array ($ v_key_parts [2 ], $ idlist )){
80+ $ _SESSION ['error_msg ' ] = __ ('SSH KEY already exists ' );
81+ break ;
82+ }
83+ if (in_array ($ v_key_parts [1 ], $ keylist )){
84+ $ _SESSION ['error_msg ' ] = __ ('SSH KEY already exists ' );
85+ break ;
86+ }
87+ $ v_key = escapeshellarg (trim ($ _POST ['v_key ' ]));
88+ }
89+ }
90+
91+ if (empty ($ _SESSION ['error_msg ' ])) {
92+ exec (HESTIA_CMD ."v-add-user-ssh-key " .$ user ." " .$ v_key , $ output , $ return_var );
93+ check_return_code ($ return_var ,$ output );
94+ }
95+
96+ unset($ output );
97+
98+ // Flush field values on success
99+ if (empty ($ _SESSION ['error_msg ' ])) {
100+ $ _SESSION ['ok_msg ' ] = __ ('SSH KEY created ' );
101+ }
102+
103+ }
104+
105+ render_page ($ user , $ TAB , 'add_key ' );
106+
107+ // Flush session messages
108+ unset($ _SESSION ['error_msg ' ]);
109+ unset($ _SESSION ['ok_msg ' ]);
0 commit comments