diff options
| author | me_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac> | 2013-08-30 13:34:02 +0000 |
|---|---|---|
| committer | me_desk <me_desk@fb96df88-216d-11de-830c-f3023f12d8ac> | 2013-08-30 13:34:02 +0000 |
| commit | 0ef7c1d7471ce20fe54729c27858db864aedee91 (patch) | |
| tree | 3a71b713febdbea19fc7358af68d9f6cfa3c3158 /PICA_node.c | |
| parent | bfd5528f28264772a245dc29f41d4bb5d29fb1eb (diff) | |
| download | pica-pica-0ef7c1d7471ce20fe54729c27858db864aedee91.tar.gz pica-pica-0ef7c1d7471ce20fe54729c27858db864aedee91.zip | |
updated pica-client to make it handle new id format. quint32 type for id is replaced with QByteArray in most places. Implemented verification callbacks in client and node that allow self-signed certificates
git-svn-id: svn://localhost/project_picapica/trunk@266 fb96df88-216d-11de-830c-f3023f12d8ac
Diffstat (limited to 'PICA_node.c')
| -rwxr-xr-x | PICA_node.c | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/PICA_node.c b/PICA_node.c index 09a3197..e123fce 100755 --- a/PICA_node.c +++ b/PICA_node.c @@ -153,7 +153,28 @@ struct PICA_msginfo _msginfo_newconn[]={ {PICA_PROTO_NODECONNREQ,PICA_MSG_FIXED_SIZE,PICA_PROTO_NODECONNREQ_SIZE,procmsg_NODECONNREQ} }; +static int verify_callback(int preverify_ok, X509_STORE_CTX *ctx) +{ //return 1 for self-signed certificates +char buf[256]; +X509 *err_cert; +int err, depth; +err_cert = X509_STORE_CTX_get_current_cert(ctx); +err = X509_STORE_CTX_get_error(ctx); +depth = X509_STORE_CTX_get_error_depth(ctx); + +X509_NAME_oneline(X509_get_subject_name(err_cert), buf, 256); + +if (err == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT && depth == 0) + preverify_ok = 1; + +if (!preverify_ok) +{ +PICA_info("certificate verification error:num=%d:%s:depth=%d:%s\n", err, X509_verify_cert_error_string(err), depth, buf); +} + + return preverify_ok; +} unsigned int procmsg_INITREQ(unsigned char* buf,unsigned int size,void* ptr) { @@ -352,18 +373,25 @@ struct client *i,*o;//i - указатель на вызывающего клиÐ unsigned char *callee_id; struct PICA_proto_msg *mp; -PICA_debug1("received CONNREQOUTG"); - i=(struct client *)ptr; +PICA_debug1("received CONNREQOUTG from %s", PICA_id_to_base64(i->id, NULL)); + callee_id = buf+2; if ((o = client_tree_search(callee_id))) { - #warning "duplicated connections" // сделать проверку на наличие уже имеющегося соединения между клиентами - // и если оно есть, то разрывать его, либо... ???? надо подумать + if (cclink_list_search(i->id, callee_id)) + { + PICA_info("duplicate request for existing channel is ignored"); + return 1; + } - #warning "self" // а еще - если клиент вызывает сам себя? + if (memcmp(i->id, callee_id, PICA_ID_SIZE) == 0) + { + PICA_info("request to create channel to self is ignored"); + return 1; + } //отправить o _CONNREQINC if ((mp = client_wbuf_push(o,PICA_PROTO_CONNREQINC,PICA_PROTO_CONNREQINC_SIZE))) @@ -1325,7 +1353,7 @@ ret = SSL_CTX_load_verify_locations(ctx, nodecfg.CA_cert_file, 0); if (!ret) PICA_fatal("call to SSL_CTX_load_verify_locations failed(). Check if %s exists and is accesible", nodecfg.CA_cert_file); -SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL); +SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, verify_callback); return 1; } |
