initial commit
[mnenc] / mnencd.cpp
diff --git a/mnencd.cpp b/mnencd.cpp
new file mode 100644 (file)
index 0000000..52cdace
--- /dev/null
@@ -0,0 +1,142 @@
+//      mdaemon.cpp
+//      
+//      Copyright 2010 Micke Nordin <micke@hal>
+//      
+//      This program is free software; you can redistribute it and/or modify
+//      it under the terms of the GNU General Public License as published by
+//      the Free Software Foundation; either version 2 of the License, or
+//      (at your option) any later version.
+//      
+//      This program is distributed in the hope that it will be useful,
+//      but WITHOUT ANY WARRANTY; without even the implied warranty of
+//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//      GNU General Public License for more details.
+//      
+//      You should have received a copy of the GNU General Public License
+//      along with this program; if not, write to the Free Software
+//      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+//      MA 02110-1301, USA.
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <fcntl.h>
+#include <cstdio>
+#include <cstdlib>
+#include <string>
+#include <cerrno>
+#include <fstream>
+#include <iostream>
+#include "mnenc.hpp"
+#include "password.hpp"
+
+std::string remove_char(std::string str, char c) {
+       std::string::size_type k = 0;
+       while((k=str.find(c,k))!=str.npos) {
+               str.erase(k, 1);
+       }
+       return str;
+}
+
+std::string remove_chars(std::string str) {
+       std::string chars = " \t\n\b\a-?+\\{[]}'*'";
+       for(int i = 0; i < (signed) chars.size(); i++) {
+               str = remove_char(str, chars[i]);
+       }
+       
+       return str;     
+}
+
+std::string make_filename(std::string user, std::string app) {
+       return remove_chars(app + user);
+}
+std::string get_password(std::string masterpasswd, std::string user, std::string app) {
+       mnenc menc = mnenc();
+       menc.genkey(masterpasswd);
+       std::string key = menc.get_key();
+       password pw = password("", "", key);
+       pw.from_file(make_filename(user, app));
+       return menc.decrypt(key, pw.get_enc());
+}
+
+void put_password(std::string masterpasswd, std::string passwd, std::string user, std::string app) {
+       mnenc menc = mnenc();
+       menc.genkey(masterpasswd);
+       std::string key = menc.get_key();
+       password pw = password(menc.encrypt(key, passwd ), "", key);
+       pw.to_file(make_filename(user, app));
+}
+
+std::string do_something(std::string str) {
+       //Nothing here yet
+       return "Blahonga";
+}
+
+std::string m_read() {
+       std::string str;
+       std::ifstream is("fife");
+       getline(is, str);
+       is.close();
+       return str;
+}
+
+void m_send(std::string message) {
+       std::ofstream os("fife");
+       os << message;
+       os.close();
+}
+
+
+int main(int argc, char** argv) {
+       /* Our process ID and Session ID */
+       pid_t pid, sid;
+       
+       /* Fork off the parent process */
+       pid = fork();
+       if (pid < 0) {
+               exit(EXIT_FAILURE);
+       }
+       /* If we got a good PID, then
+          we can exit the parent process. */
+       if (pid > 0) {
+               exit(EXIT_SUCCESS);
+       }
+
+       /* Change the file mode mask */
+       umask(0);
+               
+       /* Open any logs here */        
+               
+       /* Create a new SID for the child process */
+       sid = setsid();
+       if (sid < 0) {
+               /* Log the failure */
+               exit(EXIT_FAILURE);
+       }
+       
+
+       
+       /* Change the current working directory */
+       if ((chdir("/home/micke/.fifo")) < 0) {
+               /* Log the failure */
+               exit(EXIT_FAILURE);
+       }
+       
+       /* Close out the standard file descriptors */
+       close(STDIN_FILENO);
+       close(STDOUT_FILENO);
+       close(STDERR_FILENO);
+       
+       /* Daemon-specific initialization goes here */
+       
+       mkfifo("./fife", 0777);
+
+       /* The Big Loop */
+       while (1) {
+               m_send(do_something(m_read()));
+               sleep(1); /* wait 1 second*/
+       }
+       unlink("fife");
+       exit(EXIT_SUCCESS);
+}