comparison mcabber/src/main.c @ 306:b2d11b11675f

Fix interactive password prompt
author Mikael Berthe <mikael@lilotux.net>
date Tue, 12 Jul 2005 17:10:41 +0100
parents 12f919be3da5
children 566818afee1c
comparison
equal deleted inserted replaced
305:93d965185b4d 306:b2d11b11675f
41 } else { 41 } else {
42 ut_WriteLog("Caught signal: %d\n", signum); 42 ut_WriteLog("Caught signal: %d\n", signum);
43 } 43 }
44 } 44 }
45 45
46 ssize_t my_getpass (char **passstr, size_t *n) 46 void ask_password(void)
47 { 47 {
48 char *password, *p;
49 size_t passsize = 128;
48 struct termios orig, new; 50 struct termios orig, new;
49 int nread; 51 int nread;
50 52
51 /* Turn echoing off and fail if we can't. */ 53 /* Turn echoing off and fail if we can't. */
52 if (tcgetattr(fileno(stdin), &orig) != 0) 54 if (tcgetattr(fileno(stdin), &orig) != 0) return;
53 return -1;
54 new = orig; 55 new = orig;
55 new.c_lflag &= ~ECHO; 56 new.c_lflag &= ~ECHO;
56 if (tcsetattr(fileno(stdin), TCSAFLUSH, &new) != 0) 57 if (tcsetattr(fileno(stdin), TCSAFLUSH, &new) != 0) return;
57 return -1;
58 58
59 /* Read the password. */ 59 /* Read the password. */
60 nread = getline(passstr, n, stdin); 60 password = NULL;
61 printf("Please enter password: ");
62 nread = getline(&password, &passsize, stdin);
61 63
62 /* Restore terminal. */ 64 /* Restore terminal. */
63 (void) tcsetattr(fileno(stdin), TCSAFLUSH, &orig); 65 tcsetattr(fileno(stdin), TCSAFLUSH, &orig);
64 66 printf("\n");
65 return (ssize_t)nread; 67
68 if (nread == -1 || !password) return;
69
70 for (p = (char*)password; *p; p++)
71 ;
72 for ( ; p > (char*)password ; p--)
73 if (*p == '\n' || *p == '\r') *p = 0;
74
75 settings_set(SETTINGS_TYPE_OPTION, "password", password);
76 free(password);
77 return;
66 } 78 }
67 79
68 void mcabber_connect(void) 80 void mcabber_connect(void)
69 { 81 {
70 const char *username, *password, *resource, *servername; 82 const char *username, *password, *resource, *servername;
165 if (configFile) g_free(configFile); 177 if (configFile) g_free(configFile);
166 178
167 optstring = settings_opt_get("debug"); 179 optstring = settings_opt_get("debug");
168 if (optstring) ut_InitDebug(1, optstring); 180 if (optstring) ut_InitDebug(1, optstring);
169 181
170 // If no password is stored, we ask for it before entering 182 /* If no password is stored, we ask for it before entering
171 // ncurses mode 183 ncurses mode */
172 if (!settings_opt_get("password")) { 184 if (!settings_opt_get("password"))
173 char *password, *p; 185 ask_password();
174 size_t passsize = 64;
175 printf("Please enter password: ");
176 my_getpass((char**)&password, &passsize);
177 printf("\n");
178 for (p = (char*)password; *p; p++)
179 ;
180 for ( ; p > (char*)password ; p--)
181 if (*p == '\n' || *p == '\r') *p = 0;
182
183 settings_set(SETTINGS_TYPE_OPTION, "password", password);
184 }
185 186
186 /* Initialize N-Curses */ 187 /* Initialize N-Curses */
187 ut_WriteLog("Initializing N-Curses...\n"); 188 ut_WriteLog("Initializing N-Curses...\n");
188 scr_InitCurses(); 189 scr_InitCurses();
189 190
206 ut_WriteLog("Ping interval stablished: %d secs\n", ping); 207 ut_WriteLog("Ping interval stablished: %d secs\n", ping);
207 208
208 if (settings_opt_get_int("hide_offline_buddies") > 0) 209 if (settings_opt_get_int("hide_offline_buddies") > 0)
209 buddylist_set_hide_offline_buddies(TRUE); 210 buddylist_set_hide_offline_buddies(TRUE);
210 211
211 // Connection 212 /* Connection */
212 mcabber_connect(); 213 if (settings_opt_get("password"))
214 mcabber_connect();
215 else
216 scr_LogPrint("Can't connect: no password supplied");
213 217
214 /* Initialize commands system */ 218 /* Initialize commands system */
215 cmd_init(); 219 cmd_init();
216 220
217 ut_WriteLog("Entering into main loop...\n\n"); 221 ut_WriteLog("Entering into main loop...\n\n");