#ifndef FDPASS_H #define FDPASS_H #define PROTOCOL_VERSION "V1" #include #include #include #include class TCPSERVER_V1; #define REQ_BUF_SIZE 65536 class REQUEST{ private: const unsigned signlen = SHA256_DIGEST_LENGTH*2; bool valid; char buf[REQ_BUF_SIZE+1]; unsigned offset; unsigned offset_read; bool addsign_was_called; void append (const char *s, const char marker); void append_name (const char *name); void append_val (const char *val); void append_vals (const char *val); int checkname (const char *name, char *&retpt); public: void reset(); REQUEST(); void addsign(); void add (const char *name, int val); void add (const char *name, unsigned val); void add (const char *name, bool val); void add (const char *name, const char *val); void add (const char *name, const PARAM_STRING &val); void add (const char *name, const std::vector> &vals); void add (const char *name, const std::vector &vals); void add (const char *name, const std::vector &vals); void add (const char *name, const PARAM_VECTOR_STRING vals); void add (const char *name, const std::vector &vals); void add (const char *name, const std::vector &vals); void add (const char *name, const std::vector &vals); void add_timestamp(); bool is_valid() const; void complete(); void sign(const char *secret); void dump(); int send (int handle); int send (class _F_TCPSERVER_V1 *c); int addpart (const char *line); int addpart (const char *line, time_t &intruder, const std::string &secret); int addpartfile (const char *line); unsigned getlength() const ; const char *getbuf() const ; int checksign (const char *secret); int getarg (const char *name, const char *&val); int getarg (const char *name, int &val); int getarg (const char *name, unsigned &val); int getarg (const char *name, bool &val); int getarg (const char *name, unsigned long long &val); int getarg (const char *name, std::vector &vals); int getarg (const char *name, std::vector &vals); int getarg (const char *name, std::vector &vals); int getarg (const char *name, std::vector &vals); int getarg (const char *name, std::vector &vals); int getarg (const char *name, std::vector > &vals); int write (FILE *fout); bool is_all_read() const; }; struct CONNECT_INFO{ std::string host; std::string port; std::string bind; std::string secret; int fd; std::vector values; ~CONNECT_INFO(); CONNECT_INFO(); CONNECT_INFO(int _fd); void reconnect(); void reset(REQUEST &req); int send (REQUEST &req); int receive(REQUEST &req); int send (const char *command, std::vector &lines); }; struct REQUEST_INFO{ REQUEST req; std::string secret; time_t intruder; REQUEST_INFO(){ intruder = (time_t)0; } int getarg (const char *name, const char *&val){ return req.getarg(name,val); } int getarg (const char *name, int &val){ return req.getarg(name,val); } int getarg (const char *name, unsigned &val){ return req.getarg(name,val); } int getarg (const char *name, bool &val){ return req.getarg(name,val); } int getarg (const char *name, std::vector &vals){ return req.getarg(name,vals); } int getarg (const char *name, std::vector &vals){ return req.getarg(name,vals); } int addpart (const char *line, int len); void reset(){ req.reset(); } bool is_all_read() const{ return req.is_all_read(); } }; int fdpass_receivefd(int sock); int fdpass_sendfd(int sock, int fd); int fdpass_splitbind (const char *s, SSTRING &name, SSTRING &port, SSTRING &logical_name); int fdpass_splitbind (const char *s, SSTRING &name, SSTRING &port); int fdpass_splitbind (const char *s, std::string &name, std::string &port, std::string &logical_name); int fdpass_splitbind (const char *s, std::string &name, std::string &port); int fdpass_sendfd2proxy (int fd1, int fd2, int fd_control, const char *description); int fdpass_tcpconnect (const char *host, const char *port); int fdpass_tcpconnect (const char *bind, bool transparent_mode, const char *host, const char *port); int fdpass_waitdata (int fd); int fdpass_okdata (int fd); void fdpass_closeall (int except_fd1, int except_fd2, int except_fd3); void fdpass_loop(int fd1, int fd2, int do_not_close); void fdpass_asctime (time_t t, char dst[20]); void fdpass_checkservice (const char *unixsocket); #include #include #include int fdpass_setcontrol (TCPSERVER_V1 &o, const char *control, const char *user); int fdpass_checksign (const char *line, const char *signature); int fdpass_valid_secret ( const std::string &secret, const char *line, std::vector &words, int &n); int fdpass_valid_secret ( const std::map &secrets, const char *host, const char *line, std::vector &words, int &n); void fdpass_shasum (const char *buf1, int lenbuf1, const char *buf2, int lenbuf2, char out[SHA256_DIGEST_LENGTH*2+1]); void fdpass_shasum (const char *line, char out[SHA256_DIGEST_LENGTH*2+1]); void fdpass_makesalt (char out[32+1]); void fdpass_send (struct _F_TCPSERVER_V1 *c, const std::string &secret, const char *line); void fdpass_send (_F_TCPSERVER_V1 *c, const std::string &host, const std::map &secrets, const char *line); void fdpass_sendf (_F_TCPSERVER_V1 *c, const std::string &secret, const char *ctl, ...); void fdpass_sendf (_F_TCPSERVER_V1 *c, const std::string &host, const std::map &secrets, const char *ctl, ...); int fdpass_sendto (int fd, const std::string &secret, const char *line); int fdpass_sendto (int fd, const std::string &host, const std::map &secrets, const char *line); int fdpass_sendtof (int fd, const std::string &secret, const char *ctl, ...); int fdpass_sendtof (int fd, const std::string &host, const std::map &secrets, const char *ctl, ...); int fdpass_sendmaster (int fd, bool is_far); int fdpass_sendmaster (const std::string &host, const std::map &secrets, int fd, bool is_far); bool fdpass_protocheck (const char *line, std::string &newline); bool fdpass_isbadchar (const char car); void fdpass_format_intruder (time_t intrudetime, char intruder[100]); void fdpass_readsecret (const char *secretfile, std::string &mysecret); void fdpass_readsecrets(const char *secretfile, std::map &secrets); std::string fdpass_findsecret (const std::map &secrets, const std::string &host); int fdpass_validstr(const char *s, std::string &v); int fdpass_validbool(const char *s, bool &v); int fdpass_validint(const char *s, int &v); int fdpass_validuns(const char *s, unsigned &v); long long fdpass_getnow(); void fdpass_set_force_addr(PARAM_STRING addr); const char * fdpass_get_force_addr(); int fdpass_sendmail ( PARAM_STRING mailserv, PARAM_STRING mailport, PARAM_STRING from, PARAM_STRING addr, PARAM_STRING subject, PARAM_STRING body); #endif