mcabber/mcabber/main.c
changeset 2173 cf08c3b630af
parent 2172 06669fc1810c
child 2183 e62319868844
equal deleted inserted replaced
2172:06669fc1810c 2173:cf08c3b630af
   164     if (*p == '\n' || *p == '\r') *p = 0;
   164     if (*p == '\n' || *p == '\r') *p = 0;
   165 
   165 
   166   return password;
   166   return password;
   167 }
   167 }
   168 
   168 
       
   169 //  password_eval(command, *status)
       
   170 // Get password from a system command.
       
   171 // The string must be freed after use.
       
   172 static char *password_eval(const char *command, int *status)
       
   173 {
       
   174 #define MAX_PWD 100
       
   175   char *pwd;
       
   176   FILE *outfp = popen(command, "r");
       
   177   if (outfp == NULL) {
       
   178     scr_log_print(LPRINT_NORMAL, "** ERROR: Failed to execute password_eval command.");
       
   179     *status = -1;
       
   180     return NULL;
       
   181   }
       
   182 
       
   183   pwd = g_new0(char, MAX_PWD);
       
   184   if (fgets(pwd, MAX_PWD, outfp) == NULL) {
       
   185     scr_log_print(LPRINT_NORMAL, "** ERROR: Failed to read from password_eval command.");
       
   186     g_free(pwd);
       
   187     *status = -1;
       
   188     return NULL;
       
   189   }
       
   190 
       
   191   int res = pclose(outfp);
       
   192   if (res != 0) {
       
   193     scr_log_print(LPRINT_NORMAL, "** ERROR: Password evaluation command exited with error %d.", res);
       
   194     g_free(pwd);
       
   195     *status = res;
       
   196     return NULL;
       
   197   }
       
   198 
       
   199   // Strip trailing whitespaces and newlines
       
   200   size_t i = strlen(pwd);
       
   201   while (i && isspace(pwd[i-1])) {
       
   202     i--;
       
   203   }
       
   204   pwd[i] = '\0';
       
   205   return pwd;
       
   206 }
       
   207 
   169 static void credits(void)
   208 static void credits(void)
   170 {
   209 {
   171   const char *v_fmt = "MCabber %s -- Email: mcabber [at] lilotux [dot] net\n";
   210   const char *v_fmt = "MCabber %s -- Email: mcabber [at] lilotux [dot] net\n";
   172   char *v = mcabber_version();
   211   char *v = mcabber_version();
   173   printf(v_fmt, v);
   212   printf(v_fmt, v);
   401   }
   440   }
   402 
   441 
   403   /* If no password is stored, we ask for it before entering
   442   /* If no password is stored, we ask for it before entering
   404      ncurses mode -- unless the username is unknown. */
   443      ncurses mode -- unless the username is unknown. */
   405   if (settings_opt_get("jid") && !settings_opt_get("password")) {
   444   if (settings_opt_get("jid") && !settings_opt_get("password")) {
   406     if (settings_opt_get("password_eval")) {
   445     const char *pass_eval = settings_opt_get("password_eval");
   407       FILE *outfp = popen(settings_opt_get("password_eval"), "r");
   446     if (pass_eval) {
   408       if (outfp == NULL) {
   447       int status = 0;
   409         scr_log_print(LPRINT_NORMAL, "** ERROR: Failed to execute password_eval command.");
   448       char *pwd = password_eval(pass_eval, &status);
   410         exit(EXIT_FAILURE);
   449       if (status == 0 && pwd) {
       
   450         settings_set(SETTINGS_TYPE_OPTION, "password", pwd);
   411       }
   451       }
   412 #define MAX_PWD 100
   452       g_free(pwd);
   413       char pwd[MAX_PWD+1];
   453     }
   414       char *read_pwd = fgets(pwd, MAX_PWD, outfp);
   454     // If the password is still unset, ask the user...
   415       if (read_pwd == NULL) {
   455     if (!settings_opt_get("password")) {
   416         scr_log_print(LPRINT_NORMAL, "** ERROR: Failed to read from password_eval command.");
       
   417         exit(EXIT_FAILURE);
       
   418       }
       
   419       int res = pclose(outfp);
       
   420       if (res != 0) {
       
   421         scr_log_print(LPRINT_NORMAL, "** ERROR: Password evaluation command exited with error %d.", res);
       
   422         exit(EXIT_FAILURE);
       
   423       }
       
   424 
       
   425       // strip trailing whitespaces and newlines
       
   426       size_t i = 0;
       
   427       while (i < MAX_PWD && !isspace(pwd[i])) {
       
   428         i++;
       
   429       }
       
   430       pwd[i] = '\0';
       
   431 
       
   432       settings_set(SETTINGS_TYPE_OPTION, "password", pwd);
       
   433     } else {
       
   434       char *pwd = ask_password("your Jabber password");
   456       char *pwd = ask_password("your Jabber password");
   435       settings_set(SETTINGS_TYPE_OPTION, "password", pwd);
   457       settings_set(SETTINGS_TYPE_OPTION, "password", pwd);
   436       g_free(pwd);
   458       g_free(pwd);
   437     }
   459     }
   438   }
   460   }