Forráskód Böngészése

rework login into regular command, add sanity checks for commands before login, allow disconnect before login, add generic error printing via internal command

Missingmew 5 éve
szülő
commit
77fde80805
4 módosított fájl, 54 hozzáadás és 55 törlés
  1. 1 0
      cli/include/userioman.h
  2. 40 18
      cli/src/cmdman.cpp
  3. 8 37
      cli/src/ioman.cpp
  4. 5 0
      cli/src/userioman.cpp

+ 1 - 0
cli/include/userioman.h

@@ -33,6 +33,7 @@ private:
    * Method prototypes for printing json output
    */
   /* printing commands go here */
+  void printError(Json::Value root);
   void printConnect(Json::Value root);
   void printHelp(Json::Value root);
   void printStatus(Json::Value root);

+ 40 - 18
cli/src/cmdman.cpp

@@ -83,8 +83,18 @@ CmdMan::CmdRet CmdMan::cmdDisconnect(vector<string> args) {
   CmdRet retval;
   DEBUGPRINT(string(__PRETTY_FUNCTION__) + " begin");
   Json::Value root;
-  root["command"] = "close";
   retval.type = send;
+  if(dologin) {
+	  // not logged in, send appropriate login message instead of normal close
+	  root["login"] = false;
+	  root["user"] = "";
+	  root["pass"] = "";
+	  root["cancel"] = true;
+	  retval.type |= close;
+  }
+  else {
+	root["command"] = "close";
+  }
   retval.msg = root;
 
   return retval;
@@ -204,13 +214,29 @@ CmdMan::CmdRet CmdMan::execute(string cmd, vector<string> args) {
              "\" with arguments [ ");
   for (string s : args)
     DEBUGPRINT(s + " ");
-  DEBUGPRINT("]\n");
+  DEBUGPRINT("]");
   map<string, CmdRet (CmdMan::*)(vector<string>)>::iterator it =
       execmap.find(cmd);
-  string retmsg;
+  CmdRet retval;
+  Json::Value root;
+  root["command"] = cmd;
   if (it == execmap.end()) {
-    return {error, string(__PRETTY_FUNCTION__) + " unknown command \"" + cmd +
-                       "\".\ntype help to list available commands."};
+	  retval.type = error;
+	  root["command"] = "error";
+	  root["error"] = string(__PRETTY_FUNCTION__) + " unknown command \"" + cmd + "\".\ntype help to list available commands.";
+	  retval.msg = root;
+	  return retval;
+  }
+  else if(dologin) {
+	  DEBUGPRINT("execute does login");
+	  DEBUGPRINT(string("comparison is ") + std::to_string(cmd.compare("login") && cmd.compare("signup") && cmd.compare("disconnect") && cmd.compare("help")));
+	  if(cmd.compare("login") && cmd.compare("signup") && cmd.compare("disconnect") && cmd.compare("help")) {
+		  retval.type = error;
+		  root["command"] = "error";
+		  root["error"] = string("Not logged in. Available commands are limited to ") + "login" + ", " + "signup" + " and " + "disconnect" + "\n" + "Use help for usage of these commands.";
+		  retval.msg = root;
+		  return retval;
+	  }
   }
   return (this->*(execmap[cmd]))(args);
 }
@@ -245,17 +271,9 @@ CmdMan::CmdRet CmdMan::cmdLogin(vector<string> args) {
   return retval;
 }
 
