clamav 0.2.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ChangeLog +11 -1
- data/README.rdoc +115 -0
- data/ext/clamav/clamav.c +156 -95
- data/ext/clamav/const.h +93 -0
- data/ext/clamav/extconf.rb +1 -1
- data/rakefile +9 -8
- data/spec/clamav-testfiles/clam-p.rar +0 -0
- data/spec/clamav-testfiles/clam-ph.rar +0 -0
- data/spec/clamav-testfiles/clam-v2.rar +0 -0
- data/spec/clamav-testfiles/clam-v3.rar +0 -0
- data/spec/clamav-testfiles/clam.cab +0 -0
- data/spec/clamav-testfiles/clam.exe +0 -0
- data/spec/clamav-testfiles/clam.exe.bz2 +0 -0
- data/spec/clamav-testfiles/clam.zip +0 -0
- data/spec/clamav-testfiles/eicar.com +1 -0
- data/spec/clamav-testfiles/jquery.tooltip.pack.js +15 -0
- data/spec/clamav-testfiles/multi.zip +0 -0
- data/spec/clamav-testfiles/program.doc +0 -0
- data/spec/clamav-testfiles/robots.txt +2 -0
- data/spec/clamav-testfiles/test.rar +0 -0
- data/spec/clamav-testfiles/test.txt +1 -0
- data/spec/clamav-testfiles//320/237/321/200/320/276/320/263/321/200/320/260/320/274/320/274/320/260.doc +0 -0
- data/spec/unit/clamav_spec.rb +104 -17
- metadata +27 -10
- data/README +0 -35
data/ChangeLog
CHANGED
@@ -1,6 +1,16 @@
|
|
1
1
|
ChangeLog
|
2
2
|
|
3
|
-
|
3
|
+
Tue Apr 07 20:57:00 MSK 2009
|
4
|
+
----------------------------
|
5
|
+
V 0.3.0
|
6
|
+
* Update to ClamAV-0.95
|
7
|
+
* Detailed README.rdoc
|
8
|
+
+ ClamAV.new optional parameters options, db_options
|
9
|
+
+ ClamAV#scanfile optional parameter options
|
10
|
+
+ ClamAV#reload - reload virus database
|
11
|
+
+ ClamAV#setlimit, #getlimit, #setstring, #getstring
|
12
|
+
|
13
|
+
Sat Sep 06 15:43:00 MSK 2008
|
4
14
|
----------------------------
|
5
15
|
V 0.2.2
|
6
16
|
* Update to ClamAV-0.94
|
data/README.rdoc
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
= ClamAV
|
2
|
+
|
3
|
+
ClamAV Ruby binding gem.
|
4
|
+
|
5
|
+
== INSTALL:
|
6
|
+
|
7
|
+
$ sudo gem install clamav
|
8
|
+
|
9
|
+
== REQUIREMENTS:
|
10
|
+
|
11
|
+
clamav >= 0.95, libclamav6, libclamav-dev
|
12
|
+
|
13
|
+
== SYNOPSIS:
|
14
|
+
|
15
|
+
== ClamAV.new([options[, db_options]])
|
16
|
+
|
17
|
+
return:
|
18
|
+
ClamAV instance
|
19
|
+
|
20
|
+
Options:
|
21
|
+
|
22
|
+
* CL_SCAN_STDOPT (default) equal CL_SCAN_ARCHIVE | CL_SCAN_MAIL | CL_SCAN_OLE2 | CL_SCAN_PDF | CL_SCAN_HTML | CL_SCAN_PE | CL_SCAN_ALGORITHMIC | CL_SCAN_ELF
|
23
|
+
* CL_SCAN_RAW
|
24
|
+
* CL_SCAN_BLOCKENCRYPTED
|
25
|
+
* CL_SCAN_BLOCKBROKEN
|
26
|
+
* CL_SCAN_MAILURL
|
27
|
+
* CL_SCAN_PHISHING_BLOCKSSL
|
28
|
+
* CL_SCAN_PHISHING_BLOCKCLOAK
|
29
|
+
* CL_SCAN_STRUCTURED
|
30
|
+
* CL_SCAN_STRUCTURED_SSN_NORMAL
|
31
|
+
* CL_SCAN_STRUCTURED_SSN_STRIPPED
|
32
|
+
* CL_SCAN_PARTIAL_MESSAGE
|
33
|
+
* CL_SCAN_HEURISTIC_PRECEDENCE
|
34
|
+
|
35
|
+
DB options:
|
36
|
+
|
37
|
+
* CL_DB_STDOPT (default) equal CL_DB_PHISHING | CL_DB_PHISHING_URLS
|
38
|
+
* CL_DB_PUA
|
39
|
+
* CL_DB_CVDNOTMP
|
40
|
+
* CL_DB_PUA_MODE
|
41
|
+
* CL_DB_PUA_INCLUDE
|
42
|
+
* CL_DB_PUA_EXCLUDE
|
43
|
+
|
44
|
+
See ClamAV documentation and sources for details.
|
45
|
+
|
46
|
+
|
47
|
+
|
48
|
+
== ClamAV#scanfile(filename[, options])
|
49
|
+
options default CL_SCAN_STDOPT
|
50
|
+
|
51
|
+
return:
|
52
|
+
virusname or ClamAV returncode(Fixnum)
|
53
|
+
|
54
|
+
|
55
|
+
|
56
|
+
== ClamAV#reload()
|
57
|
+
reload virus db if changed
|
58
|
+
|
59
|
+
return:
|
60
|
+
1 - reload successful
|
61
|
+
0 - reload unnecessary
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
== ClamAV#setlimit(param, value)
|
66
|
+
|
67
|
+
== ClamAV#getlimit(param)
|
68
|
+
|
69
|
+
== ClamAV#setstring(param, value)
|
70
|
+
|
71
|
+
== ClamAV#getstring(param)
|
72
|
+
get or set default values internal settings.
|
73
|
+
|
74
|
+
Params:
|
75
|
+
|
76
|
+
* CL_ENGINE_MAX_SCANSIZE, /* integer */
|
77
|
+
* CL_ENGINE_MAX_FILESIZE, /* integer */
|
78
|
+
* CL_ENGINE_MAX_RECURSION, /* integer */
|
79
|
+
* CL_ENGINE_MAX_FILES, /* integer */
|
80
|
+
* CL_ENGINE_MIN_CC_COUNT, /* integer */
|
81
|
+
* CL_ENGINE_MIN_SSN_COUNT, /* integer */
|
82
|
+
* CL_ENGINE_PUA_CATEGORIES, /* string */
|
83
|
+
* CL_ENGINE_DB_OPTIONS, /* integer */
|
84
|
+
* CL_ENGINE_DB_VERSION, /* integer */
|
85
|
+
* CL_ENGINE_DB_TIME, /* integer unixtime (readonly) */
|
86
|
+
* CL_ENGINE_AC_ONLY, /* integer */
|
87
|
+
* CL_ENGINE_AC_MINDEPTH, /* integer */
|
88
|
+
* CL_ENGINE_AC_MAXDEPTH, /* integer */
|
89
|
+
* CL_ENGINE_TMPDIR, /* string */
|
90
|
+
* CL_ENGINE_KEEPTMP /* integer */
|
91
|
+
|
92
|
+
See ClamAV documentation and sources for details.
|
93
|
+
|
94
|
+
|
95
|
+
|
96
|
+
== ClamaAV#signo()
|
97
|
+
get loaded signatures count
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
== LICENSE:
|
102
|
+
|
103
|
+
GNU General Public License
|
104
|
+
|
105
|
+
Copyright(c) 2008-2009 Alexander Oryol <eagle.alex@gmail.com>
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
== THANKS:
|
110
|
+
|
111
|
+
Based on project clamavr-0.2.0
|
112
|
+
|
113
|
+
http://raa.ruby-lang.org/project/clamavr/
|
114
|
+
|
115
|
+
Copyright(c) 2003-2007 MoonWolf <moonwolf@moonwolf.com>
|
data/ext/clamav/clamav.c
CHANGED
@@ -5,33 +5,69 @@ static VALUE cClamAV;
|
|
5
5
|
|
6
6
|
struct ClamAV_R {
|
7
7
|
struct cl_engine *root;
|
8
|
-
|
8
|
+
int options;
|
9
|
+
int db_options;
|
10
|
+
struct cl_stat dbstat;
|
9
11
|
unsigned int signo;
|
10
12
|
};
|
11
13
|
|
12
14
|
static void clamavr_free(struct ClamAV_R *ptr) {
|
13
|
-
|
15
|
+
int ret;
|
16
|
+
ret = cl_engine_free(ptr->root);
|
17
|
+
if(ret != CL_SUCCESS) {
|
18
|
+
rb_raise(rb_eRuntimeError, "cl_engine_free() error: %s\n", cl_strerror(ret));
|
19
|
+
}
|
14
20
|
xfree(ptr);
|
15
21
|
}
|
16
22
|
|
17
|
-
static VALUE
|
18
|
-
|
23
|
+
static VALUE clamavr_new(argc, argv, klass)
|
24
|
+
int argc;
|
25
|
+
VALUE *argv;
|
26
|
+
VALUE klass;
|
27
|
+
{
|
28
|
+
const char *v_fname;
|
29
|
+
int v_options;
|
30
|
+
int v_db_options;
|
31
|
+
rb_scan_args(argc, argv, "02", &v_options, &v_db_options);
|
32
|
+
if(NIL_P(v_options)){
|
33
|
+
v_options = INT2FIX(CL_SCAN_STDOPT); /* default value */
|
34
|
+
}
|
35
|
+
if(NIL_P(v_db_options)){
|
36
|
+
v_db_options = INT2FIX(CL_DB_STDOPT); /* default value */
|
37
|
+
}
|
38
|
+
|
19
39
|
int ret;
|
40
|
+
ret = cl_init(FIX2INT(v_options));
|
41
|
+
if(ret != CL_SUCCESS) {
|
42
|
+
rb_raise(rb_eRuntimeError, "cl_init() error: %s\n", cl_strerror(ret));
|
43
|
+
}
|
44
|
+
struct ClamAV_R *ptr = ALLOC(struct ClamAV_R);
|
45
|
+
ptr->root = cl_engine_new();
|
46
|
+
if(ptr->root == NULL) {
|
47
|
+
rb_raise(rb_eRuntimeError, "cl_engine_new() error: %s\n", cl_strerror(ret));
|
48
|
+
};
|
49
|
+
|
50
|
+
/* save options */
|
51
|
+
ptr->options = v_options;
|
52
|
+
ptr->db_options = v_db_options;
|
20
53
|
|
21
|
-
ptr->root = NULL;
|
22
54
|
ptr->signo = 0;
|
23
|
-
|
24
|
-
|
25
|
-
|
55
|
+
|
56
|
+
const char *dbdir;
|
57
|
+
dbdir = cl_retdbdir();
|
58
|
+
|
59
|
+
ret = cl_load(dbdir, ptr->root, &ptr->signo, FIX2INT(v_db_options));
|
60
|
+
if(ret != CL_SUCCESS) {
|
61
|
+
rb_raise(rb_eRuntimeError, "cl_load() error: %s\n", cl_strerror(ret));
|
26
62
|
}
|
27
|
-
cl_build(ptr->root);
|
28
|
-
|
29
|
-
ptr->limits.maxscansize = 10 * 1024 * 1024;
|
30
|
-
ptr->limits.maxfilesize = 10 * 1024 * 1024;
|
31
|
-
ptr->limits.maxreclevel = 100;
|
32
|
-
ptr->limits.maxfiles = 1024;
|
33
|
-
ptr->limits.archivememlim = 1;
|
34
63
|
|
64
|
+
memset(&ptr->dbstat, 0, sizeof(struct cl_stat));
|
65
|
+
cl_statinidir(dbdir, &ptr->dbstat);
|
66
|
+
|
67
|
+
ret = cl_engine_compile(ptr->root);
|
68
|
+
if(ret != CL_SUCCESS) {
|
69
|
+
rb_raise(rb_eRuntimeError, "cl_engine_compile() error: %s\n", cl_strerror(ret));
|
70
|
+
}
|
35
71
|
return Data_Wrap_Struct(klass, 0, clamavr_free, ptr);
|
36
72
|
}
|
37
73
|
|
@@ -39,23 +75,95 @@ static VALUE clamavr_initialize(VALUE self) {
|
|
39
75
|
return self;
|
40
76
|
}
|
41
77
|
|
78
|
+
static VALUE clamavr_setlimit(VALUE self, VALUE v_limit, VALUE v_value) {
|
79
|
+
Check_Type(v_limit, T_FIXNUM);
|
80
|
+
Check_Type(v_value, T_FIXNUM);
|
81
|
+
|
82
|
+
struct ClamAV_R *ptr;
|
83
|
+
Data_Get_Struct(self, struct ClamAV_R, ptr);
|
84
|
+
|
85
|
+
int ret;
|
86
|
+
ret = cl_engine_set_num(ptr->root, FIX2INT(v_limit), FIX2INT(v_value));
|
87
|
+
if(ret != CL_SUCCESS) {
|
88
|
+
rb_raise(rb_eRuntimeError, "cl_engine_set_num() error: %s\n", cl_strerror(ret));
|
89
|
+
}
|
90
|
+
return INT2FIX(ret);
|
91
|
+
}
|
92
|
+
|
93
|
+
static VALUE clamavr_getlimit(VALUE self, VALUE v_limit) {
|
94
|
+
Check_Type(v_limit, T_FIXNUM);
|
95
|
+
|
96
|
+
struct ClamAV_R *ptr;
|
97
|
+
Data_Get_Struct(self, struct ClamAV_R, ptr);
|
98
|
+
|
99
|
+
int ret;
|
100
|
+
int err;
|
101
|
+
ret = cl_engine_get_num(ptr->root, FIX2INT(v_limit), &err);
|
102
|
+
if(err != CL_SUCCESS) {
|
103
|
+
rb_raise(rb_eRuntimeError, "cl_engine_get_num() error: %s\n", cl_strerror(err));
|
104
|
+
}
|
105
|
+
return INT2NUM(ret);
|
106
|
+
}
|
107
|
+
|
108
|
+
static VALUE clamavr_setstring(VALUE self, VALUE v_param, VALUE v_value) {
|
109
|
+
Check_Type(v_param, T_FIXNUM);
|
110
|
+
Check_Type(v_value, T_STRING);
|
111
|
+
|
112
|
+
struct ClamAV_R *ptr;
|
113
|
+
Data_Get_Struct(self, struct ClamAV_R, ptr);
|
114
|
+
|
115
|
+
int ret;
|
116
|
+
ret = cl_engine_set_str(ptr->root, FIX2INT(v_param), RSTRING(v_value)->ptr);
|
117
|
+
if(ret != CL_SUCCESS) {
|
118
|
+
rb_raise(rb_eRuntimeError, "cl_engine_set_str() error: %s\n", cl_strerror(ret));
|
119
|
+
}
|
120
|
+
return INT2FIX(ret);
|
121
|
+
}
|
122
|
+
|
123
|
+
static VALUE clamavr_getstring(VALUE self, VALUE v_param) {
|
124
|
+
Check_Type(v_param, T_FIXNUM);
|
125
|
+
struct ClamAV_R *ptr;
|
126
|
+
Data_Get_Struct(self, struct ClamAV_R, ptr);
|
127
|
+
const char *result;
|
128
|
+
int err;
|
129
|
+
result = cl_engine_get_str(ptr->root, FIX2INT(v_param), &err);
|
130
|
+
if(err != CL_SUCCESS) {
|
131
|
+
rb_raise(rb_eRuntimeError, "cl_engine_get_str() error: %s\n", cl_strerror(err));
|
132
|
+
}
|
133
|
+
if(result == NULL){
|
134
|
+
return Qnil;
|
135
|
+
}
|
136
|
+
return rb_str_new2(result);
|
137
|
+
}
|
138
|
+
|
42
139
|
static VALUE clamavr_signo(VALUE self) {
|
43
140
|
struct ClamAV_R *ptr;
|
44
141
|
Data_Get_Struct(self, struct ClamAV_R, ptr);
|
45
142
|
return UINT2NUM(ptr->signo);
|
46
143
|
}
|
47
144
|
|
48
|
-
static VALUE clamavr_scanfile(
|
49
|
-
int
|
50
|
-
|
145
|
+
static VALUE clamavr_scanfile(argc, argv, klass)
|
146
|
+
int argc;
|
147
|
+
VALUE *argv;
|
148
|
+
VALUE klass;
|
149
|
+
{
|
51
150
|
struct ClamAV_R *ptr;
|
151
|
+
Data_Get_Struct(klass, struct ClamAV_R, ptr);
|
152
|
+
|
153
|
+
const char *v_fname;
|
154
|
+
int v_options;
|
155
|
+
rb_scan_args(argc, argv, "11", &v_fname, &v_options);
|
156
|
+
if(NIL_P(v_options)){
|
157
|
+
v_options = ptr->options; /* stored value */
|
158
|
+
}
|
52
159
|
|
53
160
|
Check_Type(v_fname, T_STRING);
|
54
161
|
Check_Type(v_options, T_FIXNUM);
|
55
162
|
|
56
|
-
|
163
|
+
int ret;
|
164
|
+
const char *virname;
|
57
165
|
|
58
|
-
ret = cl_scanfile(RSTRING(v_fname)->ptr, &virname, NULL, ptr->root,
|
166
|
+
ret = cl_scanfile(RSTRING(v_fname)->ptr, &virname, NULL, ptr->root, FIX2INT(v_options));
|
59
167
|
if (ret == CL_VIRUS) {
|
60
168
|
return rb_str_new2(virname);
|
61
169
|
} else {
|
@@ -63,84 +171,37 @@ static VALUE clamavr_scanfile(VALUE self, VALUE v_fname, VALUE v_options) {
|
|
63
171
|
}
|
64
172
|
}
|
65
173
|
|
174
|
+
static VALUE clamavr_dbreload(VALUE self) {
|
175
|
+
struct ClamAV_R *ptr;
|
176
|
+
Data_Get_Struct(self, struct ClamAV_R, ptr);
|
177
|
+
|
178
|
+
int state;
|
179
|
+
state = cl_statchkdir(&ptr->dbstat);
|
180
|
+
if(state == 1) {
|
181
|
+
const char *dbdir;
|
182
|
+
dbdir = cl_retdbdir();
|
183
|
+
int ret;
|
184
|
+
ret = cl_load(dbdir, ptr->root, &ptr->signo, FIX2INT(ptr->db_options));
|
185
|
+
if(ret != CL_SUCCESS) {
|
186
|
+
rb_raise(rb_eRuntimeError, "cl_load() error: %s\n", cl_strerror(ret));
|
187
|
+
}
|
188
|
+
cl_statfree(&ptr->dbstat);
|
189
|
+
cl_statinidir(dbdir, &ptr->dbstat);
|
190
|
+
}
|
191
|
+
return INT2FIX(state);
|
192
|
+
}
|
193
|
+
|
66
194
|
void Init_clamav() {
|
67
195
|
cClamAV = rb_define_class("ClamAV", rb_cObject);
|
68
|
-
|
196
|
+
rb_define_singleton_method(cClamAV, "new", clamavr_new, -1);
|
69
197
|
rb_define_method(cClamAV, "initialize", clamavr_initialize, 0);
|
70
|
-
|
71
|
-
rb_define_method(cClamAV, "scanfile", clamavr_scanfile, 2);
|
198
|
+
rb_define_method(cClamAV, "scanfile", clamavr_scanfile, -1);
|
72
199
|
rb_define_method(cClamAV, "signo", clamavr_signo, 0);
|
200
|
+
rb_define_method(cClamAV, "setlimit", clamavr_setlimit, 2);
|
201
|
+
rb_define_method(cClamAV, "getlimit", clamavr_getlimit, 1);
|
202
|
+
rb_define_method(cClamAV, "setstring", clamavr_setstring, 2);
|
203
|
+
rb_define_method(cClamAV, "getstring", clamavr_getstring, 1);
|
204
|
+
rb_define_method(cClamAV, "reload", clamavr_dbreload, 0);
|
73
205
|
|
74
|
-
|
75
|
-
rb_define_const(cClamAV, "CL_CLEAN", INT2FIX(CL_CLEAN)); /* no virus found */
|
76
|
-
rb_define_const(cClamAV, "CL_VIRUS", INT2FIX(CL_VIRUS)); /* virus(es) found */
|
77
|
-
rb_define_const(cClamAV, "CL_SUCCESS", INT2FIX(CL_SUCCESS));
|
78
|
-
rb_define_const(cClamAV, "CL_BREAK", INT2FIX(CL_BREAK));
|
79
|
-
|
80
|
-
rb_define_const(cClamAV, "CL_EMAXREC", INT2FIX(CL_EMAXREC)); /* (internal) recursion limit exceeded */
|
81
|
-
rb_define_const(cClamAV, "CL_EMAXSIZE", INT2FIX(CL_EMAXSIZE)); /* (internal) size limit exceeded */
|
82
|
-
rb_define_const(cClamAV, "CL_EMAXFILES", INT2FIX(CL_EMAXFILES)); /* (internal) files limit exceeded */
|
83
|
-
rb_define_const(cClamAV, "CL_ERAR", INT2FIX(CL_ERAR)); /* rar handler error */
|
84
|
-
rb_define_const(cClamAV, "CL_EZIP", INT2FIX(CL_EZIP)); /* zip handler error */
|
85
|
-
rb_define_const(cClamAV, "CL_EGZIP", INT2FIX(CL_EGZIP)); /* gzip handler error */
|
86
|
-
rb_define_const(cClamAV, "CL_EBZIP", INT2FIX(CL_EBZIP)); /* bzip2 handler error */
|
87
|
-
rb_define_const(cClamAV, "CL_EOLE2", INT2FIX(CL_EOLE2)); /* OLE2 handler error */
|
88
|
-
rb_define_const(cClamAV, "CL_EMSCOMP", INT2FIX(CL_EMSCOMP)); /* MS Expand handler error */
|
89
|
-
rb_define_const(cClamAV, "CL_EMSCAB", INT2FIX(CL_EMSCAB)); /* MS CAB module error */
|
90
|
-
rb_define_const(cClamAV, "CL_EACCES", INT2FIX(CL_EACCES)); /* access denied */
|
91
|
-
rb_define_const(cClamAV, "CL_ENULLARG", INT2FIX(CL_ENULLARG)); /* null argument */
|
92
|
-
rb_define_const(cClamAV, "CL_ETMPFILE", INT2FIX(CL_ETMPFILE)); /* tmpfile() failed */
|
93
|
-
rb_define_const(cClamAV, "CL_EMEM", INT2FIX(CL_EMEM)); /* memory allocation error */
|
94
|
-
rb_define_const(cClamAV, "CL_EOPEN", INT2FIX(CL_EOPEN)); /* file open error */
|
95
|
-
rb_define_const(cClamAV, "CL_EMALFDB", INT2FIX(CL_EMALFDB)); /* malformed database */
|
96
|
-
rb_define_const(cClamAV, "CL_EPATSHORT", INT2FIX(CL_EPATSHORT)); /* pattern too short */
|
97
|
-
rb_define_const(cClamAV, "CL_ETMPDIR", INT2FIX(CL_ETMPDIR)); /* mkdir() failed */
|
98
|
-
rb_define_const(cClamAV, "CL_ECVD", INT2FIX(CL_ECVD)); /* not a CVD file (or broken) */
|
99
|
-
rb_define_const(cClamAV, "CL_ECVDEXTR", INT2FIX(CL_ECVDEXTR)); /* CVD extraction failure */
|
100
|
-
rb_define_const(cClamAV, "CL_EMD5", INT2FIX(CL_EMD5)); /* MD5 verification error */
|
101
|
-
rb_define_const(cClamAV, "CL_EDSIG", INT2FIX(CL_EDSIG)); /* digital signature verification error */
|
102
|
-
rb_define_const(cClamAV, "CL_EIO", INT2FIX(CL_EIO)); /* general I/O error */
|
103
|
-
rb_define_const(cClamAV, "CL_EFORMAT", INT2FIX(CL_EFORMAT)); /* (internal) bad format or broken file */
|
104
|
-
rb_define_const(cClamAV, "CL_ESUPPORT", INT2FIX(CL_ESUPPORT)); /* not supported data format */
|
105
|
-
rb_define_const(cClamAV, "CL_EARJ", INT2FIX(CL_EARJ)); /* ARJ handler error */
|
106
|
-
|
107
|
-
/* db options */
|
108
|
-
rb_define_const(cClamAV, "CL_DB_PHISHING", INT2FIX(CL_DB_PHISHING));
|
109
|
-
rb_define_const(cClamAV, "CL_DB_ACONLY", INT2FIX(CL_DB_ACONLY)); /* WARNING: only for developers */
|
110
|
-
rb_define_const(cClamAV, "CL_DB_PHISHING_URLS", INT2FIX(CL_DB_PHISHING_URLS));
|
111
|
-
rb_define_const(cClamAV, "CL_DB_PUA", INT2FIX(CL_DB_PUA));
|
112
|
-
rb_define_const(cClamAV, "CL_DB_CVDNOTMP", INT2FIX(CL_DB_CVDNOTMP));
|
113
|
-
rb_define_const(cClamAV, "CL_DB_OFFICIAL", INT2FIX(CL_DB_OFFICIAL));
|
114
|
-
rb_define_const(cClamAV, "CL_DB_PUA_MODE", INT2FIX(CL_DB_PUA_MODE));
|
115
|
-
rb_define_const(cClamAV, "CL_DB_PUA_INCLUDE", INT2FIX(CL_DB_PUA_INCLUDE));
|
116
|
-
rb_define_const(cClamAV, "CL_DB_PUA_EXCLUDE", INT2FIX(CL_DB_PUA_EXCLUDE));
|
117
|
-
|
118
|
-
/* recommended db settings */
|
119
|
-
rb_define_const(cClamAV, "CL_DB_STDOPT", INT2FIX(CL_DB_STDOPT));
|
120
|
-
|
121
|
-
/* scan options */
|
122
|
-
rb_define_const(cClamAV, "CL_SCAN_RAW", INT2FIX(CL_SCAN_RAW));
|
123
|
-
rb_define_const(cClamAV, "CL_SCAN_ARCHIVE", INT2FIX(CL_SCAN_ARCHIVE));
|
124
|
-
rb_define_const(cClamAV, "CL_SCAN_MAIL", INT2FIX(CL_SCAN_MAIL));
|
125
|
-
rb_define_const(cClamAV, "CL_SCAN_OLE2", INT2FIX(CL_SCAN_OLE2));
|
126
|
-
rb_define_const(cClamAV, "CL_SCAN_BLOCKENCRYPTED", INT2FIX(CL_SCAN_BLOCKENCRYPTED));
|
127
|
-
rb_define_const(cClamAV, "CL_SCAN_HTML", INT2FIX(CL_SCAN_HTML));
|
128
|
-
rb_define_const(cClamAV, "CL_SCAN_PE", INT2FIX(CL_SCAN_PE));
|
129
|
-
rb_define_const(cClamAV, "CL_SCAN_BLOCKBROKEN", INT2FIX(CL_SCAN_BLOCKBROKEN));
|
130
|
-
rb_define_const(cClamAV, "CL_SCAN_MAILURL", INT2FIX(CL_SCAN_MAILURL));
|
131
|
-
rb_define_const(cClamAV, "CL_SCAN_BLOCKMAX", INT2FIX(CL_SCAN_BLOCKMAX)); /* ignored */
|
132
|
-
rb_define_const(cClamAV, "CL_SCAN_ALGORITHMIC", INT2FIX(CL_SCAN_ALGORITHMIC));
|
133
|
-
rb_define_const(cClamAV, "CL_SCAN_PHISHING_BLOCKSSL", INT2FIX(CL_SCAN_PHISHING_BLOCKSSL)); /* ssl mismatches, not ssl by itself */
|
134
|
-
rb_define_const(cClamAV, "CL_SCAN_PHISHING_BLOCKCLOAK", INT2FIX(CL_SCAN_PHISHING_BLOCKCLOAK));
|
135
|
-
rb_define_const(cClamAV, "CL_SCAN_ELF", INT2FIX(CL_SCAN_ELF));
|
136
|
-
rb_define_const(cClamAV, "CL_SCAN_PDF", INT2FIX(CL_SCAN_PDF));
|
137
|
-
rb_define_const(cClamAV, "CL_SCAN_STRUCTURED", INT2FIX(CL_SCAN_STRUCTURED));
|
138
|
-
rb_define_const(cClamAV, "CL_SCAN_STRUCTURED_SSN_NORMAL", INT2FIX(CL_SCAN_STRUCTURED_SSN_NORMAL));
|
139
|
-
rb_define_const(cClamAV, "CL_SCAN_STRUCTURED_SSN_STRIPPED", INT2FIX(CL_SCAN_STRUCTURED_SSN_STRIPPED));
|
140
|
-
rb_define_const(cClamAV, "CL_SCAN_PARTIAL_MESSAGE", INT2FIX(CL_SCAN_PARTIAL_MESSAGE));
|
141
|
-
rb_define_const(cClamAV, "CL_SCAN_HEURISTIC_PRECEDENCE", INT2FIX(CL_SCAN_HEURISTIC_PRECEDENCE));
|
142
|
-
|
143
|
-
/* recommended scan settings */
|
144
|
-
rb_define_const(cClamAV, "CL_SCAN_STDOPT", INT2FIX(CL_SCAN_STDOPT));
|
145
|
-
|
206
|
+
#include <const.h>
|
146
207
|
}
|
data/ext/clamav/const.h
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
/* return codes */
|
2
|
+
|
3
|
+
/* libclamav specific */
|
4
|
+
rb_define_const(cClamAV, "CL_CLEAN", INT2FIX(CL_CLEAN));
|
5
|
+
rb_define_const(cClamAV, "CL_SUCCESS", INT2FIX(CL_SUCCESS));
|
6
|
+
rb_define_const(cClamAV, "CL_VIRUS", INT2FIX(CL_VIRUS));
|
7
|
+
rb_define_const(cClamAV, "CL_ENULLARG", INT2FIX(CL_ENULLARG));
|
8
|
+
rb_define_const(cClamAV, "CL_EARG", INT2FIX(CL_EARG));
|
9
|
+
rb_define_const(cClamAV, "CL_EMALFDB", INT2FIX(CL_EMALFDB));
|
10
|
+
rb_define_const(cClamAV, "CL_ECVD", INT2FIX(CL_ECVD));
|
11
|
+
rb_define_const(cClamAV, "CL_EVERIFY", INT2FIX(CL_EVERIFY));
|
12
|
+
rb_define_const(cClamAV, "CL_EUNPACK", INT2FIX(CL_EUNPACK));
|
13
|
+
|
14
|
+
/* I/O and memory errors */
|
15
|
+
rb_define_const(cClamAV, "CL_EOPEN", INT2FIX(CL_EOPEN));
|
16
|
+
rb_define_const(cClamAV, "CL_ECREAT", INT2FIX(CL_ECREAT));
|
17
|
+
rb_define_const(cClamAV, "CL_EUNLINK", INT2FIX(CL_EUNLINK));
|
18
|
+
rb_define_const(cClamAV, "CL_ESTAT", INT2FIX(CL_ESTAT));
|
19
|
+
rb_define_const(cClamAV, "CL_EREAD", INT2FIX(CL_EREAD));
|
20
|
+
rb_define_const(cClamAV, "CL_ESEEK", INT2FIX(CL_ESEEK));
|
21
|
+
rb_define_const(cClamAV, "CL_EWRITE", INT2FIX(CL_EWRITE));
|
22
|
+
rb_define_const(cClamAV, "CL_EDUP", INT2FIX(CL_EDUP));
|
23
|
+
rb_define_const(cClamAV, "CL_EACCES", INT2FIX(CL_EACCES));
|
24
|
+
rb_define_const(cClamAV, "CL_ETMPFILE", INT2FIX(CL_ETMPFILE));
|
25
|
+
rb_define_const(cClamAV, "CL_ETMPDIR", INT2FIX(CL_ETMPDIR));
|
26
|
+
rb_define_const(cClamAV, "CL_EMAP", INT2FIX(CL_EMAP));
|
27
|
+
rb_define_const(cClamAV, "CL_EMEM", INT2FIX(CL_EMEM));
|
28
|
+
rb_define_const(cClamAV, "CL_ETIMEOUT", INT2FIX(CL_ETIMEOUT));
|
29
|
+
|
30
|
+
/* internal (not reported outside libclamav) */
|
31
|
+
rb_define_const(cClamAV, "CL_BREAK", INT2FIX(CL_BREAK));
|
32
|
+
rb_define_const(cClamAV, "CL_EMAXREC", INT2FIX(CL_EMAXREC));
|
33
|
+
rb_define_const(cClamAV, "CL_EMAXSIZE", INT2FIX(CL_EMAXSIZE));
|
34
|
+
rb_define_const(cClamAV, "CL_EMAXFILES", INT2FIX(CL_EMAXFILES));
|
35
|
+
rb_define_const(cClamAV, "CL_EFORMAT", INT2FIX(CL_EFORMAT));
|
36
|
+
|
37
|
+
/* db options */
|
38
|
+
rb_define_const(cClamAV, "CL_DB_PHISHING", INT2FIX(CL_DB_PHISHING));
|
39
|
+
rb_define_const(cClamAV, "CL_DB_PHISHING_URLS", INT2FIX(CL_DB_PHISHING_URLS));
|
40
|
+
rb_define_const(cClamAV, "CL_DB_PUA", INT2FIX(CL_DB_PUA));
|
41
|
+
rb_define_const(cClamAV, "CL_DB_CVDNOTMP", INT2FIX(CL_DB_CVDNOTMP));
|
42
|
+
rb_define_const(cClamAV, "CL_DB_OFFICIAL", INT2FIX(CL_DB_OFFICIAL)); /* internal */
|
43
|
+
rb_define_const(cClamAV, "CL_DB_PUA_MODE", INT2FIX(CL_DB_PUA_MODE));
|
44
|
+
rb_define_const(cClamAV, "CL_DB_PUA_INCLUDE", INT2FIX(CL_DB_PUA_INCLUDE));
|
45
|
+
rb_define_const(cClamAV, "CL_DB_PUA_EXCLUDE", INT2FIX(CL_DB_PUA_EXCLUDE));
|
46
|
+
rb_define_const(cClamAV, "CL_DB_COMPILED", INT2FIX(CL_DB_COMPILED)); /* internal */
|
47
|
+
|
48
|
+
/* recommended db settings */
|
49
|
+
rb_define_const(cClamAV, "CL_DB_STDOPT", INT2FIX(CL_DB_STDOPT));
|
50
|
+
|
51
|
+
/* scan options */
|
52
|
+
rb_define_const(cClamAV, "CL_SCAN_RAW", INT2FIX(CL_SCAN_RAW));
|
53
|
+
rb_define_const(cClamAV, "CL_SCAN_ARCHIVE", INT2FIX(CL_SCAN_ARCHIVE));
|
54
|
+
rb_define_const(cClamAV, "CL_SCAN_MAIL", INT2FIX(CL_SCAN_MAIL));
|
55
|
+
rb_define_const(cClamAV, "CL_SCAN_OLE2", INT2FIX(CL_SCAN_OLE2));
|
56
|
+
rb_define_const(cClamAV, "CL_SCAN_BLOCKENCRYPTED", INT2FIX(CL_SCAN_BLOCKENCRYPTED));
|
57
|
+
rb_define_const(cClamAV, "CL_SCAN_HTML", INT2FIX(CL_SCAN_HTML));
|
58
|
+
rb_define_const(cClamAV, "CL_SCAN_PE", INT2FIX(CL_SCAN_PE));
|
59
|
+
rb_define_const(cClamAV, "CL_SCAN_BLOCKBROKEN", INT2FIX(CL_SCAN_BLOCKBROKEN));
|
60
|
+
rb_define_const(cClamAV, "CL_SCAN_MAILURL", INT2FIX(CL_SCAN_MAILURL));
|
61
|
+
rb_define_const(cClamAV, "CL_SCAN_BLOCKMAX", INT2FIX(CL_SCAN_BLOCKMAX)); /* ignored */
|
62
|
+
rb_define_const(cClamAV, "CL_SCAN_ALGORITHMIC", INT2FIX(CL_SCAN_ALGORITHMIC));
|
63
|
+
rb_define_const(cClamAV, "CL_SCAN_PHISHING_BLOCKSSL", INT2FIX(CL_SCAN_PHISHING_BLOCKSSL)); /* ssl mismatches, not ssl by itself */
|
64
|
+
rb_define_const(cClamAV, "CL_SCAN_PHISHING_BLOCKCLOAK", INT2FIX(CL_SCAN_PHISHING_BLOCKCLOAK));
|
65
|
+
rb_define_const(cClamAV, "CL_SCAN_ELF", INT2FIX(CL_SCAN_ELF));
|
66
|
+
rb_define_const(cClamAV, "CL_SCAN_PDF", INT2FIX(CL_SCAN_PDF));
|
67
|
+
rb_define_const(cClamAV, "CL_SCAN_STRUCTURED", INT2FIX(CL_SCAN_STRUCTURED));
|
68
|
+
rb_define_const(cClamAV, "CL_SCAN_STRUCTURED_SSN_NORMAL", INT2FIX(CL_SCAN_STRUCTURED_SSN_NORMAL));
|
69
|
+
rb_define_const(cClamAV, "CL_SCAN_STRUCTURED_SSN_STRIPPED", INT2FIX(CL_SCAN_STRUCTURED_SSN_STRIPPED));
|
70
|
+
rb_define_const(cClamAV, "CL_SCAN_PARTIAL_MESSAGE", INT2FIX(CL_SCAN_PARTIAL_MESSAGE));
|
71
|
+
rb_define_const(cClamAV, "CL_SCAN_HEURISTIC_PRECEDENCE", INT2FIX(CL_SCAN_HEURISTIC_PRECEDENCE));
|
72
|
+
|
73
|
+
/* recommended scan settings */
|
74
|
+
rb_define_const(cClamAV, "CL_SCAN_STDOPT", INT2FIX(CL_SCAN_STDOPT));
|
75
|
+
|
76
|
+
rb_define_const(cClamAV, "CL_INIT_DEFAULT", INT2FIX(CL_INIT_DEFAULT));
|
77
|
+
|
78
|
+
rb_define_const(cClamAV, "CL_ENGINE_MAX_SCANSIZE", INT2FIX(CL_ENGINE_MAX_SCANSIZE));
|
79
|
+
rb_define_const(cClamAV, "CL_ENGINE_MAX_FILESIZE", INT2FIX(CL_ENGINE_MAX_FILESIZE));
|
80
|
+
rb_define_const(cClamAV, "CL_ENGINE_MAX_RECURSION", INT2FIX(CL_ENGINE_MAX_RECURSION));
|
81
|
+
rb_define_const(cClamAV, "CL_ENGINE_MAX_FILES", INT2FIX(CL_ENGINE_MAX_FILES));
|
82
|
+
rb_define_const(cClamAV, "CL_ENGINE_MIN_CC_COUNT", INT2FIX(CL_ENGINE_MIN_CC_COUNT));
|
83
|
+
rb_define_const(cClamAV, "CL_ENGINE_MIN_SSN_COUNT", INT2FIX(CL_ENGINE_MIN_SSN_COUNT));
|
84
|
+
rb_define_const(cClamAV, "CL_ENGINE_PUA_CATEGORIES", INT2FIX(CL_ENGINE_PUA_CATEGORIES));
|
85
|
+
rb_define_const(cClamAV, "CL_ENGINE_DB_OPTIONS", INT2FIX(CL_ENGINE_DB_OPTIONS));
|
86
|
+
rb_define_const(cClamAV, "CL_ENGINE_DB_VERSION", INT2FIX(CL_ENGINE_DB_VERSION));
|
87
|
+
rb_define_const(cClamAV, "CL_ENGINE_DB_TIME", INT2FIX(CL_ENGINE_DB_TIME));
|
88
|
+
rb_define_const(cClamAV, "CL_ENGINE_AC_ONLY", INT2FIX(CL_ENGINE_AC_ONLY));
|
89
|
+
rb_define_const(cClamAV, "CL_ENGINE_AC_MINDEPTH", INT2FIX(CL_ENGINE_AC_MINDEPTH));
|
90
|
+
rb_define_const(cClamAV, "CL_ENGINE_AC_MAXDEPTH", INT2FIX(CL_ENGINE_AC_MAXDEPTH));
|
91
|
+
rb_define_const(cClamAV, "CL_ENGINE_TMPDIR", INT2FIX(CL_ENGINE_TMPDIR));
|
92
|
+
rb_define_const(cClamAV, "CL_ENGINE_KEEPTMP", INT2FIX(CL_ENGINE_KEEPTMP));
|
93
|
+
|
data/ext/clamav/extconf.rb
CHANGED
data/rakefile
CHANGED
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
|
|
5
5
|
require 'tools/rakehelp'
|
6
6
|
require 'spec/rake/spectask'
|
7
7
|
|
8
|
-
GEM_VERSION="0.
|
8
|
+
GEM_VERSION="0.3.0"
|
9
9
|
|
10
10
|
setup_extension('clamav', 'clamav')
|
11
11
|
|
@@ -25,20 +25,21 @@ gemspec = Gem::Specification.new do |gemspec|
|
|
25
25
|
gemspec.version = GEM_VERSION
|
26
26
|
gemspec.author = "Alexander Oryol"
|
27
27
|
gemspec.email = "eagle.alex@gmail.com"
|
28
|
-
gemspec.summary = "ClamAV Ruby
|
28
|
+
gemspec.summary = "ClamAV Ruby bindings"
|
29
|
+
gemspec.homepage = "http://github.com/eagleas/clamav"
|
30
|
+
gemspec.rubyforge_project = 'clamav'
|
29
31
|
gemspec.description = <<-EOF
|
30
|
-
ClamAV Ruby
|
31
|
-
http://raa.ruby-lang.org/project/clamavr/
|
32
|
-
Thanks to MoonWoolf <moonwolf@moonwolf.com>
|
32
|
+
ClamAV Ruby bindings.
|
33
33
|
EOF
|
34
|
-
gemspec.files = %w( rakefile README ChangeLog ) +
|
34
|
+
gemspec.files = %w( rakefile README.rdoc ChangeLog ) +
|
35
35
|
Dir.glob( 'lib/*.rb' ) +
|
36
36
|
Dir.glob( 'spec/*.rb' ) +
|
37
37
|
Dir.glob( 'spec/unit/*.rb' ) +
|
38
|
-
Dir.glob( '
|
38
|
+
Dir.glob( 'spec/clamav-testfiles/*' ) +
|
39
|
+
Dir.glob( 'ext/**/*.{c,rb,h}' ) +
|
39
40
|
Dir.glob( 'tools/*.rb' )
|
40
|
-
gemspec.autorequire = 'clamav'
|
41
41
|
gemspec.require_path = 'lib'
|
42
|
+
gemspec.has_rdoc = 'false'
|
42
43
|
# gemspec.add_dependency('builder')
|
43
44
|
|
44
45
|
if RUBY_PLATFORM.match("win32")
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/*
|
2
|
+
* jQuery Tooltip plugin 1.3
|
3
|
+
*
|
4
|
+
* http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/
|
5
|
+
* http://docs.jquery.com/Plugins/Tooltip
|
6
|
+
*
|
7
|
+
* Copyright (c) 2006 - 2008 Jörn Zaefferer
|
8
|
+
*
|
9
|
+
* $Id: jquery.tooltip.js 5741 2008-06-21 15:22:16Z joern.zaefferer $
|
10
|
+
*
|
11
|
+
* Dual licensed under the MIT and GPL licenses:
|
12
|
+
* http://www.opensource.org/licenses/mit-license.php
|
13
|
+
* http://www.gnu.org/licenses/gpl.html
|
14
|
+
*/
|
15
|
+
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}(';(8($){j e={},9,m,B,A=$.2u.2g&&/29\\s(5\\.5|6\\.)/.1M(1H.2t),M=12;$.k={w:12,1h:{Z:25,r:12,1d:19,X:"",G:15,E:15,16:"k"},2s:8(){$.k.w=!$.k.w}};$.N.1v({k:8(a){a=$.1v({},$.k.1h,a);1q(a);g 2.F(8(){$.1j(2,"k",a);2.11=e.3.n("1g");2.13=2.m;$(2).24("m");2.22=""}).21(1e).1U(q).1S(q)},H:A?8(){g 2.F(8(){j b=$(2).n(\'Y\');4(b.1J(/^o\\(["\']?(.*\\.1I)["\']?\\)$/i)){b=1F.$1;$(2).n({\'Y\':\'1D\',\'1B\':"2r:2q.2m.2l(2j=19, 2i=2h, 1p=\'"+b+"\')"}).F(8(){j a=$(2).n(\'1o\');4(a!=\'2f\'&&a!=\'1u\')$(2).n(\'1o\',\'1u\')})}})}:8(){g 2},1l:A?8(){g 2.F(8(){$(2).n({\'1B\':\'\',Y:\'\'})})}:8(){g 2},1x:8(){g 2.F(8(){$(2)[$(2).D()?"l":"q"]()})},o:8(){g 2.1k(\'28\')||2.1k(\'1p\')}});8 1q(a){4(e.3)g;e.3=$(\'<t 16="\'+a.16+\'"><10></10><t 1i="f"></t><t 1i="o"></t></t>\').27(K.f).q();4($.N.L)e.3.L();e.m=$(\'10\',e.3);e.f=$(\'t.f\',e.3);e.o=$(\'t.o\',e.3)}8 7(a){g $.1j(a,"k")}8 1f(a){4(7(2).Z)B=26(l,7(2).Z);p l();M=!!7(2).M;$(K.f).23(\'W\',u);u(a)}8 1e(){4($.k.w||2==9||(!2.13&&!7(2).U))g;9=2;m=2.13;4(7(2).U){e.m.q();j a=7(2).U.1Z(2);4(a.1Y||a.1V){e.f.1c().T(a)}p{e.f.D(a)}e.f.l()}p 4(7(2).18){j b=m.1T(7(2).18);e.m.D(b.1R()).l();e.f.1c();1Q(j i=0,R;(R=b[i]);i++){4(i>0)e.f.T("<1P/>");e.f.T(R)}e.f.1x()}p{e.m.D(m).l();e.f.q()}4(7(2).1d&&$(2).o())e.o.D($(2).o().1O(\'1N://\',\'\')).l();p e.o.q();e.3.P(7(2).X);4(7(2).H)e.3.H();1f.1L(2,1K)}8 l(){B=S;4((!A||!$.N.L)&&7(9).r){4(e.3.I(":17"))e.3.Q().l().O(7(9).r,9.11);p e.3.I(\':1a\')?e.3.O(7(9).r,9.11):e.3.1G(7(9).r)}p{e.3.l()}u()}8 u(c){4($.k.w)g;4(c&&c.1W.1X=="1E"){g}4(!M&&e.3.I(":1a")){$(K.f).1b(\'W\',u)}4(9==S){$(K.f).1b(\'W\',u);g}e.3.V("z-14").V("z-1A");j b=e.3[0].1z;j a=e.3[0].1y;4(c){b=c.2o+7(9).E;a=c.2n+7(9).G;j d=\'1w\';4(7(9).2k){d=$(C).1r()-b;b=\'1w\'}e.3.n({E:b,14:d,G:a})}j v=z(),h=e.3[0];4(v.x+v.1s<h.1z+h.1n){b-=h.1n+20+7(9).E;e.3.n({E:b+\'1C\'}).P("z-14")}4(v.y+v.1t<h.1y+h.1m){a-=h.1m+20+7(9).G;e.3.n({G:a+\'1C\'}).P("z-1A")}}8 z(){g{x:$(C).2e(),y:$(C).2d(),1s:$(C).1r(),1t:$(C).2p()}}8 q(a){4($.k.w)g;4(B)2c(B);9=S;j b=7(2);8 J(){e.3.V(b.X).q().n("1g","")}4((!A||!$.N.L)&&b.r){4(e.3.I(\':17\'))e.3.Q().O(b.r,0,J);p e.3.Q().2b(b.r,J)}p J();4(7(2).H)e.3.1l()}})(2a);',62,155,'||this|parent|if|||settings|function|current||||||body|return|||var|tooltip|show|title|css|url|else|hide|fade||div|update||blocked|||viewport|IE|tID|window|html|left|each|top|fixPNG|is|complete|document|bgiframe|track|fn|fadeTo|addClass|stop|part|null|append|bodyHandler|removeClass|mousemove|extraClass|backgroundImage|delay|h3|tOpacity|false|tooltipText|right||id|animated|showBody|true|visible|unbind|empty|showURL|save|handle|opacity|defaults|class|data|attr|unfixPNG|offsetHeight|offsetWidth|position|src|createHelper|width|cx|cy|relative|extend|auto|hideWhenEmpty|offsetTop|offsetLeft|bottom|filter|px|none|OPTION|RegExp|fadeIn|navigator|png|match|arguments|apply|test|http|replace|br|for|shift|click|split|mouseout|jquery|target|tagName|nodeType|call||mouseover|alt|bind|removeAttr|200|setTimeout|appendTo|href|MSIE|jQuery|fadeOut|clearTimeout|scrollTop|scrollLeft|absolute|msie|crop|sizingMethod|enabled|positionLeft|AlphaImageLoader|Microsoft|pageY|pageX|height|DXImageTransform|progid|block|userAgent|browser'.split('|'),0,{}))
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
|
Binary file
|
data/spec/unit/clamav_spec.rb
CHANGED
@@ -2,15 +2,7 @@ require File.dirname(__FILE__) + '/../spec_helper'
|
|
2
2
|
|
3
3
|
class ClamAV
|
4
4
|
|
5
|
-
describe "
|
6
|
-
|
7
|
-
before(:each) do
|
8
|
-
@clam = ClamAV.new()
|
9
|
-
end
|
10
|
-
|
11
|
-
it "should be instance of Clamav" do
|
12
|
-
@clam.should be_instance_of(ClamAV)
|
13
|
-
end
|
5
|
+
describe "ClamAV" do
|
14
6
|
|
15
7
|
FILES = {
|
16
8
|
'robots.txt' => CL_CLEAN,
|
@@ -22,19 +14,114 @@ class ClamAV
|
|
22
14
|
'clam.zip' => 'ClamAV-Test-File',
|
23
15
|
'clam-v2.rar' => 'ClamAV-Test-File',
|
24
16
|
'clam-v3.rar' => 'ClamAV-Test-File',
|
25
|
-
'clam-p.rar' =>
|
26
|
-
#
|
27
|
-
# Fixed in 0.94
|
28
|
-
'clam-ph.rar' => 'Encrypted.RAR', # encripted RAR with encrypted both file data and headers
|
17
|
+
'clam-p.rar' => CL_CLEAN, # encripted RAR
|
18
|
+
'clam-ph.rar' => CL_CLEAN, # encripted RAR with encrypted both file data and headers
|
29
19
|
'program.doc' => 'W97M.Class.EB',
|
30
20
|
'Программа.doc' => 'W97M.Class.EB', # filename in UTF-8
|
31
21
|
}
|
32
22
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
23
|
+
FILES_ENCRYPTED = {
|
24
|
+
'clam-p.rar' => 'Encrypted.RAR', # encripted RAR
|
25
|
+
'clam-ph.rar' => 'Encrypted.RAR', # encripted RAR with encrypted both file data and headers
|
26
|
+
}
|
27
|
+
|
28
|
+
describe "with default options" do
|
29
|
+
before(:all) do
|
30
|
+
@clam = ClamAV.new
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should be instance of Clamav" do
|
34
|
+
@clam.should be_instance_of(ClamAV)
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
FILES.each do |file, result|
|
39
|
+
it "should scan #{file} with result #{result.to_s}" do
|
40
|
+
@clam.scanfile(File.join(File.dirname(__FILE__), "../clamav-testfiles/", file)).should == result
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
FILES_ENCRYPTED.each do |file, result|
|
45
|
+
it "should scan encrypted #{file} with result #{result.to_s}" do
|
46
|
+
@clam.scanfile(File.join(File.dirname(__FILE__), "../clamav-testfiles/", file),
|
47
|
+
CL_SCAN_STDOPT | CL_SCAN_BLOCKENCRYPTED).should == result
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should return signatures count" do
|
52
|
+
@clam.signo.should >= 538736 # on 7/04/09
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should not reload db when fresh" do
|
56
|
+
@clam.reload.should == 0
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
describe "with custom options" do
|
62
|
+
|
63
|
+
before(:all) do
|
64
|
+
@clam = ClamAV.new(CL_SCAN_STDOPT | CL_SCAN_BLOCKENCRYPTED)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should scan encrypted file with detect" do
|
68
|
+
@clam.scanfile(File.join(File.dirname(__FILE__), "../clamav-testfiles/",
|
69
|
+
'clam-v3.rar')).should == 'ClamAV-Test-File'
|
37
70
|
end
|
71
|
+
|
72
|
+
it "should scan OLE2 file with not detect" do
|
73
|
+
@clam.scanfile(File.join(File.dirname(__FILE__), "../clamav-testfiles/", 'program.doc'),
|
74
|
+
CL_SCAN_RAW).should == CL_CLEAN
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "with custom db options" do
|
80
|
+
|
81
|
+
before(:all) do
|
82
|
+
@clam = ClamAV.new(CL_SCAN_STDOPT, CL_DB_STDOPT | CL_DB_PUA)
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should detect PUA" do
|
86
|
+
@clam.scanfile(File.join(File.dirname(__FILE__), "../clamav-testfiles/",
|
87
|
+
'jquery.tooltip.pack.js')).should == 'PUA.Script.Packed-2'
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
describe "limits" do
|
94
|
+
before(:each) do
|
95
|
+
@clam = ClamAV.new
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should set limit" do
|
99
|
+
@clam.setlimit(CL_ENGINE_MAX_FILES, 1).should == CL_SUCCESS
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should do not check archive with two files" do
|
103
|
+
@clam.setlimit(CL_ENGINE_MAX_FILES, 1)
|
104
|
+
@clam.scanfile(File.join(File.dirname(__FILE__), "../clamav-testfiles/", 'multi.zip')).
|
105
|
+
should == CL_CLEAN
|
106
|
+
end
|
107
|
+
|
108
|
+
it "should get limit" do
|
109
|
+
@clam.getlimit(CL_ENGINE_MAX_FILES).should == 10000
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should get db time" do
|
113
|
+
Time.at(@clam.getlimit(CL_ENGINE_DB_TIME)).should >= Time.now - 60*60*24 # 1 day
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should get tmpdir == nil" do
|
117
|
+
@clam.getstring(CL_ENGINE_TMPDIR).should be_nil
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should set tmpdir" do
|
121
|
+
@clam.setstring(CL_ENGINE_TMPDIR, '/tmp').should == CL_SUCCESS
|
122
|
+
@clam.getstring(CL_ENGINE_TMPDIR).should == '/tmp'
|
123
|
+
end
|
124
|
+
|
38
125
|
end
|
39
126
|
|
40
127
|
end
|
metadata
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: clamav
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alexander Oryol
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-04-07 00:00:00 +04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
16
|
-
description: ClamAV Ruby
|
16
|
+
description: ClamAV Ruby bindings.
|
17
17
|
email: eagle.alex@gmail.com
|
18
18
|
executables: []
|
19
19
|
|
@@ -23,15 +23,32 @@ extra_rdoc_files: []
|
|
23
23
|
|
24
24
|
files:
|
25
25
|
- rakefile
|
26
|
-
- README
|
26
|
+
- README.rdoc
|
27
27
|
- ChangeLog
|
28
28
|
- spec/spec_helper.rb
|
29
29
|
- spec/unit/clamav_spec.rb
|
30
|
+
- spec/clamav-testfiles/multi.zip
|
31
|
+
- spec/clamav-testfiles/clam.exe.bz2
|
32
|
+
- spec/clamav-testfiles/clam.zip
|
33
|
+
- spec/clamav-testfiles/eicar.com
|
34
|
+
- spec/clamav-testfiles/test.rar
|
35
|
+
- "spec/clamav-testfiles/\xD0\x9F\xD1\x80\xD0\xBE\xD0\xB3\xD1\x80\xD0\xB0\xD0\xBC\xD0\xBC\xD0\xB0.doc"
|
36
|
+
- spec/clamav-testfiles/jquery.tooltip.pack.js
|
37
|
+
- spec/clamav-testfiles/robots.txt
|
38
|
+
- spec/clamav-testfiles/clam-v3.rar
|
39
|
+
- spec/clamav-testfiles/clam.exe
|
40
|
+
- spec/clamav-testfiles/clam-ph.rar
|
41
|
+
- spec/clamav-testfiles/test.txt
|
42
|
+
- spec/clamav-testfiles/clam.cab
|
43
|
+
- spec/clamav-testfiles/clam-v2.rar
|
44
|
+
- spec/clamav-testfiles/program.doc
|
45
|
+
- spec/clamav-testfiles/clam-p.rar
|
30
46
|
- ext/clamav/clamav.c
|
31
47
|
- ext/clamav/extconf.rb
|
48
|
+
- ext/clamav/const.h
|
32
49
|
- tools/rakehelp.rb
|
33
|
-
has_rdoc: false
|
34
|
-
homepage:
|
50
|
+
has_rdoc: "false"
|
51
|
+
homepage: http://github.com/eagleas/clamav
|
35
52
|
post_install_message:
|
36
53
|
rdoc_options: []
|
37
54
|
|
@@ -51,10 +68,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
51
68
|
version:
|
52
69
|
requirements: []
|
53
70
|
|
54
|
-
rubyforge_project:
|
55
|
-
rubygems_version: 1.
|
71
|
+
rubyforge_project: clamav
|
72
|
+
rubygems_version: 1.3.1
|
56
73
|
signing_key:
|
57
74
|
specification_version: 2
|
58
|
-
summary: ClamAV Ruby
|
75
|
+
summary: ClamAV Ruby bindings
|
59
76
|
test_files: []
|
60
77
|
|
data/README
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
ClamAV Ruby binding gem. Based on project clamavr-0.2.0
|
2
|
-
http://raa.ruby-lang.org/project/clamavr/
|
3
|
-
Thanks to MoonWoolf <moonwolf@moonwolf.com>
|
4
|
-
|
5
|
-
== INSTALL
|
6
|
-
|
7
|
-
$ sudo gem install clamav
|
8
|
-
or
|
9
|
-
$ rake package && cd pkg && sudo gem install *.gem
|
10
|
-
|
11
|
-
== REQUIREMENTS
|
12
|
-
|
13
|
-
clamav >= 0.94
|
14
|
-
libclamav5, libclamav-dev
|
15
|
-
|
16
|
-
== USAGE
|
17
|
-
ClamAV.new()
|
18
|
-
return:
|
19
|
-
ClamAV instance
|
20
|
-
|
21
|
-
ClamAV#scanfile(filename, options)
|
22
|
-
filename => filename
|
23
|
-
options => CL_SCAN_STDOPT
|
24
|
-
|
25
|
-
return:
|
26
|
-
virusname or ClamAV returncode(Fixnum)
|
27
|
-
|
28
|
-
== LICENSE
|
29
|
-
GPL
|
30
|
-
|
31
|
-
= Clamav as gem
|
32
|
-
Copyright(c) 2008 Alexander Oryol <eagle.alex@gmail.com>
|
33
|
-
|
34
|
-
= ClamAV/R
|
35
|
-
Copyright(c) 2003-2007 MoonWolf <moonwolf@moonwolf.com>
|