IDA C++ SDK 9.2
Loading...
Searching...
No Matches
network.hpp
Go to the documentation of this file.
1#ifndef NETWORK_HPP
2#define NETWORK_HPP
3
4#include <pro.h>
5#include <md5.h>
6
7#ifdef __NT__
8# if !defined(AF_MAX)
9# ifndef NOMINMAX
10# define NOMINMAX
11# endif
12# include <ws2tcpip.h>
13# endif
14# define SYSTEM "Windows"
15# define socklen_t int
16# define SHUT_RD SD_RECEIVE
17# define SHUT_WR SD_SEND
18# define SHUT_RDWR SD_BOTH
19#else // not NT, i.e. UNIX
20# include <netinet/in.h>
21# include <netinet/tcp.h>
22# include <arpa/inet.h>
23# include <netdb.h>
24# define closesocket(s) close(s)
25# define SOCKET size_t
26# define INVALID_SOCKET size_t(-1)
27# define SOCKET_ERROR (-1)
28# if defined(__LINUX__)
29# if defined(__ARM__)
30# if defined(__ANDROID__)
31# define SYSTEM "Android"
32# else
33# define SYSTEM "ARM Linux"
34# endif
35# else
36# if defined(__ANDROID__)
37# define SYSTEM "Android x86"
38# define SYSTEM "Android x86"
39# else
40# define SYSTEM "Linux"
41# endif
42# endif
43 // linux debugger cannot be multithreaded because it uses thread_db.
44 // i doubt that this library is meant to be used with multiple
45 // applications simultaneously.
46# define __SINGLE_THREADED_SERVER__
47# elif defined(__MAC__)
48# define SYSTEM "Mac OS X"
49# else
50# error "Unknown platform"
51# endif
52# include <sys/socket.h>
53# include <netinet/in.h>
54#endif
55
56#ifndef __X86__
57# define _SYSBITS " 64-bit"
58#else
59# define _SYSBITS " 32-bit"
60#endif
61
62#ifdef TESTABLE_BUILD
63# ifdef __EA64__
64# define SYSBITS _SYSBITS " (sizeof ea=64)"
65# else
66# define SYSBITS _SYSBITS " (sizeof ea=32)"
67# endif
68#else
69# define SYSBITS _SYSBITS
70#endif
71
72#ifdef __SINGLE_THREADED_SERVER__
73# define __SERVER_TYPE__ "ST"
74#else
75# define __SERVER_TYPE__ "MT"
76#endif
77
78#define TIMEOUT (1000/25) // timeout for polling (ms)
79#define TIMEOUT_INFINITY -1
80#define RECV_HELLO_TIMEOUT 1000 // timeout for the first packet (ms)
81#define RECV_TIMEOUT_PERIOD 10000 // timeout for recv (ms)
82
83// bidirectional codes (client <-> server)
85{
86 RPC_OK = 0, // response: function call succeeded
87 RPC_UNK, // response: unknown function code
88 RPC_MEM, // response: no memory
90};
91
92#define RPC_OPEN 3 // server->client: i'm ready, the very first packet
93
94#define RPC_EVENT 4 // server->client: debug event ready, followed by debug_event
95#define RPC_EVOK 5 // client->server: event processed (in response to RPC_EVENT)
96#define RPC_CANCELLED 6 // client->server: operation was cancelled by the user
97// we need EVOK to handle the situation when the debug
98// event was detected by the server during polling and
99// was sent to the client using RPC_EVENT but client has not received it yet
100// and requested GET_DEBUG_EVENT. In this case we should not
101// call remote_get_debug_event() but instead force the client
102// to use the event sent by RPC_EVENT.
103// In other words, if the server has sent RPC_EVENT but has not
104// received RPC_EVOK, it should fail all GET_DEBUG_EVENTS.
105
106// client->server codes
107#define RPC_INIT 10
108#define RPC_TERM 11
109#define RPC_GET_PROCESSES 12
110#define RPC_START_PROCESS 13
111#define RPC_EXIT_PROCESS 14
112#define RPC_ATTACH_PROCESS 15
113#define RPC_DETACH_PROCESS 16
114#define RPC_GET_DEBUG_EVENT 17
115#define RPC_PREPARE_TO_PAUSE_PROCESS 18
116#define RPC_STOPPED_AT_DEBUG_EVENT 19
117#define RPC_CONTINUE_AFTER_EVENT 20
118#define RPC_TH_SUSPEND 21
119#define RPC_TH_CONTINUE 22
120#define RPC_SET_RESUME_MODE 23
121#define RPC_GET_MEMORY_INFO 24
122#define RPC_READ_MEMORY 25
123#define RPC_WRITE_MEMORY 26
124#define RPC_UPDATE_BPTS 27
125#define RPC_UPDATE_LOWCNDS 28
126#define RPC_EVAL_LOWCND 29
127#define RPC_ISOK_BPT 30
128#define RPC_READ_REGS 31
129#define RPC_WRITE_REG 32
130#define RPC_GET_SREG_BASE 33
131#define RPC_SET_EXCEPTION_INFO 34
132
133#define RPC_OPEN_FILE 35
134#define RPC_CLOSE_FILE 36
135#define RPC_READ_FILE 37
136#define RPC_WRITE_FILE 38
137#define RPC_IOCTL 39 // both client and the server may send this packet
138#define RPC_UPDATE_CALL_STACK 40
139#define RPC_APPCALL 41
140#define RPC_CLEANUP_APPCALL 42
141#define RPC_REXEC 43
142#define RPC_GET_SCATTERED_IMAGE 44
143#define RPC_GET_IMAGE_UUID 45
144#define RPC_GET_SEGM_START 46
145#define RPC_BIN_SEARCH 47
146#define RPC_GET_DYNREGS 48
147
148// server->client codes
149#define RPC_SET_DEBUG_NAMES 50
150#define RPC_SYNC_STUB 51
151#define RPC_ERROR 52
152#define RPC_MSG 53
153#define RPC_WARNING 54
154#define RPC_HANDLE_DEBUG_EVENT 55
155#define RPC_REPORT_IDC_ERROR 56
156#define RPC_IMPORT_DLL 57
157
158#pragma pack(push, 1)
159
160struct PACKED rpc_packet_t
161{ // fields are always sent in the network order
162 uint32 length; // length of the packet (do not count length & code)
163 uchar code; // function code
164};
165CASSERT(sizeof(rpc_packet_t) == 5);
166#pragma pack(pop)
167
175
176#define DEFINE_ONE_NOTIFICATION_FUNCTION(FuncName, NotifCode, RpcEngineInst) \
177 AS_PRINTF(2, 3) void FuncName(const char *format, ...) \
178 { \
179 va_list va; \
180 va_start(va, format); \
181 dvnotif(NotifCode, RpcEngineInst, format, va); \
182 va_end(va); \
183 }
184
185#define DEFINE_ALL_NOTIFICATION_FUNCTIONS(RpcEngineInst) \
186 DEFINE_ONE_NOTIFICATION_FUNCTION(dmsg, 0, RpcEngineInst) \
187 DEFINE_ONE_NOTIFICATION_FUNCTION(dwarning, 1, RpcEngineInst) \
188 DEFINE_ONE_NOTIFICATION_FUNCTION(derror, -1, RpcEngineInst)
189
190class rpc_engine_t;
192
193//-------------------------------------------------------------------------
194AS_PRINTF(2, 0) ssize_t dvnotif_client(
195 int code,
196 const char *format,
197 va_list va);
198
199#ifdef __NT__
200# define IRSERR_TIMEOUT WAIT_TIMEOUT
201#else
202# define IRSERR_TIMEOUT ETIME
203#endif
204#define IRSERR_CANCELLED -0xE5CA7E // escape
205#define IRSERR_SKIP_ITER -0x5217 // skip recv() in rpc_engine_t's recv_data loop
206
207//-------------------------------------------------------------------------
208// idarpc_stream_t
209//-------------------------------------------------------------------------
210// the idarpc_stream_t structure is not defined.
211// it is used as an opaque type provided by the transport level.
212// the transport level defines its own local type for it.
213struct idarpc_stream_t;
214
215idarpc_stream_t *irs_new(bool use_tls=false);
216
217//-------------------------------------------------------------------------
219{
222
224 host_port_t(const qstring &_host, ushort _port) : host(_host), port(_port) {}
225
226 void clear() { host.clear(); port = 0; }
227 bool is_valid() const { return !host.empty() && port != 0; }
228
229 bool operator==(const host_port_t &r) const
230 {
231 return host == r.host && port == r.port;
232 }
233
235 {
236 host.swap(r.host);
237 qswap(port, r.port);
238 }
239
240 qstring connstr(int default_port=0) const
241 {
242 qstring s;
243 if ( port != 0 && port != default_port )
244 {
245 if ( host[0] != '[' && host.find(':') != qstring::npos )
246 s.sprnt("[%s]:%u", host.c_str(), port); // IPv6 address
247 else
248 s.sprnt("%s:%u", host.c_str(), port);
249 }
250 else
251 {
252 s = host;
253 }
254 return s;
255 }
256};
258
259//-------------------------------------------------------------------------
261{
263 // holds passwords provided through command-line parameters,
264 // or environment variable. A password retrieved from the
265 // keychain is not stored here.
267
270 : host_port_t(_host, _port) {}
271
272 //-------------------------------------------------------------------------
273 void clear()
274 {
276 username.clear();
277 password_override.clear();
278 }
279
280 //-------------------------------------------------------------------------
281 // Accepts the following schemes:
282 // `hostname:port`
283 // `user@hostname:port`
284 // `user:pass@hostname:port`
285#define PCF_MERGE 1
286 static bool parse_connstr(
288 const qstring &s,
289 uint32 flags=0)
290 {
291 if ( (flags & PCF_MERGE) == 0 )
292 out->clear();
293 if ( s.empty() )
294 return false;
295 qstrvec_t parts;
296 s.split(&parts, "@");
297 if ( parts.size() > 2 )
298 return false;
299 int addr_idx = 0;
300 if ( parts.size() == 2 )
301 { // the username is present
302 const qstring &p0 = parts[0];
303 if ( p0.empty() )
304 return false;
305 qstrvec_t identity_parts;
306 p0.split(&identity_parts, ":");
307 if ( identity_parts.size() > 2 )
308 return false;
309 out->username.swap(identity_parts[0]);
310 if ( identity_parts.size() == 2 )
311 out->password_override.swap(identity_parts[1]);
312 addr_idx = 1;
313 }
315 qstring &addr = parts[addr_idx];
316 const char *ptr = addr.c_str();
317 const char *colon = nullptr;
318 if ( ptr[0] == '[' ) // IPv6 address?
319 {
320 const char *br = strchr(ptr, ']');
321 if ( br == nullptr || br == ptr+1 )
322 return false;
323 host = qstring(ptr+1, br-ptr-1);
324 addr.remove(0, br-ptr);
325 ptr = addr.c_str();
326 if ( ptr[0] == ':' )
327 colon = ptr;
328 }
329 else
330 {
331 if ( strnieq(ptr, "::ffff:", 7) // IPv6 prefix for IPv4 addresses
332 && strchr(ptr, '.') != nullptr ) // old style IPv4 address seems to follow
333 {
334 ptr += 7; // skip the prefix
335 }
336 colon = strchr(ptr, ':');
337 }
338 if ( colon != nullptr )
339 {
340 char *end;
341 int port = strtoul(++colon, &end, 10);
342 if ( colon == end )
343 return false;
344 while ( *end == ' ' )
345 ++end;
346 if ( *end != '\0' )
347 return false;
348 addr.resize(colon - ptr - 1);
349 out->port = port;
350 }
351 out->host.swap(host.empty() ? addr : host);
352 return true;
353 }
354
355 //-------------------------------------------------------------------------
356 bool parse_connstr(const qstring &s, uint32 flags=0)
357 {
358 return parse_connstr(this, s, flags);
359 }
360
361#define BCF_INCLUDE_USER 1
362#define BCF_INCLUDE_PASS 2
364 qstring *out,
365 uint32 flags=0) const
366 {
367 if ( host.empty() )
368 return;
369
370 qstring buf;
371 if ( (flags & BCF_INCLUDE_USER) != 0 && !username.empty() )
372 buf.append(username);
373 if ( (flags & BCF_INCLUDE_PASS) != 0 && !password_override.empty() )
374 {
375 if ( !buf.empty() )
376 buf.append(':');
378 }
379 if ( !buf.empty() )
380 buf.append('@');
381 buf.append(connstr());
382 out->swap(buf);
383 }
385 {
386 qstring tmp;
387 build_connstr(&tmp, flags);
388 return tmp;
389 }
390};
392
393//-------------------------------------------------------------------------
394typedef bool irs_cancel_connect_cb_t(void *);
395
402typedef progress_loop_ctrl_t irs_progress_cb_t(bool receiving, size_t processed, size_t total, void *);
403void irs_set_progress_cb(idarpc_stream_t *irs, int ms, irs_progress_cb_t cb, void *ud=nullptr);
405{
406 idarpc_stream_t *irs;
407 irs_cancellable_op_t(idarpc_stream_t *_irs, bool receiving, size_t goal=0);
409 void inc_progress(size_t progress);
410};
411
412//-------------------------------------------------------------------------
413template <typename T>
415{
416 T *cb;
417 void *ud;
418 int ms;
419
421 void reset()
422 {
423 cb = nullptr;
424 ud = nullptr;
425 ms = -1;
426 }
427
428 bool set(int _ms, T *_cb, void *_ud)
429 {
430 reset();
431 if ( _cb != nullptr && _ms > -1 )
432 {
433 cb = _cb;
434 ud = _ud;
435 ms = _ms;
436 }
437 return cb != nullptr;
438 }
439
440 T *get(int *out_ms=nullptr, void **out_ud=nullptr) const
441 {
442 if ( out_ms != nullptr )
443 *out_ms = ms;
444 if ( out_ud != nullptr )
445 *out_ud = ud;
446 return cb;
447 }
448};
449
452
453//-------------------------------------------------------------------------
466
467//-------------------------------------------------------------------------
469{
470 size_t cb = sizeof(*this);
474
476 irs_server_opts_t(const qstring &_host, int _port)
477 : bind(_host, _port) {}
478};
480
481bool irs_init_client(idarpc_stream_t *irs, const irs_client_opts_t &options);
482bool irs_init_server(idarpc_stream_t *irs, const irs_server_opts_t &options);
483bool irs_accept(idarpc_stream_t *irs, idarpc_stream_t *listener);
484bool irs_handshake(idarpc_stream_t *irs, int timeout_ms = -1);
485int irs_ready(idarpc_stream_t *irs, int timeout_ms = -1);
486ssize_t irs_recv(idarpc_stream_t *irs, void *buf, size_t n);
487ssize_t irs_send(idarpc_stream_t *irs, const void *buf, size_t n);
488void irs_term(idarpc_stream_t **pirs, int shutdown_flags = -1);
489int irs_get_error(idarpc_stream_t *irs);
490const char *irs_strerror(idarpc_stream_t *irs);
491bool irs_peername(idarpc_stream_t *irs, qstring *out, bool lookupname = true);
492bool irs_sockname(idarpc_stream_t *irs, qstring *out, bool lookupname = true);
493bool irs_sockport(idarpc_stream_t *irs, int *out);
494// convenience functions
495ssize_t irs_send_data(idarpc_stream_t *irs, const void *buf, size_t n);
497 idarpc_stream_t *irs,
498 void *buf,
499 size_t n,
500 int timeout_ms = -1);
501bool irs_recv_str(idarpc_stream_t *irs, qstring *out, int timeout_ms = -1);
502bool irs_send_str(idarpc_stream_t *irs, const qstring &str);
503
504//-------------------------------------------------------------------------
506constexpr uint32 TIMESTAMP_UTC = 0x01;
507constexpr uint32 TIMESTAMP_ISO8601 = 0x02;
508constexpr uint32 TIMESTAMP_WITH_MS = 0x04;
509
510//-------------------------------------------------------------------------
511idaman THREAD_SAFE bool ida_export parse_timestamp(
512 utc_timestamp_t *out,
513 const char *in,
514 uint32 flags = 0);
515
516//-------------------------------------------------------------------------
517constexpr size_t TIMESTAMP_BUFSZ = 25;
518idaman THREAD_SAFE bool ida_export format_timestamp(
519 char *out,
520 size_t out_size,
522 uint32 flags = 0);
523
524//-------------------------------------------------------------------------
525typedef uint64 lofi_timestamp_t; // low-fidelity timestamp. Only encodes up to 1/10th seconds
526//-------------------------------------------------------------------------
528{
529 const uint64 s = get_secs(ts);
530 const uint64 us = get_usecs(ts);
531 return s * 10 + us / (100 * 1000);
532}
533
534//-------------------------------------------------------------------------
536{
537 return make_qtime64(lts / 10, (lts % 10) * (100 * 1000));
538}
539
540//-------------------------------------------------------------------------
541// base_dispatcher_t + network_client_handler_t
542//-------------------------------------------------------------------------
544{
545 FILE *channels[16];
546 idarpc_stream_t *irs;
551
554 int find_free_channel() const;
555
556 network_client_handler_t(idarpc_stream_t *_irs, bool _verbose);
558
559 virtual bool handle() = 0; // true - delete this
560 virtual void shutdown_gracefully(int signum) = 0;
561
562 void term_irs();
563
564 AS_PRINTF(2, 3) int lprintf(const char *format, ...) const
565 {
566 va_list va;
568 int code = vlprintf(format, va);
570 return code;
571 }
572 AS_PRINTF(2, 0) int vlprintf(const char *format, va_list va) const;
573
574private:
575 DECLARE_UNCOPYABLE(network_client_handler_t);
576};
577
578//-------------------------------------------------------------------------
580{
581 typedef std::map<network_client_handler_t *, qthread_t> storage_t;
583
585 virtual void lock() {}
586 virtual void unlock() {}
587 virtual bool is_multi_threaded() const { return false; }
588};
589
590//-------------------------------------------------------------------------
592{
593 qmutex_t mutex;
594
595 mt_client_handlers_list_t() { mutex = qmutex_create(); QASSERT(1540, mutex != nullptr); }
597 virtual void lock() override { qmutex_lock(mutex); }
598 virtual void unlock() override { qmutex_unlock(mutex); }
599 virtual bool is_multi_threaded() const override { return true; }
600};
601
602#define SERVER_CLIOPT_DEFAULTS 0x0
603#define SERVER_CLIOPT_NOTLS 0x1 // note: will always be enabled for TESTABLE_BUILD
604#define SERVER_CLIOPT_RECORDING 0x2 // note: will always be enabled for TESTABLE_BUILD
605
606//-------------------------------------------------------------------------
608{
612 idarpc_stream_t *irs = nullptr;
616 bool use_tls = true;
617 bool verbose = false;
618
619 base_dispatcher_t(bool multi_threaded);
621 void dispatch();
622
623 virtual void collect_cliopts(cliopts_t *out, uint32 features);
624
625 //
627
628 //
629 virtual network_client_handler_t *new_client_handler(idarpc_stream_t *_irs) = 0;
631
632 virtual void shutdown_gracefully(int signum);
633
634private:
635 void handle_session(network_client_handler_t *handler);
636 void add_to_clients_list(network_client_handler_t *handler, qthread_t t);
637 DECLARE_UNCOPYABLE(base_dispatcher_t);
638};
639
640// [-
641//-------------------------------------------------------------------------
642// server_dispatcher_t
643//-------------------------------------------------------------------------
651
652struct product_entry_t;
654struct license_info_t;
655
656namespace licsrv_rpc
657{
658 struct license_t;
659}
660
661//-------------------------------------------------------------------------
663 qstring *out_matched_macaddr,
664 const licsrv_rpc::license_t &lic);
665
666//-------------------------------------------------------------------------
667void default_print_license_info(const licsrv_rpc::license_t &lic);
668
669//-------------------------------------------------------------------------
671{
672 virtual void check_license_type(
673 const licsrv_rpc::license_t & /*lic*/)
674 {
675 }
676
678 qstring *out_matched_macaddr,
679 const licsrv_rpc::license_t &lic)
680 {
681 default_check_license_activation(out_matched_macaddr, lic);
682 }
683
684 virtual void fill_server_info(
685 const product_entry_t & /*p*/,
686 const qstring & /*name*/,
687 const qstring & /*email*/,
688 const qstring & /*macaddr*/)
689 {
690 }
691
692 virtual int on_parse_error(int code) { return code; }
693
694 virtual void print_license_info(const licsrv_rpc::license_t &lic) const
695 {
697 }
698};
699
700//-------------------------------------------------------------------------
701struct licmgr_logger_t;
703{
705
707 qstring badreqdir; // directory holding a dump of requests that caused an INTERR or unexpected exceptions
708 FILE *log_file = nullptr;
709 licmgr_logger_t *licmgr_logger = nullptr;
711 bool may_upgrade_schema = false;
713#ifdef TESTABLE_BUILD
715#endif
716
718 bool _multi_threaded,
719 int default_port,
720 const char *default_license_file_name);
723 const licsrv_rpc::license_t *read_license_file(license_file_visitor_t &lv) const;
725
726 virtual void collect_cliopts(cliopts_t *out, uint32 features) override;
730
731 void log_request(const bytevec_t &request, int interr_code=-1) const;
732};
733
734NORETURN AS_PRINTF(2, 3) void lerror(int code, const char *format, ...);
735// ]-
736
737//-------------------------------------------------------------------------
738// packing/unpacking utils
739//-------------------------------------------------------------------------
742
743//-------------------------------------------------------------------------
744// rpc_engine_t
745//-------------------------------------------------------------------------
746#define VERBOSE_ENABLED
747#ifdef VERBOSE_ENABLED
748#define verb(x) do { if ( verbose ) msg x; } while(0)
749#define verb_eng(engine, x) do { if ( (engine)->verbose ) msg x; } while(0)
750#else
751#define verb(x) //msg x
752#define verb_eng(engine, x)
753#endif
754#define verbev(x) //msg x
755
756//-------------------------------------------------------------------------
758{
760
761 rpc_packet_data_t(uchar _code) : code(_code) {}
763 virtual void serialize(bytevec_t *out, int version) const = 0;
764 virtual bool deserialize(const uchar **ptr, size_t len, int version) = 0;
765};
766
767//-------------------------------------------------------------------------
768typedef int ioctl_handler_t(
769 class rpc_engine_t *rpc,
770 int fn,
771 const void *buf,
772 size_t size,
773 void **poutbuf,
774 ssize_t *poutsize);
775
776//-------------------------------------------------------------------------
777typedef rpc_packet_data_t *rpc_packet_instantiator_t(const uchar *ptr, size_t len, int version);
778
779//-------------------------------------------------------------------------
788
789//-------------------------------------------------------------------------
791{
793 int recv_timeout; // miliseconds
794};
795
796//---------------------------------------------------------------------------
798{
799public:
800 bool network_error = false;
802
803 // pointer to the ioctl request handler, in case you
804 // need to handle ioctl requests from the server.
806
807 // This array specifies non-standard timeouts for some RPC calls
809 size_t n_pkt_timeouts = 0;
810
813 bool logged_in = false;
814
815protected:
816 void register_packet_type_descs(const rpc_packet_type_desc_t *ptypes, size_t cnt);
818 const rpc_packet_type_desc_t *find_packet_type_desc(const char *name) const;
819 int get_timeout_for_request(uchar pkt_code) const;
820
821public:
823 bool _is_client,
824 const rpc_pkt_timeout_t *_pkt_timeouts = nullptr,
825 size_t _n_pkt_timeouts = 0);
826 virtual ~rpc_engine_t() {}
827
828 int handle_ioctl_packet(bytevec_t &pkt, const uchar *ptr, const uchar *end);
829
830 // low-level: deal with bytes, and don't handle "conversations".
833
835
836 virtual idarpc_stream_t *get_irs() const = 0;
837 AS_PRINTF(3, 0) virtual ssize_t send_notif(int code, const char *format, va_list va);
838
839 virtual bool get_broken_connection(void) { return false; }
840 virtual void set_broken_connection(void) {}
841
842 int send_ioctl(int fn, const void *buf, size_t size, void **poutbuf, ssize_t *poutsize);
844 void set_pkt_timeouts(const rpc_pkt_timeout_t *_pkt_timeouts, size_t _n_pkt_timeouts)
845 {
846 pkt_timeouts = _pkt_timeouts;
847 n_pkt_timeouts = _n_pkt_timeouts;
848 }
849
851
852private:
854
855 int recv_data(void *out, size_t len, int timeout_ms);
856
857 AS_PRINTF(3,0) static ssize_t dvnotif(int code, rpc_engine_t *rpc, const char *format, va_list va);
858};
859
860//-------------------------------------------------------------------------
862{
863#ifdef TESTABLE_BUILD
864 struct
865 {
866 FILE *fp = nullptr;
868 mutable uint64 packet_nr = 0;
869 } recording;
870#endif
871 idarpc_stream_t *rpc_irs;
872 bool our_irs; // should we terminate rpc_irs in the destructor?
873 int protocol_version;
874
875protected:
876 void record(
877 const rpc_packet_data_t &data,
878 const uchar *bytes,
879 size_t len,
880 bool as_input) const;
881 void record_input(const rpc_packet_data_t &data, const rpc_packet_t *rp) const;
882 void record_output(const rpc_packet_data_t &data, const bytevec_t &bytes) const;
883 // must be implemented if an instance is meant to be able to record.
884 virtual bool get_conversation_name(qstring * /*out*/) const newapi { INTERR(1581); }
885 // formatter is mandatory
886 virtual void format_packet_data(
887 qstring *out,
888 const struct rpc_packet_data_t &data,
889 const char *line_prefix=nullptr) const newapi;
890 virtual void get_packet_name(
891 qstring *out,
892 const struct rpc_packet_data_t &data) const newapi;
893 bool reinit_irs(qstring *errbuf, bool use_tls, const char *server_host, int port);
894
895public:
897 const rpc_packet_type_desc_t *descs,
898 size_t cnt,
899 idarpc_stream_t *_irs,
900 bool _our_irs,
901 bool _is_client,
902 const rpc_pkt_timeout_t *_pkt_timeouts = nullptr,
903 size_t _n_pkt_timeouts = 0,
904 int _protocol_version = 0)
905 : rpc_engine_t(_is_client, _pkt_timeouts, _n_pkt_timeouts),
906 rpc_irs(_irs), our_irs(_our_irs), protocol_version(_protocol_version)
907 {
908 register_packet_type_descs(descs, cnt);
909 }
911
912 bool start_recording(const qstring &convs_dir);
914 bool is_recording() const;
915
917 const rpc_packet_data_t &request) newapi;
920 virtual idarpc_stream_t *get_irs() const override { return rpc_irs; }
921 bool is_our_irs() const { return our_irs; }
923 int get_protocol_version() const { return protocol_version; }
924 void set_protocol_version(int _protocol_version)
925 {
926#ifdef TESTABLE_BUILD
927 QASSERT(2757, _protocol_version <= protocol_version);
928#endif
929 protocol_version = _protocol_version;
930 }
931};
932
933//-------------------------------------------------------------------------
934// This class can automatically reconnect if the connections drops.
936{
937 typedef recording_rpc_engine_t *rpc_engine_creator_t(idarpc_stream_t *_irs);
938
939protected:
940 rpc_engine_creator_t *create_rpc_engine;
942private:
943 qstring wait_dialog_contents;
944 const char *const server_name;
945 bool started_receiving_response = false;
946 bool was_user_cancelled = false;
947
948 virtual void init(idarpc_stream_t *_irs);
949
950public:
952 const char *_server_name,
953 rpc_engine_creator_t *engine_creator,
954 idarpc_stream_t *_irs)
955 : create_rpc_engine(engine_creator),
956 server_name(_server_name)
957 {
958 generic_client_t::init(_irs);
959 }
961protected:
962 virtual bool try_reconnect(qstring *errbuf) = 0;
963 virtual rpc_packet_data_t *create_failure_packet(const char *errmsg) = 0;
964 virtual bool is_handshake_packet(const rpc_packet_data_t &) { return false; }
965};
966
967//-------------------------------------------------------------------------
968AS_PRINTF(3, 0) ssize_t dvnotif_rpc(
969 int code,
971 const char *format,
972 va_list va);
973
974//---------------------------------------------------------------------------
975AS_PRINTF(1, 0) int vlprintf(const char *format, va_list va);
976AS_PRINTF(1, 2) int lprintf(const char *format, ...);
977ssize_t lwrite(const void *data, size_t size);
978void set_lprintf_output(FILE *out);
979
980//---------------------------------------------------------------------------
982 qstrvec_t *out,
983 const uchar *buf,
984 size_t size,
985 bool for_comments,
986 size_t nhex_per_line=16);
987
988#define REPEAT_THRESHOLD 100 // that many or more equal bytes will
989 // be printed using the REPEAT_BYTES_MARKER
990#define REPEAT_BYTES_MARKER '#'
991
992//-------------------------------------------------------------------------
994{
996#define LCS_NO_TLS 0x1
997#define LCS_SEEN_PROXY_OPTION 0x2
998#define LCS_RESERVED_BITS 8
1000
1002 : endpoint_credentials_t(_host, _port) {}
1004 virtual bool process_switch(const char *) newapi;
1005 virtual void clear() newapi { this->endpoint_credentials_t::clear(); proxy.clear(); state = 0; }
1006
1007 bool load_password(qstring *out, qstring *errbuf) const
1008 {
1009 if ( !password_override.empty() )
1010 {
1011 *out = password_override;
1012 return true;
1013 }
1014 return do_load_password(out, errbuf);
1015 }
1016
1017 bool load_proxy_password(qstring *out, qstring *errbuf) const
1018 {
1019 if ( !proxy.password_override.empty() )
1020 {
1021 *out = proxy.password_override;
1022 return true;
1023 }
1024 return do_load_proxy_password(out, errbuf);
1025 }
1026
1027 bool use_tls() const { return (state & LCS_NO_TLS) == 0; }
1028 void set_use_tls(bool use_tls) { setflag(state, LCS_NO_TLS, !use_tls); }
1029 bool has_seen_proxy_option() const { return (state & LCS_SEEN_PROXY_OPTION) != 0; }
1030
1031protected:
1032 bool load_pass_from_keychain(qstring * /*out*/, qstring * /*errbuf*/, const char * /*app_name*/) const;
1033 virtual bool do_load_password(qstring * /*out*/, qstring * /*errbuf*/) const newapi { return false; }
1034 virtual bool do_load_proxy_password(qstring * /*out*/, qstring * /*errbuf*/) const newapi { return false; }
1035 virtual bool write(qstring * /*errbuf*/) const newapi { return false; }
1036};
1037
1038//-------------------------------------------------------------------------
1039#define VAULT_APP_NAME "hexvault"
1040#define VAULT_PROXY_APP_NAME VAULT_APP_NAME "_proxy"
1041#define DEFAULT_VAULT_HOST "hexvault"
1042#define DEFAULT_VAULT_PORT 65433
1043
1044//-------------------------------------------------------------------------
1046{
1047 // during the call to `validate()`,
1048 // `login_credentials_t::password_override` will hold
1049 // the candidate new password to be used for validation.
1050 virtual bool validate(login_credentials_t &cred) = 0;
1051};
1052
1053//-------------------------------------------------------------------------
1055
1056//-------------------------------------------------------------------------
1058{
1061#define VCS_SEEN_SITE_OPTION (0x1 << LCS_RESERVED_BITS)
1062#define VCS_UPDATE_REG_INFO (0x2 << LCS_RESERVED_BITS)
1063#define VCS_USE_PROXY (0x4 << LCS_RESERVED_BITS)
1064
1065 vault_credentials_t() : login_credentials_t(DEFAULT_VAULT_HOST, DEFAULT_VAULT_PORT) {}
1067 void init();
1068 virtual bool process_switch(const char *arg) override;
1069 virtual void clear() override
1070 {
1072 sitename.clear();
1073 }
1074 virtual bool do_load_password(qstring *out, qstring *errbuf) const override;
1075 virtual bool do_load_proxy_password(qstring *out, qstring *errbuf) const override;
1076 virtual bool write(qstring *errbuf) const override;
1078 {
1079 AUR_CANCELLED = 0, // user rejected the prompt
1080 AUR_VALID, // the validator (if any) succeeded
1081 AUR_INVALID, // the validator (if any) failed
1082 };
1083#define AUF_SILENT_UPDATE_FAILURE 0x1 // don't warn user if persisting the credentials failed
1085 credential_validator_t *validator,
1086 qstring *errbuf,
1087 uint32 auf_flags=0);
1088
1089 bool update(qstring *errbuf) const; // set/del reg info depending on 'VCS_UPDATE_REG_INFO'
1090 bool del(qstring *errbuf) const;
1091 void reg_set_site(const char *site) const;
1092
1095
1096 bool has_seen_site_option() const { return (state & VCS_SEEN_SITE_OPTION) != 0; }
1097
1099 static void reg_set_store_info(bool store_pass);
1100 static bool reg_del_store_info();
1101
1102private:
1103 void get_reg_key(qstring *out) const;
1104};
1105
1106//-------------------------------------------------------------------------
1107#ifdef IDAFREE
1108# define PUBLIC_LUMINA_HOST "public-lumina.hex-rays.com"
1109# define PUBLIC_DEC_HOST "public-lumina.hex-rays.com"
1110# define PUBLIC_TLM_HOST "public-lumina.hex-rays.com"
1111#else
1112# define PUBLIC_LUMINA_HOST "lumina.hex-rays.com"
1113# define PUBLIC_DEC_HOST "lumina.hex-rays.com"
1114# define PUBLIC_TLM_HOST "tlm.hex-rays.com"
1115#endif
1116#define DEFAULT_LUMINA_PORT 443
1117#define PUBLIC_DEC_PORT 443
1118#define PUBLIC_TLM_PORT 443
1119
1120#define LUMINA_APP_NAME "lumina"
1121
1122//-------------------------------------------------------------------------
1124{
1126
1131
1132 void init(bool set_as_primary=true);
1133
1134 virtual bool do_load_password(qstring *out, qstring *errbuf) const override;
1135 virtual bool write(qstring *errbuf) const override;
1136};
1137
1138//-------------------------------------------------------------------------
1140{
1141 dec_credentials_t() : login_credentials_t(PUBLIC_DEC_HOST, PUBLIC_DEC_PORT) {}
1143};
1144
1145//-------------------------------------------------------------------------
1147{
1148 tlm_credentials_t() : login_credentials_t(PUBLIC_TLM_HOST, PUBLIC_TLM_PORT) {}
1150
1151 void init();
1152};
1153
1154//-------------------------------------------------------------------------
1155#define NOSIG -1
1156void call_exit_handlers(int signum);
1159
1161{
1162 virtual void handle(int signum) = 0;
1163
1168};
1169
1170
1171struct kc_ctx_t;
1173
1174void ensure_one_server(const char *name);
1175
1176
1178
1179#define VPAF_NATURE_FILE 0x01
1180#define VPAF_NATURE_DIR 0x02
1181#define VPAF_NATURE_ABSENT 0x03
1182#define VPAF_NATURE_MASK 0x0F
1183#define VPAF_RESTRICTED 0x10 // must not be world-readable (not available on Windows)
1184
1186 const char *path_identity,
1187 const char *path,
1188 uint32 flags);
1189
1190#endif // NETWORK_HPP
void swap(_qstring< qchar > &r)
Swap contents of two qstrings. see qvector::swap()
Definition pro.h:3122
bool empty(void) const
Does the qstring have 0 non-null elements?
Definition pro.h:3168
void resize(size_t s, qchar c)
Resize to the given size.
Definition pro.h:3131
static constexpr size_t npos
Definition pro.h:3692
void split(qvector< _qstring< qchar > > *out, const qchar *sep, uint32 flags=0) const
Split a string on SEP, appending the parts to OUT.
_qstring & remove(size_t idx, size_t cnt)
Remove characters from the qstring.
Definition pro.h:3408
_qstring & append(qchar c)
Append c to the end of the qstring.
Definition pro.h:3493
const qchar * c_str(void) const
Convert the qstring to a char *.
Definition pro.h:3170
void clear(void)
Clear qstring and free memory.
Definition pro.h:3166
Vector of bytes (use for dynamic memory)
Definition pro.h:3773
virtual ~generic_client_t()
virtual rpc_packet_data_t * create_failure_packet(const char *errmsg)=0
generic_client_t(const char *_server_name, rpc_engine_creator_t *engine_creator, idarpc_stream_t *_irs)
Definition network.hpp:951
virtual bool try_reconnect(qstring *errbuf)=0
rpc_engine_creator_t * create_rpc_engine
Definition network.hpp:940
virtual bool is_handshake_packet(const rpc_packet_data_t &)
Definition network.hpp:964
recording_rpc_engine_t * rpc_engine
Definition network.hpp:941
Reimplementation of vector class from STL.
Definition pro.h:2250
size_t size(void) const
Get the number of elements in the qvector.
Definition pro.h:2423
Definition network.hpp:862
virtual rpc_packet_data_t * request_and_response(const rpc_packet_data_t &request) new api
int get_protocol_version() const
Definition network.hpp:923
void record(const rpc_packet_data_t &data, const uchar *bytes, size_t len, bool as_input) const
virtual ~recording_rpc_engine_t()
void record_output(const rpc_packet_data_t &data, const bytevec_t &bytes) const
bool reinit_irs(qstring *errbuf, bool use_tls, const char *server_host, int port)
virtual idarpc_stream_t * get_irs() const override
Definition network.hpp:920
uint64 packet_nr
Definition network.hpp:868
void record_input(const rpc_packet_data_t &data, const rpc_packet_t *rp) const
qstring dumps_dir_path
Definition network.hpp:867
recording_rpc_engine_t(const rpc_packet_type_desc_t *descs, size_t cnt, idarpc_stream_t *_irs, bool _our_irs, bool _is_client, const rpc_pkt_timeout_t *_pkt_timeouts=nullptr, size_t _n_pkt_timeouts=0, int _protocol_version=0)
Definition network.hpp:896
virtual rpc_packet_t * send_request_and_receive_reply(uchar pkt_code, bytevec_t &pkt) override
void set_protocol_version(int _protocol_version)
Definition network.hpp:924
virtual bool get_conversation_name(qstring *) const newapi
Definition network.hpp:884
rpc_packet_data_t * packet_data_from_raw(const rpc_packet_t *rp)
bool is_our_irs() const
Definition network.hpp:921
virtual void get_packet_name(qstring *out, const struct rpc_packet_data_t &data) const newapi
bool start_recording(const qstring &convs_dir)
FILE * fp
Definition network.hpp:866
virtual void format_packet_data(qstring *out, const struct rpc_packet_data_t &data, const char *line_prefix=nullptr) const newapi
bool is_recording() const
Definition network.hpp:798
void register_packet_type_descs(const rpc_packet_type_desc_t *ptypes, size_t cnt)
bool logged_in
Definition network.hpp:813
rpc_packet_t * recv_packet(uchar pkt_code)
int handle_ioctl_packet(bytevec_t &pkt, const uchar *ptr, const uchar *end)
virtual rpc_packet_t * send_request_and_receive_reply(uchar pkt_code, bytevec_t &pkt)=0
virtual bool get_broken_connection(void)
Definition network.hpp:839
void set_pkt_timeouts(const rpc_pkt_timeout_t *_pkt_timeouts, size_t _n_pkt_timeouts)
Definition network.hpp:844
int get_timeout_for_request(uchar pkt_code) const
int recv_timeout
Definition network.hpp:811
qstring last_errstr
Definition network.hpp:801
const char va_list va
Definition network.hpp:837
const rpc_pkt_timeout_t * pkt_timeouts
Definition network.hpp:808
AS_PRINTF(3, 0) virtual ssize_t send_notif(int code
virtual idarpc_stream_t * get_irs() const =0
bool is_client
Definition network.hpp:812
void set_ioctl_handler(ioctl_handler_t *h)
Definition network.hpp:843
DEFINE_ALL_NOTIFICATION_FUNCTIONS(this)
virtual void set_broken_connection(void)
Definition network.hpp:840
size_t n_pkt_timeouts
Definition network.hpp:809
const char * format
Definition network.hpp:837
int send_ioctl(int fn, const void *buf, size_t size, void **poutbuf, ssize_t *poutsize)
ioctl_handler_t * ioctl_handler
Definition network.hpp:805
bool network_error
Definition network.hpp:800
const rpc_packet_type_desc_t * find_packet_type_desc(const char *name) const
virtual ~rpc_engine_t()
Definition network.hpp:826
int send_data(bytevec_t &data)
const rpc_packet_type_desc_t * find_packet_type_desc(int code) const
rpc_engine_t(bool _is_client, const rpc_pkt_timeout_t *_pkt_timeouts=nullptr, size_t _n_pkt_timeouts=0)
idaman THREAD_SAFE va_list va
See qsscanf()
Definition err.h:21
idaman THREAD_SAFE const char * format
Definition fpro.h:78
idaman THREAD_SAFE AS_PRINTF(1, 0) void ida_export vqperror(const char *format
Print error message to stderr (analog of perror)
idaman const char * end
Definition pro.h:1001
int code
Definition fpro.h:88
idaman size_t n
Definition pro.h:997
cexpr_t * e
Definition hexrays.hpp:7308
idaman size_t len
Definition kernwin.hpp:1356
asize_t size
Definition kernwin.hpp:6339
void(idaapi *range_marker)(ea_t ea
Pointer to range marker function (for idaviews and hexviews) This pointer is initialized by setup_ran...
unsigned __int64 uint64
Definition llong.hpp:13
Definition network.hpp:657
void irs_set_progress_cb(idarpc_stream_t *irs, int ms, irs_progress_cb_t cb, void *ud=nullptr)
const char * format
Definition network.hpp:196
CASSERT(sizeof(rpc_packet_t)==5)
DECLARE_TYPE_AS_MOVABLE(host_port_t)
constexpr uint32 TIMESTAMP_ISO8601
Definition network.hpp:507
void ensure_one_server(const char *name)
THREAD_SAFE qtime64_t from_lofi_timestamp(lofi_timestamp_t lts)
Definition network.hpp:535
idaman THREAD_SAFE bool ida_export parse_timestamp(utc_timestamp_t *out, const char *in, uint32 flags=0)
idaman THREAD_SAFE bool ida_export format_timestamp(char *out, size_t out_size, utc_timestamp_t ts, uint32 flags=0)
qvector< rpc_packet_type_desc_t > rpc_packet_type_desc_vec_t
Definition network.hpp:787
bool irs_sockname(idarpc_stream_t *irs, qstring *out, bool lookupname=true)
const char * irs_strerror(idarpc_stream_t *irs)
void set_lprintf_output(FILE *out)
void default_check_license_activation(qstring *out_matched_macaddr, const licsrv_rpc::license_t &lic)
void format_hex_dump(qstrvec_t *out, const uchar *buf, size_t size, bool for_comments, size_t nhex_per_line=16)
qvector< product_entry_t > prodvec_t
Definition network.hpp:653
int ioctl_handler_t(class rpc_engine_t *rpc, int fn, const void *buf, size_t size, void **poutbuf, ssize_t *poutsize)
Definition network.hpp:768
bool irs_cancel_connect_cb_t(void *)
Definition network.hpp:394
int irs_ready(idarpc_stream_t *irs, int timeout_ms=-1)
void default_print_license_info(const licsrv_rpc::license_t &lic)
ssize_t irs_send_data(idarpc_stream_t *irs, const void *buf, size_t n)
progress_loop_ctrl_t irs_progress_cb_t(bool receiving, size_t processed, size_t total, void *)
Definition network.hpp:402
rpc_engine_t * rpc
Definition network.hpp:970
bool irs_sockport(idarpc_stream_t *irs, int *out)
progress_loop_ctrl_t
Definition network.hpp:397
@ plc_proceed
Definition network.hpp:398
@ plc_cancel
Definition network.hpp:400
@ plc_skip_iter
Definition network.hpp:399
uint64 lofi_timestamp_t
Definition network.hpp:525
void finalize_packet(bytevec_t &pkt)
bool irs_peername(idarpc_stream_t *irs, qstring *out, bool lookupname=true)
idarpc_stream_t * irs_new(bool use_tls=false)
irs_cb_info_t< irs_cancel_connect_cb_t > cancel_connect_cb_info_t
Definition network.hpp:451
constexpr size_t TIMESTAMP_BUFSZ
Definition network.hpp:517
ssize_t irs_recv(idarpc_stream_t *irs, void *buf, size_t n)
irs_cb_info_t< irs_progress_cb_t > progress_cb_info_t
Definition network.hpp:450
bool irs_init_server(idarpc_stream_t *irs, const irs_server_opts_t &options)
THREAD_SAFE lofi_timestamp_t to_lofi_timestamp(qtime64_t ts)
Definition network.hpp:527
void validate_path_argument(const char *path_identity, const char *path, uint32 flags)
constexpr uint32 TIMESTAMP_WITH_MS
Definition network.hpp:508
bool irs_init_client(idarpc_stream_t *irs, const irs_client_opts_t &options)
const char va_list va
Definition network.hpp:197
AS_PRINTF(2, 0) ssize_t dvnotif_client(int code
int irs_get_error(idarpc_stream_t *irs)
rpc_packet_data_t * rpc_packet_instantiator_t(const uchar *ptr, size_t len, int version)
Definition network.hpp:777
bool irs_recv_str(idarpc_stream_t *irs, qstring *out, int timeout_ms=-1)
bool license_server_enabled()
qtime64_t utc_timestamp_t
Definition network.hpp:505
bool irs_send_str(idarpc_stream_t *irs, const qstring &str)
void irs_term(idarpc_stream_t **pirs, int shutdown_flags=-1)
ssize_t lwrite(const void *data, size_t size)
ssize_t irs_send(idarpc_stream_t *irs, const void *buf, size_t n)
void call_exit_handlers()
kc_ctx_t * get_keychain_context()
bool irs_accept(idarpc_stream_t *irs, idarpc_stream_t *listener)
base_packet_id_t
Definition network.hpp:85
@ RPC_UNK
Definition network.hpp:87
@ RPC_MEM
Definition network.hpp:88
@ RPC_OK
Definition network.hpp:86
@ base_packet_id_last
Definition network.hpp:89
rpc_notification_type_t
Definition network.hpp:169
@ rnt_warning
Definition network.hpp:172
@ rnt_msg
Definition network.hpp:171
@ rnt_unknown
Definition network.hpp:170
@ rnt_error
Definition network.hpp:173
NORETURN const char bytevec_t prepare_rpc_packet(uchar code)
constexpr uint32 TIMESTAMP_UTC
Definition network.hpp:506
void install_signal_and_exit_handlers()
ssize_t irs_recv_data(idarpc_stream_t *irs, void *buf, size_t n, int timeout_ms=-1)
bool irs_handshake(idarpc_stream_t *irs, int timeout_ms=-1)
This is the first header included in the IDA project.
idaman size_t const char time_t t
Definition pro.h:602
idaman THREAD_SAFE qtime64_t ida_export qtime64(void)
Get the current time with microsecond resolution (in fact the resolution is worse on windows)
unsigned int uint32
unsigned 32 bit value
Definition pro.h:348
uint64 qtime64_t
64-bit time value expressed as seconds and microseconds since the Epoch
Definition pro.h:499
unsigned char uchar
unsigned 8 bit value
Definition pro.h:337
INLINE THREAD_SAFE qtime64_t make_qtime64(uint32 secs, DEFARG(int32 usecs, 0))
Get a qtime64_t instance from a seconds value and microseconds value.
Definition pro.h:522
THREAD_SAFE void qswap(T &a, T &b)
Swap 2 objects of the same type using memory copies.
Definition pro.h:1715
INLINE THREAD_SAFE uint32 get_secs(qtime64_t t)
Get the 'seconds since the epoch' part of a qtime64_t.
Definition pro.h:504
idaman THREAD_SAFE bool ida_export qmutex_unlock(qmutex_t m)
Unlock a mutex.
idaman THREAD_SAFE bool ida_export qmutex_free(qmutex_t m)
Free a mutex.
idaman THREAD_SAFE bool ida_export qmutex_lock(qmutex_t m)
Lock a mutex.
idaman THREAD_SAFE qmutex_t ida_export qmutex_create(void)
Create a new mutex.
ptrdiff_t ssize_t
Signed size_t - used to check for size overflows when the counter becomes negative.
Definition pro.h:381
unsigned short ushort
unsigned 16 bit value
Definition pro.h:338
INLINE THREAD_SAFE uint32 get_usecs(qtime64_t t)
Get the microseconds part of a qtime64_t.
Definition pro.h:512
void idaapi setflag(T &where, U bit, bool cnd)
Set a 'bit' in 'where' if 'value' if not zero.
Definition pro.h:1527
_qstring< char > qstring
regular string
Definition pro.h:3694
qvector< qstring > qstrvec_t
vector of strings
Definition pro.h:3697
utc_timestamp_t start_time
Definition network.hpp:614
qstring privkey
Definition network.hpp:611
void delete_client_handler(network_client_handler_t *inst)
virtual void collect_cliopts(cliopts_t *out, uint32 features)
virtual void shutdown_gracefully(int signum)
virtual ~base_dispatcher_t()
idarpc_stream_t * irs
Definition network.hpp:612
client_handlers_list_t * clients_list
Definition network.hpp:613
qstring certchain
Definition network.hpp:610
bool verbose
Definition network.hpp:617
ushort port_number
Definition network.hpp:615
void install_signal_handlers()
bool use_tls
Definition network.hpp:616
virtual network_client_handler_t * new_client_handler(idarpc_stream_t *_irs)=0
qstring ipv4_address
Definition network.hpp:609
base_dispatcher_t(bool multi_threaded)
Definition network.hpp:580
virtual void lock()
Definition network.hpp:585
std::map< network_client_handler_t *, qthread_t > storage_t
Definition network.hpp:581
storage_t storage
Definition network.hpp:582
virtual void unlock()
Definition network.hpp:586
virtual ~client_handlers_list_t()
Definition network.hpp:584
virtual bool is_multi_threaded() const
Definition network.hpp:587
Definition network.hpp:1046
virtual bool validate(login_credentials_t &cred)=0
dec_credentials_t()
Definition network.hpp:1141
virtual ~dec_credentials_t()
Definition network.hpp:1142
Definition network.hpp:261
void build_connstr(qstring *out, uint32 flags=0) const
Definition network.hpp:363
void clear()
Definition network.hpp:273
endpoint_credentials_t(const qstring &_host, ushort _port)
Definition network.hpp:269
qstring password_override
Definition network.hpp:266
qstring username
Definition network.hpp:262
bool parse_connstr(const qstring &s, uint32 flags=0)
Definition network.hpp:356
static bool parse_connstr(endpoint_credentials_t *out, const qstring &s, uint32 flags=0)
Definition network.hpp:286
qstring build_connstr(uint32 flags=0) const
Definition network.hpp:384
endpoint_credentials_t()
Definition network.hpp:268
exit_handler_t & operator=(const exit_handler_t &r)=delete
virtual ~exit_handler_t()
exit_handler_t(const exit_handler_t &)=delete
virtual void handle(int signum)=0
Definition network.hpp:219
void clear()
Definition network.hpp:226
bool operator==(const host_port_t &r) const
Definition network.hpp:229
qstring connstr(int default_port=0) const
Definition network.hpp:240
host_port_t()
Definition network.hpp:223
qstring host
Definition network.hpp:220
host_port_t(const qstring &_host, ushort _port)
Definition network.hpp:224
ushort port
Definition network.hpp:221
bool is_valid() const
Definition network.hpp:227
void swap(host_port_t &r)
Definition network.hpp:234
idarpc_stream_t * irs
Definition network.hpp:406
irs_cancellable_op_t(idarpc_stream_t *_irs, bool receiving, size_t goal=0)
void inc_progress(size_t progress)
Definition network.hpp:415
T * get(int *out_ms=nullptr, void **out_ud=nullptr) const
Definition network.hpp:440
void reset()
Definition network.hpp:421
int ms
Definition network.hpp:418
bool set(int _ms, T *_cb, void *_ud)
Definition network.hpp:428
irs_cb_info_t()
Definition network.hpp:420
irs_progress_cb_t * cb
Definition network.hpp:416
void * ud
Definition network.hpp:417
Definition network.hpp:455
cancel_connect_cb_info_t cancel_connect_cb_info
Definition network.hpp:459
irs_client_opts_t()
Definition network.hpp:461
endpoint_credentials_t server
Definition network.hpp:457
size_t cb
Definition network.hpp:456
endpoint_credentials_t proxy
Definition network.hpp:458
irs_client_opts_t(const qstring &_host, int _port)
Definition network.hpp:462
Definition network.hpp:469
qstring privkey_path
Definition network.hpp:473
irs_server_opts_t()
Definition network.hpp:475
qstring certchain_path
Definition network.hpp:472
irs_server_opts_t(const qstring &_host, int _port)
Definition network.hpp:476
size_t cb
Definition network.hpp:470
host_port_t bind
Definition network.hpp:471
Definition network.hpp:671
virtual void check_license_type(const licsrv_rpc::license_t &)
Definition network.hpp:672
virtual void check_license_activation(qstring *out_matched_macaddr, const licsrv_rpc::license_t &lic)
Definition network.hpp:677
virtual void print_license_info(const licsrv_rpc::license_t &lic) const
Definition network.hpp:694
virtual void fill_server_info(const product_entry_t &, const qstring &, const qstring &, const qstring &)
Definition network.hpp:684
virtual int on_parse_error(int code)
Definition network.hpp:692
Definition network.hpp:994
bool load_password(qstring *out, qstring *errbuf) const
Definition network.hpp:1007
virtual void clear() new api
Definition network.hpp:1005
login_credentials_t(const qstring &_host, ushort _port)
Definition network.hpp:1001
void set_use_tls(bool use_tls)
Definition network.hpp:1028
virtual bool write(qstring *) const newapi
Definition network.hpp:1035
bool load_proxy_password(qstring *out, qstring *errbuf) const
Definition network.hpp:1017
endpoint_credentials_t proxy
Definition network.hpp:995
uint32 state
Definition network.hpp:999
virtual ~login_credentials_t()
Definition network.hpp:1003
bool use_tls() const
Definition network.hpp:1027
bool has_seen_proxy_option() const
Definition network.hpp:1029
virtual bool do_load_proxy_password(qstring *, qstring *) const newapi
Definition network.hpp:1034
virtual bool do_load_password(qstring *, qstring *) const newapi
Definition network.hpp:1033
virtual bool process_switch(const char *) new api
bool load_pass_from_keychain(qstring *, qstring *, const char *) const
void init(bool set_as_primary=true)
bool is_primary
Definition network.hpp:1125
virtual bool write(qstring *errbuf) const override
virtual ~lumina_credentials_t()
Definition network.hpp:1130
virtual bool do_load_password(qstring *out, qstring *errbuf) const override
lumina_credentials_t()
Definition network.hpp:1127
virtual void unlock() override
Definition network.hpp:598
virtual bool is_multi_threaded() const override
Definition network.hpp:599
mt_client_handlers_list_t()
Definition network.hpp:595
qmutex_t mutex
Definition network.hpp:593
virtual void lock() override
Definition network.hpp:597
virtual ~mt_client_handlers_list_t()
Definition network.hpp:596
Definition network.hpp:544
virtual void shutdown_gracefully(int signum)=0
virtual bool handle()=0
virtual ~network_client_handler_t()
AS_PRINTF(2, 0) int vlprintf(const char *format
qstring peer_name
Definition network.hpp:547
AS_PRINTF(2, 3) int lprintf(const char *format
utc_timestamp_t session_start
Definition network.hpp:549
const
Definition network.hpp:565
idarpc_stream_t * irs
Definition network.hpp:546
network_client_handler_t(idarpc_stream_t *_irs, bool _verbose)
FILE * channels[16]
Definition network.hpp:545
bool verbose
Definition network.hpp:550
int code
Definition network.hpp:568
int find_free_channel() const
uint32 session_id
Definition network.hpp:548
Definition network.hpp:758
virtual bool deserialize(const uchar **ptr, size_t len, int version)=0
virtual void serialize(bytevec_t *out, int version) const =0
rpc_packet_data_t(uchar _code)
Definition network.hpp:761
uchar code
Definition network.hpp:759
virtual ~rpc_packet_data_t()
Definition network.hpp:762
Definition network.hpp:161
uchar code
Definition network.hpp:163
uint32 length
Definition network.hpp:162
Definition network.hpp:781
rpc_packet_instantiator_t * instantiate
Definition network.hpp:784
uchar code
Definition network.hpp:782
const char * name
Definition network.hpp:783
Definition network.hpp:791
int recv_timeout
Definition network.hpp:793
uchar pkt_code
Definition network.hpp:792
Definition network.hpp:645
qstring log_file_path
Definition network.hpp:647
qstring connection_string
Definition network.hpp:646
qstring config_file_path
Definition network.hpp:649
qstring license_file_path
Definition network.hpp:648
const licsrv_rpc::license_t * read_license_file(license_file_visitor_t &lv) const
bool may_upgrade_schema
Definition network.hpp:711
void check_license_file(license_file_visitor_t &lv) const
FILE * log_file
Definition network.hpp:708
bool check_license_activation
Definition network.hpp:714
void log_request(const bytevec_t &request, int interr_code=-1) const
bool should_recreate_schema
Definition network.hpp:710
qstring badreqdir
Definition network.hpp:707
void get_license_file_contents(bytevec_t *data) const
virtual void collect_cliopts(cliopts_t *out, uint32 features) override
void maybe_start_recording(recording_rpc_engine_t *e)
server_dispatcher_t(bool _multi_threaded, int default_port, const char *default_license_file_name)
base_dispatcher_t inherited
Definition network.hpp:704
virtual ~server_dispatcher_t()
qstring convdir
Definition network.hpp:712
qstring license_file_name
Definition network.hpp:706
licmgr_logger_t * licmgr_logger
Definition network.hpp:709
virtual ~tlm_credentials_t()
Definition network.hpp:1149
tlm_credentials_t()
Definition network.hpp:1148
virtual ~vault_credentials_t()
Definition network.hpp:1066
virtual bool do_load_password(qstring *out, qstring *errbuf) const override
bool update(qstring *errbuf) const
virtual bool process_switch(const char *arg) override
static void reg_set_store_info(bool store_pass)
vault_credentials_t()
Definition network.hpp:1065
bool del(qstring *errbuf) const
void reg_set_site(const char *site) const
static bool reg_should_store_info()
bool has_seen_site_option() const
Definition network.hpp:1096
ask_user_result_t
Definition network.hpp:1078
@ AUR_CANCELLED
Definition network.hpp:1079
@ AUR_VALID
Definition network.hpp:1080
@ AUR_INVALID
Definition network.hpp:1081
virtual bool do_load_proxy_password(qstring *out, qstring *errbuf) const override
virtual bool write(qstring *errbuf) const override
static bool reg_del_store_info()
ask_user_result_t ask_user(credential_validator_t *validator, qstring *errbuf, uint32 auf_flags=0)
login_credentials_t inherited
Definition network.hpp:1059
qstring sitename
Definition network.hpp:1060
virtual void clear() override
Definition network.hpp:1069