Make kadmin communication more robust

pull/1/head
Timothy Pearson 12 years ago
parent 3ba9d6e852
commit ddd6159e47

@ -834,10 +834,12 @@ int LDAPManager::updateUserInfo(LDAPUserInfo user) {
TQString readFullLineFromPtyProcess(PtyProcess* proc) { TQString readFullLineFromPtyProcess(PtyProcess* proc) {
TQString result = ""; TQString result = "";
while ((!result.contains("\n")) && (!result.contains(":")) && (!result.contains(">"))) { while ((!result.contains("\r")) && (!result.contains(":")) && (!result.contains(">"))) {
result = result + TQString(proc->readLine(false)); result = result + TQString(proc->readLine(false));
tqApp->processEvents(); tqApp->processEvents();
} }
result.replace("\n", "");
result.replace("\r", "");
return result; return result;
} }
@ -873,22 +875,29 @@ int LDAPManager::setPasswordForUser(LDAPUserInfo user, TQString *errstr) {
TQString prompt; TQString prompt;
PtyProcess kadminProc; PtyProcess kadminProc;
kadminProc.exec(command, args); kadminProc.exec(command, args);
prompt = kadminProc.readLine(true); prompt = readFullLineFromPtyProcess(&kadminProc);
prompt = prompt.stripWhiteSpace(); prompt = prompt.stripWhiteSpace();
if (prompt == "kadmin>") { if (prompt == "kadmin>") {
kadminProc.writeLine(TQCString("passwd "+user.name), true); command = TQCString("passwd "+user.name);
prompt = kadminProc.readLine(true); // Discard our own input kadminProc.writeLine(command, true);
prompt = readFullLineFromPtyProcess(&kadminProc); do { // Discard our own input
prompt = readFullLineFromPtyProcess(&kadminProc);
printf("(kadmin) '%s'\n\r", prompt.ascii());
} while (prompt == TQString(command));
prompt = prompt.stripWhiteSpace(); prompt = prompt.stripWhiteSpace();
if ((prompt.endsWith(" Password:")) && (prompt.startsWith(TQString(user.name + "@")))) { if ((prompt.endsWith(" Password:")) && (prompt.startsWith(TQString(user.name + "@")))) {
kadminProc.writeLine(user.new_password, true); kadminProc.writeLine(user.new_password, true);
prompt = kadminProc.readLine(true); // Discard our own input do { // Discard our own input
prompt = kadminProc.readLine(true); prompt = readFullLineFromPtyProcess(&kadminProc);
prompt = prompt.stripWhiteSpace(); printf("(kadmin) '%s'\n\r", prompt.ascii());
} while (prompt == "");
prompt = prompt.stripWhiteSpace();
if ((prompt.endsWith(" Password:")) && (prompt.startsWith("Verify"))) { if ((prompt.endsWith(" Password:")) && (prompt.startsWith("Verify"))) {
kadminProc.writeLine(user.new_password, true); kadminProc.writeLine(user.new_password, true);
prompt = kadminProc.readLine(true); // Discard our own input do { // Discard our own input
prompt = kadminProc.readLine(true); prompt = readFullLineFromPtyProcess(&kadminProc);
printf("(kadmin) '%s'\n\r", prompt.ascii());
} while (prompt == "");
prompt = prompt.stripWhiteSpace(); prompt = prompt.stripWhiteSpace();
} }
if (prompt.endsWith(" Password:")) { if (prompt.endsWith(" Password:")) {
@ -901,8 +910,10 @@ int LDAPManager::setPasswordForUser(LDAPUserInfo user, TQString *errstr) {
} }
if (admincreds.password != "") { if (admincreds.password != "") {
kadminProc.writeLine(admincreds.password, true); kadminProc.writeLine(admincreds.password, true);
prompt = kadminProc.readLine(true); // Discard our own input do { // Discard our own input
prompt = kadminProc.readLine(true); prompt = readFullLineFromPtyProcess(&kadminProc);
printf("(kadmin) '%s'\n\r", prompt.ascii());
} while (prompt == "");
prompt = prompt.stripWhiteSpace(); prompt = prompt.stripWhiteSpace();
} }
} }
@ -1205,12 +1216,14 @@ int LDAPManager::obtainKerberosTicket(LDAPCredentials creds, TQString principal,
TQString prompt; TQString prompt;
PtyProcess kadminProc; PtyProcess kadminProc;
kadminProc.exec(command, args); kadminProc.exec(command, args);
prompt = kadminProc.readLine(true); prompt = readFullLineFromPtyProcess(&kadminProc);
prompt = prompt.stripWhiteSpace(); prompt = prompt.stripWhiteSpace();
if (prompt.endsWith(" Password:")) { if (prompt.endsWith(" Password:")) {
kadminProc.writeLine(creds.password, true); kadminProc.writeLine(creds.password, true);
prompt = kadminProc.readLine(true); // Discard our own input do { // Discard our own input
prompt = kadminProc.readLine(true); prompt = readFullLineFromPtyProcess(&kadminProc);
printf("(kadmin) '%s'\n\r", prompt.ascii());
} while (prompt == "");
prompt = prompt.stripWhiteSpace(); prompt = prompt.stripWhiteSpace();
} }
if (prompt != "") { if (prompt != "") {
@ -1504,12 +1517,15 @@ int LDAPManager::addServiceInfo(LDAPServiceInfo service, TQString *errstr) {
TQString prompt; TQString prompt;
PtyProcess kadminProc; PtyProcess kadminProc;
kadminProc.exec(command, args); kadminProc.exec(command, args);
prompt = kadminProc.readLine(true); prompt = readFullLineFromPtyProcess(&kadminProc);
prompt = prompt.stripWhiteSpace(); prompt = prompt.stripWhiteSpace();
if (prompt == "kadmin>") { if (prompt == "kadmin>") {
kadminProc.writeLine(TQCString("ank --random-key "+hoststring), true); command = TQCString("ank --random-key "+hoststring);
prompt = kadminProc.readLine(true); // Discard our own input kadminProc.writeLine(command, true);
prompt = readFullLineFromPtyProcess(&kadminProc); do { // Discard our own input
prompt = readFullLineFromPtyProcess(&kadminProc);
printf("(kadmin) '%s'\n\r", prompt.ascii());
} while (prompt == TQString(command));
prompt = prompt.stripWhiteSpace(); prompt = prompt.stripWhiteSpace();
// Use all defaults // Use all defaults
while (prompt != "kadmin>") { while (prompt != "kadmin>") {
@ -1523,8 +1539,10 @@ int LDAPManager::addServiceInfo(LDAPServiceInfo service, TQString *errstr) {
} }
if (admincreds.password != "") { if (admincreds.password != "") {
kadminProc.writeLine(admincreds.password, true); kadminProc.writeLine(admincreds.password, true);
prompt = kadminProc.readLine(true); // Discard our own input do { // Discard our own input
prompt = kadminProc.readLine(true); prompt = readFullLineFromPtyProcess(&kadminProc);
printf("(kadmin) '%s'\n\r", prompt.ascii());
} while (prompt == "");
prompt = prompt.stripWhiteSpace(); prompt = prompt.stripWhiteSpace();
} }
} }
@ -1542,9 +1560,12 @@ int LDAPManager::addServiceInfo(LDAPServiceInfo service, TQString *errstr) {
leftbracket++; leftbracket++;
defaultParam = prompt.mid(leftbracket, rightbracket-leftbracket); defaultParam = prompt.mid(leftbracket, rightbracket-leftbracket);
} }
kadminProc.writeLine(TQCString(defaultParam), true); command = TQCString(defaultParam);
prompt = kadminProc.readLine(true); // Discard our own input kadminProc.writeLine(command, true);
prompt = kadminProc.readLine(true); do { // Discard our own input
prompt = readFullLineFromPtyProcess(&kadminProc);
printf("(kadmin) '%s'\n\r", prompt.ascii());
} while (prompt == TQString(command));
prompt = prompt.stripWhiteSpace(); prompt = prompt.stripWhiteSpace();
} }
} }

Loading…
Cancel
Save