-/*
-        handlemap["status"] = &CmdMan::handleDefault;
-        handlemap["disconnect"] = &CmdMan::handleDefault;
-        handlemap["put"] = &CmdMan::handleDefault;
-        handlemap["get"] = &CmdMan::handleDefault;
-        handlemap["list"] = NULL;
-        handlemap["version"] = NULL;
-        handlemap["login"] = NULL;
-*/
-
 CmdMan::CmdRet CmdMan::handle(Json::Value root) {
+	CmdRet retval;
+	Json::Value output;
   DEBUGPRINT(string(__PRETTY_FUNCTION__) + " begin");
   if (doversion)
     root["command"] = "version";
@@ -266,10 +284,13 @@ CmdMan::CmdRet CmdMan::handle(Json::Value root) {
   string retmsg;
   map<string, CmdRet (CmdMan::*)(Json::Value)>::iterator it =
       handlemap.find(root["command"].asString());
+  
   if (it == handlemap.end()) {
-    return {error, string(__PRETTY_FUNCTION__) + " unknown command \"" +
-                       root["command"].asString() +
-                       "\".\nensure code is implemented."};
+	  retval.type = error;
+	  output["command"] = "error";
+	  output["error"] = string(__PRETTY_FUNCTION__) + " unknown command \"" + root["command"].asString(); + "\".\nensure code is implemented.";
+	  retval.msg = output;
+	  return retval;
   }
   return (this->*(handlemap[root["command"].asString()]))(root);
 }
@@ -523,6 +544,7 @@ CmdMan::CmdRet CmdMan::handleVersion(Json::Value root) {
     retval.type = print | seton;
     output["accept"] = true;
     doversion = false;
+    dologin = true;
   }
   retval.msg = output;
 

+ 8 - 37
cli/src/ioman.cpp

@@ -376,6 +376,12 @@ void IoMan::inputMain() {
       if (cmdret.type & CmdMan::rettype::error) {
         printMessage(Json::writeString(wbuilder, cmdret.msg), error);
       }
+      if(cmdret.type & CmdMan::rettype::close) {
+        /* TODO i dunno */
+        mainmutex.lock();
+        runmain = false;
+        mainmutex.unlock();
+      }
     }
 
     // clean up local stuff
@@ -519,49 +525,13 @@ void ioman_readlineHandler(char *line) {
 /* main user input loop */
 void IoMan::run() {
   printMessage("IoMan::run() begin", debug);
-  //~ char *line = NULL, *user = NULL, *pass = NULL;
-  char *user = NULL, *pass = NULL;
-  vector<string> tokens;
-  string work, command;
-  CmdMan::CmdRet cmdret;
-  Json::Value root;
-  std::unique_lock<std::mutex> ulock;
   struct pollfd inPipeStatus;
   inPipeStatus.fd = STDIN_FILENO;
   inPipeStatus.events = POLLIN;
 
   runmain = true;
 
-  while (!user) {
-    user = readline(getUserPrompt().c_str());
-    printMessage("Using user: " + string(user), debug);
-  }
-  while (!pass) {
-    pass = readline(getPassPrompt().c_str());
-    printMessage("Using pass: " + string(pass), debug);
-  }
-
-  printMessage("IoMan::run() login", debug);
-
-  localmutex.lock();
-  printMessage(string(__PRETTY_FUNCTION__) + string(" get localmutex"), debug);
-  localinput.push_back("login " + string(user) + " " + string(pass));
-  localmutex.unlock();
-  printMessage(string(__PRETTY_FUNCTION__) + string(" release localmutex"),
-               debug);
-  free(user);
-  free(pass);
-  localcv.notify_all();
-
-  ulock = std::unique_lock<std::mutex>(initmutex);
-  while (loginstatus == off) {
-    initcv.wait(ulock);
-  }
-  if (loginstatus == err)
-    return;
-  initmutex.unlock();
-  initcv.notify_all();
-
+  // Install readline handler
   rl_callback_handler_install(getCmdPrompt().c_str(),
                               (rl_vcpfunc_t *)&ioman_readlineHandler);
 
@@ -576,6 +546,7 @@ void IoMan::run() {
     }
     if (!connected)
       break;
+    if(loginstatus == err) break;
     mainmutex.lock();
   }
   mainmutex.unlock();

+ 5 - 0
cli/src/userioman.cpp

@@ -18,6 +18,7 @@ UserIoMan::UserIoMan(char *ipcstring) : IoMan(ipcstring) {
   reader = rbuilder.newCharReader();
 
   /* initialize print command map */
+  printmap["error"] = &UserIoMan::printError;
   printmap["connect"] = &UserIoMan::printConnect;
   printmap["help"] = &UserIoMan::printHelp;
   printmap["status"] = &UserIoMan::printStatus;
@@ -86,6 +87,10 @@ void UserIoMan::printJson(Json::Value root) {
   (this->*(printmap[root["command"].asString()]))(root);
 }
 
+void UserIoMan::printError(Json::Value root) {
+    std::cout << "Error: " << root["error"].asString() << std::endl;
+}
+
 void UserIoMan::printConnect(Json::Value root) {
   if (!root["accept"].asBool()) {
     std::cout << "Couldnt connect to " << root["address"].asString() << ":"