7ff6ca2779fad25e4be5cba9f222e98126b06a24
[mtweb] / mw / env / modules / mw_env_cli.php
1 <?php
2
3   class mw_env_cli extends mw_env{
4
5     var $argv;
6     var $etat;
7     var $login;
8     var $password;
9     var $params;
10     var $INITED;
11
12     function run_cli($argv){
13       if(PHP_SAPI != "cli"){
14         $this->INITED = false;
15         return "php cli uniquement";
16       }
17       if(!isset($argv) || !$argv){
18         $this->INITED = false;
19         return "variable argv non disponible";
20       }
21       $this->argv = $argv;
22       $this->etat = "";
23       $this->login = "";
24       $this->password = "";
25       $this->params = array();
26       $this->INITED = true;
27       if(
28             (($res = $this->parse_cli_arguments()) !== true)
29         ||  (($res = $this->init_cli_user()) !== true)
30       ){
31         return $res;
32       }
33       $this->run($this->etat, array("get" => $this->params));
34       return true;
35     }
36
37     function inited(){
38       return isset($this->INITED) && $this->INITED;
39     }
40
41     function parse_cli_arguments(){
42       if(!$this->inited()) return "cli not inited";
43       $FIRST = false;
44       $SECOND = false;
45       foreach($this->argv as $cmd_arg){
46         if(!$FIRST){
47           $FIRST = true;
48           continue;
49         }
50         elseif(!$SECOND){
51           $SECOND = true;
52           if(($k = strpos($cmd_arg, "=")) === false){
53             $this->etat = $cmd_arg;
54             if(($k = strpos($this->etat, "@")) !== false){
55               $this->login = explode(":", substr($this->etat, 0, $k));
56               if(isset($this->login[1])) $this->password = $this->login[1];
57               $this->login = $this->login[0];
58               $this->etat = substr($this->etat, $k + 1);
59             }
60             continue;
61           }
62         }
63         if(strlen($cmd_arg)){
64           $param_name = "";
65           $param_value = "";
66           if(($k = strpos($cmd_arg, "=")) === false){
67             foreach($this->get_PARAMS() as $_key => $_value) if(strcmp($cmd_arg, $_value) == 0){
68               $param_name = $_key;
69               break;
70             }
71           }
72           elseif($k != 0){
73             $_cmd_arg = substr($cmd_arg, 0, $k);
74             foreach($this->get_PARAMS() as $_key => $_value) if(strcmp($_cmd_arg, $_value) == 0){
75               $param_name = $_key;
76               $param_value = substr($cmd_arg, $k + 1);
77               break;
78             }
79           }
80           if($param_name){
81             $this->params[$param_name] = $param_value;
82           }
83         }
84       }
85       $this->etat = $this->valid_etat($this->etat);
86       if($this->etat === false) return "etat invalide";
87       return true;
88     }
89
90     function init_cli_user(){
91       if(!$this->inited()) return "cli not inited";
92       $data = $this->data();
93       if($this->login){
94         if(!$this->password){
95           $this->password = $this->cmd_prompt("password: ", true);
96           echo "\n";
97         }
98         if(!($user = $data->user($this->login)) || (md5($this->password) != $user["password"])){
99           return "indentification incorrecte";
100         }
101         $data->set_session_user($user);
102       }
103       if(!$this->action_allowed($this->etat, false)){
104         $this->login = $this->cmd_prompt("login: ");
105         $this->password = $this->cmd_prompt("password: ", true);
106         echo "\n";
107         if(!($user = $data->user($this->login)) || (md5($this->password) != $user["password"])){
108           return "indentification incorrecte";
109         }
110         $data->set_session_user($user);
111         if(!$this->action_allowed($this->etat, false)){
112           return "permission refusee pour cette action";
113         }
114       }
115       return true;
116     }
117
118     function cmd_prompt($prompt, $SILENT = false){
119       if(preg_match('/^win/i', PHP_OS)){
120         $vbscript = sys_get_temp_dir().'prompt_password.vbs';
121         file_put_contents(
122           $vbscript,
123           'wscript.echo(InputBox("'
124           .addslashes($prompt)
125           .'", "", "'.$prompt.'"))'
126         );
127         $command = "cscript //nologo " . escapeshellarg($vbscript);
128         $password = rtrim(shell_exec($command));
129         unlink($vbscript);
130         return $password;
131       }
132       else{
133         $command = "/usr/bin/env bash -c 'echo OK'";
134         if(rtrim(shell_exec($command)) !== 'OK') return false;
135         $command =
136          "/usr/bin/env bash -c 'read".($SILENT ? " -s" : "")." -p \""
137         .addslashes($prompt)
138         ."\" mypassword && echo \$mypassword'";
139         return rtrim(shell_exec($command));
140       }
141     }
142
143   }
144
145 ?>