Line data Source code
1 : #include "../burp.h"
2 : #include "../alloc.h"
3 : #include "../bfile.h"
4 : #include "../cmd.h"
5 : #include "../conf.h"
6 : #include "../log.h"
7 : #include "acl.h"
8 : #include "cvss.h"
9 : #include "extrameta.h"
10 : #include "xattr.h"
11 :
12 0 : int has_extrameta(const char *path, enum cmd cmd, enum protocol protocol,
13 : int enable_acl, int enable_xattr)
14 : {
15 : #if defined(WIN32_VSS)
16 : return 1;
17 : #endif
18 : // FIX THIS: extra meta not supported in protocol2.
19 0 : if(protocol==PROTO_2) return 0;
20 : #if defined(HAVE_LINUX_OS) || \
21 : defined(HAVE_FREEBSD_OS) || \
22 : defined(HAVE_OPENBSD_OS) || \
23 : defined(HAVE_NETBSD_OS)
24 :
25 : #ifdef HAVE_ACL
26 0 : if(enable_acl && has_acl(path, cmd)) return 1;
27 : #endif
28 : #endif
29 : #if defined(HAVE_LINUX_OS) || \
30 : defined(HAVE_FREEBSD_OS) || \
31 : defined(HAVE_OPENBSD_OS) || \
32 : defined(HAVE_NETBSD_OS) || \
33 : defined(HAVE_DARWIN_OS)
34 : #ifdef HAVE_XATTR
35 0 : if(enable_xattr && has_xattr(path)) return 1;
36 : #endif
37 : #endif
38 0 : return 0;
39 : }
40 :
41 0 : int get_extrameta(struct asfd *asfd,
42 : BFILE *bfd,
43 : struct sbuf *sb,
44 : char **extrameta,
45 : size_t *elen,
46 : struct cntr *cntr)
47 : {
48 : #if defined (WIN32_VSS)
49 : if(get_vss(bfd, sb, extrameta, elen)) return -1;
50 : #endif
51 : // Important to do xattr directly after acl, because xattr is excluding
52 : // some entries if acls were set.
53 : #if defined(HAVE_LINUX_OS) || \
54 : defined(HAVE_FREEBSD_OS) || \
55 : defined(HAVE_OPENBSD_OS) || \
56 : defined(HAVE_NETBSD_OS)
57 : #ifdef HAVE_ACL
58 0 : if(get_acl(asfd, sb, extrameta, elen, cntr)) return -1;
59 : #endif
60 : #endif
61 : #if defined(HAVE_LINUX_OS) || \
62 : defined(HAVE_FREEBSD_OS) || \
63 : defined(HAVE_OPENBSD_OS) || \
64 : defined(HAVE_NETBSD_OS) || \
65 : defined(HAVE_DARWIN_OS)
66 : #ifdef HAVE_XATTR
67 0 : if(get_xattr(asfd, sb->path.buf, extrameta, elen, cntr)) return -1;
68 : #endif
69 : #endif
70 0 : return 0;
71 : }
72 :
73 0 : int set_extrameta(struct asfd *asfd,
74 : BFILE *bfd,
75 : const char *path,
76 : struct sbuf *sb,
77 : const char *extrameta,
78 : size_t metalen,
79 : struct cntr *cntr)
80 : {
81 0 : size_t l=0;
82 0 : char cmdtmp='\0';
83 0 : unsigned int s=0;
84 0 : const char *metadata=NULL;
85 0 : int errors=0;
86 :
87 0 : metadata=extrameta;
88 0 : l=metalen;
89 0 : while(l>0)
90 : {
91 0 : char *m=NULL;
92 0 : if((sscanf(metadata, "%c%08X", &cmdtmp, &s))!=2)
93 : {
94 : logw(asfd, cntr,
95 : "sscanf of metadata failed for %s: %s\n",
96 0 : path, metadata);
97 0 : return -1;
98 : }
99 0 : metadata+=9;
100 0 : l-=9;
101 0 : if(!(m=(char *)malloc_w(s+1, __func__)))
102 0 : return -1;
103 0 : memcpy(m, metadata, s);
104 0 : m[s]='\0';
105 :
106 0 : metadata+=s;
107 0 : l-=s;
108 :
109 0 : switch(cmdtmp)
110 : {
111 : #if defined(HAVE_WIN32)
112 : case META_VSS:
113 : if(set_vss(bfd, m, s)) errors++;
114 : break;
115 : #endif
116 : #if defined(HAVE_LINUX_OS) || \
117 : defined(HAVE_FREEBSD_OS) || \
118 : defined(HAVE_OPENBSD_OS) || \
119 : defined(HAVE_NETBSD_OS)
120 : #ifdef HAVE_ACL
121 : case META_ACCESS_ACL:
122 0 : if(set_acl(asfd, path, sb, m, s, cmdtmp, cntr))
123 0 : errors++;
124 0 : break;
125 : case META_DEFAULT_ACL:
126 0 : if(set_acl(asfd, path, sb, m, s, cmdtmp, cntr))
127 0 : errors++;
128 0 : break;
129 : #endif
130 : #endif
131 : #if defined(HAVE_LINUX_OS)
132 : #ifdef HAVE_XATTR
133 : case META_XATTR:
134 0 : if(set_xattr(asfd,
135 0 : path, m, s, cmdtmp, cntr))
136 0 : errors++;
137 0 : break;
138 : #endif
139 : #endif
140 : #if defined(HAVE_FREEBSD_OS) || \
141 : defined(HAVE_OPENBSD_OS) || \
142 : defined(HAVE_NETBSD_OS)
143 : #ifdef HAVE_XATTR
144 : case META_XATTR_BSD:
145 : if(set_xattr(asfd,
146 : path, m, s, cmdtmp, cntr))
147 : errors++;
148 : break;
149 : #endif
150 : #endif
151 : #if defined(HAVE_DARWIN_OS)
152 : #ifdef HAVE_XATTR
153 : case META_XATTR_OSX:
154 : if(set_xattr(asfd,
155 : path, m, s, cmdtmp, cntr))
156 : errors++;
157 : break;
158 : #endif
159 : #endif
160 : default:
161 0 : logp("unknown metadata: %c\n", cmdtmp);
162 : logw(asfd, cntr,
163 0 : "unknown metadata: %c\n", cmdtmp);
164 0 : errors++;
165 0 : break;
166 :
167 : }
168 0 : free(m);
169 : }
170 :
171 0 : return errors;
172 : }
|