Line data Source code
1 : #include "../burp.h"
2 : #include "../alloc.h"
3 : #include "../asfd.h"
4 : #include "../cmd.h"
5 : #include "../cntr.h"
6 : #include "../handy.h"
7 : #include "../iobuf.h"
8 : #include "../log.h"
9 :
10 9 : int authorise_client(struct asfd *asfd,
11 : char **server_version, const char *cname, const char *password,
12 : struct cntr *cntr)
13 : {
14 9 : int ret=-1;
15 9 : char hello[256]="";
16 9 : struct iobuf *rbuf=asfd->rbuf;
17 :
18 : snprintf(hello, sizeof(hello), "hello:%s", VERSION);
19 9 : if(asfd->write_str(asfd, CMD_GEN, hello))
20 : {
21 1 : logp("problem with auth\n");
22 1 : goto end;
23 : }
24 :
25 16 : if(asfd->read(asfd)
26 7 : || rbuf->cmd!=CMD_GEN
27 15 : || strncmp_w(rbuf->buf, "whoareyou"))
28 : {
29 1 : logp("problem with auth\n");
30 1 : goto end;
31 : }
32 7 : if(rbuf->buf)
33 : {
34 7 : char *cp=NULL;
35 14 : if((cp=strchr(rbuf->buf, ':')))
36 : {
37 4 : cp++;
38 4 : if(cp && !(*server_version=strdup_w(cp, __func__)))
39 : goto end;
40 : }
41 7 : iobuf_free_content(rbuf);
42 : }
43 :
44 14 : if(asfd->write_str(asfd, CMD_GEN, cname)
45 7 : || asfd_read_expect(asfd, CMD_GEN, "okpassword")
46 6 : || asfd->write_str(asfd, CMD_GEN, password)
47 13 : || asfd->read(asfd))
48 : {
49 1 : logp("problem with auth\n");
50 1 : goto end;
51 : }
52 :
53 6 : if(rbuf->cmd==CMD_WARNING) // special case for the version warning
54 : {
55 : //logw(conf->p1cntr, rbuf->buf);
56 2 : logp("WARNING: %s\n", rbuf->buf);
57 2 : cntr_add(cntr, rbuf->cmd, 0);
58 2 : iobuf_free_content(rbuf);
59 2 : if(asfd->read(asfd))
60 : {
61 1 : logp("problem with auth\n");
62 1 : goto end;
63 : }
64 : }
65 5 : if(rbuf->cmd==CMD_GEN && !strcmp(rbuf->buf, "ok"))
66 : {
67 : // It is OK.
68 4 : logp("auth ok\n");
69 : }
70 : else
71 : {
72 1 : iobuf_log_unexpected(rbuf, __func__);
73 1 : goto end;
74 : }
75 :
76 4 : ret=0;
77 : end:
78 9 : iobuf_free_content(rbuf);
79 9 : return ret;
80 : }
|