warp-clamav 0.3.1

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.
@@ -0,0 +1,6 @@
1
+ *.o
2
+ *.so
3
+ *.log
4
+ nbproject
5
+ pkg
6
+ Makefile
@@ -0,0 +1,18 @@
1
+ ChangeLog
2
+
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
14
+ ----------------------------
15
+ V 0.2.2
16
+ * Update to ClamAV-0.94
17
+ * Add ChangeLog
18
+
@@ -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/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.3.1
@@ -0,0 +1,70 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{clamav}
8
+ s.version = "0.3.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Alexander Oryol"]
12
+ s.date = %q{2009-10-16}
13
+ s.email = %q{eagle.alex@gmail.com}
14
+ s.extensions = ["ext/clamav/extconf.rb"]
15
+ s.extra_rdoc_files = [
16
+ "ChangeLog",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".gitignore",
21
+ "ChangeLog",
22
+ "README.rdoc",
23
+ "VERSION",
24
+ "clamav.gemspec",
25
+ "ext/clamav/clamav.c",
26
+ "ext/clamav/const.h",
27
+ "ext/clamav/extconf.rb",
28
+ "rakefile",
29
+ "spec/clamav-testfiles/clam-p.rar",
30
+ "spec/clamav-testfiles/clam-ph.rar",
31
+ "spec/clamav-testfiles/clam-v2.rar",
32
+ "spec/clamav-testfiles/clam-v3.rar",
33
+ "spec/clamav-testfiles/clam.cab",
34
+ "spec/clamav-testfiles/clam.exe",
35
+ "spec/clamav-testfiles/clam.exe.bz2",
36
+ "spec/clamav-testfiles/clam.zip",
37
+ "spec/clamav-testfiles/eicar.com",
38
+ "spec/clamav-testfiles/jquery.tooltip.pack.js",
39
+ "spec/clamav-testfiles/multi.zip",
40
+ "spec/clamav-testfiles/program.doc",
41
+ "spec/clamav-testfiles/robots.txt",
42
+ "spec/clamav-testfiles/test.rar",
43
+ "spec/clamav-testfiles/test.txt",
44
+ "spec/clamav-testfiles/\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\260.doc",
45
+ "spec/spec",
46
+ "spec/spec_helper.rb",
47
+ "spec/unit/clamav_spec.rb",
48
+ "tools/rakehelp.rb"
49
+ ]
50
+ s.homepage = %q{http://github.com/eagleas/clamav}
51
+ s.rdoc_options = ["--charset=UTF-8"]
52
+ s.require_paths = ["lib"]
53
+ s.rubyforge_project = %q{clamav}
54
+ s.rubygems_version = %q{1.3.5}
55
+ s.summary = %q{ClamAV Ruby bindings}
56
+ s.test_files = [
57
+ "spec/spec_helper.rb",
58
+ "spec/unit/clamav_spec.rb"
59
+ ]
60
+
61
+ if s.respond_to? :specification_version then
62
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
63
+ s.specification_version = 3
64
+
65
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
66
+ else
67
+ end
68
+ else
69
+ end
70
+ end
@@ -0,0 +1,207 @@
1
+ #include <clamav.h>
2
+ #include <ruby.h>
3
+
4
+ static VALUE cClamAV;
5
+
6
+ struct ClamAV_R {
7
+ struct cl_engine *root;
8
+ int options;
9
+ int db_options;
10
+ struct cl_stat dbstat;
11
+ unsigned int signo;
12
+ };
13
+
14
+ static void clamavr_free(struct ClamAV_R *ptr) {
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
+ }
20
+ xfree(ptr);
21
+ }
22
+
23
+ static VALUE clamavr_new(argc, argv, klass)
24
+ int argc;
25
+ VALUE *argv;
26
+ VALUE klass;
27
+ {
28
+ const char *v_fname;
29
+ VALUE v_options;
30
+ VALUE 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
+
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;
53
+
54
+ ptr->signo = 0;
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));
62
+ }
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
+ }
71
+ return Data_Wrap_Struct(klass, 0, clamavr_free, ptr);
72
+ }
73
+
74
+ static VALUE clamavr_initialize(VALUE self) {
75
+ return self;
76
+ }
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
+
139
+ static VALUE clamavr_signo(VALUE self) {
140
+ struct ClamAV_R *ptr;
141
+ Data_Get_Struct(self, struct ClamAV_R, ptr);
142
+ return UINT2NUM(ptr->signo);
143
+ }
144
+
145
+ static VALUE clamavr_scanfile(argc, argv, klass)
146
+ int argc;
147
+ VALUE *argv;
148
+ VALUE klass;
149
+ {
150
+ struct ClamAV_R *ptr;
151
+ Data_Get_Struct(klass, struct ClamAV_R, ptr);
152
+
153
+ const char *v_fname;
154
+ VALUE 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
+ }
159
+
160
+ Check_Type(v_fname, T_STRING);
161
+ Check_Type(v_options, T_FIXNUM);
162
+
163
+ int ret;
164
+ const char *virname;
165
+
166
+ ret = cl_scanfile(RSTRING(v_fname)->ptr, &virname, NULL, ptr->root, FIX2INT(v_options));
167
+ if (ret == CL_VIRUS) {
168
+ return rb_str_new2(virname);
169
+ } else {
170
+ return INT2FIX(ret);
171
+ }
172
+ }
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
+
194
+ void Init_clamav() {
195
+ cClamAV = rb_define_class("ClamAV", rb_cObject);
196
+ rb_define_singleton_method(cClamAV, "new", clamavr_new, -1);
197
+ rb_define_method(cClamAV, "initialize", clamavr_initialize, 0);
198
+ rb_define_method(cClamAV, "scanfile", clamavr_scanfile, -1);
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);
205
+
206
+ #include <const.h>
207
+ }
@@ -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
+
@@ -0,0 +1,9 @@
1
+ #!/usr/local/bin/ruby -Ks
2
+
3
+ require "mkmf"
4
+
5
+ dir_config("clamav")
6
+
7
+ if have_header("clamav.h") && have_library('clamav', 'cl_engine_compile')
8
+ create_makefile("clamav")
9
+ end
@@ -0,0 +1,54 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/clean'
4
+ require 'rake/gempackagetask'
5
+ require 'tools/rakehelp'
6
+ require 'spec/rake/spectask'
7
+
8
+ setup_extension('clamav', 'clamav')
9
+
10
+ desc "Compile native extension"
11
+ task :compile => [:clamav]
12
+
13
+ task :default => [:compile, :spec]
14
+
15
+ Spec::Rake::SpecTask.new do |task|
16
+ task.libs << 'spec'
17
+ task.spec_files = Dir.glob( 'spec/**/*_spec.rb' )
18
+ task.verbose = true
19
+ end
20
+
21
+ begin
22
+ require 'jeweler'
23
+ Jeweler::Tasks.new do |gemspec|
24
+ gemspec.name = "warp-clamav"
25
+ gemspec.author = "Alexander Oryol"
26
+ gemspec.email = "eagle.alex@gmail.com"
27
+ gemspec.summary = "ClamAV Ruby bindings"
28
+ gemspec.homepage = "http://github.com/eagleas/clamav"
29
+ gemspec.rubyforge_project = 'clamav'
30
+ gemspec.require_path = 'lib'
31
+
32
+ if RUBY_PLATFORM.match("win32")
33
+ gemspec.platform = Gem::Platform::WIN32
34
+ else
35
+ gemspec.platform = Gem::Platform::RUBY
36
+ gemspec.extensions = Dir.glob( 'ext/**/extconf.rb' )
37
+ end
38
+ end
39
+ Jeweler::GemcutterTasks.new
40
+ rescue LoadError
41
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
42
+ end
43
+
44
+ task :package => [:clean, :compile, :spec]
45
+
46
+ setup_clean ["ext/clamav/*.{so,o}", "ext/clamav/Makefile", "lib/clamav.so", "pkg", "*.gem"]
47
+
48
+ task :install => [:default, :package] do
49
+ sh %{ sudo gem install pkg/clamav-#{GEM_VERSION}.gem }
50
+ end
51
+
52
+ task :uninstall do
53
+ sh %{ sudo gem uninstall clamav }
54
+ end
@@ -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,{}))
@@ -0,0 +1,2 @@
1
+ User-agent: *
2
+ Disallow:
@@ -0,0 +1 @@
1
+ X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require 'spec'
4
+ exit ::Spec::Runner::CommandLine.run(::Spec::Runner::OptionParser.parse(ARGV, STDERR, STDOUT))
@@ -0,0 +1,4 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'spec'
4
+ require File.dirname(__FILE__) + '/../lib/clamav'
@@ -0,0 +1,128 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ class ClamAV
4
+
5
+ describe "ClamAV" do
6
+
7
+ FILES = {
8
+ 'robots.txt' => CL_CLEAN,
9
+ 'eicar.com' => 'Eicar-Test-Signature', # EICAR
10
+ 'test.txt' => 'Eicar-Test-Signature', # EICAR in text/plain
11
+ 'clam.cab' => 'ClamAV-Test-File',
12
+ 'clam.exe' => 'ClamAV-Test-File',
13
+ 'clam.exe.bz2' => 'ClamAV-Test-File',
14
+ 'clam.zip' => 'ClamAV-Test-File',
15
+ 'clam-v2.rar' => 'ClamAV-Test-File',
16
+ 'clam-v3.rar' => 'ClamAV-Test-File',
17
+ 'clam-p.rar' => CL_CLEAN, # encripted RAR
18
+ 'clam-ph.rar' => CL_CLEAN, # encripted RAR with encrypted both file data and headers
19
+ 'program.doc' => 'W97M.Class.EB',
20
+ 'Программа.doc' => 'W97M.Class.EB', # filename in UTF-8
21
+ }
22
+
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'
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
+
125
+ end
126
+
127
+ end
128
+ end
@@ -0,0 +1,117 @@
1
+ def make(makedir)
2
+ Dir.chdir(makedir) do
3
+ sh(PLATFORM =~ /win32/ ? 'nmake' : 'make')
4
+ end
5
+ end
6
+
7
+
8
+ def extconf(dir)
9
+ Dir.chdir(dir) do ruby "extconf.rb" end
10
+ end
11
+
12
+
13
+ def setup_tests
14
+ Rake::TestTask.new do |t|
15
+ t.libs << "test"
16
+ t.test_files = FileList['test/test*.rb']
17
+ t.verbose = true
18
+ end
19
+ end
20
+
21
+
22
+ def setup_clean otherfiles
23
+ files = ['build/*', '**/*.o', '**/*.so', '**/*.a', 'lib/*-*', '**/*.log'] + otherfiles
24
+ CLEAN.include(files)
25
+ end
26
+
27
+
28
+ def setup_rdoc files
29
+ Rake::RDocTask.new do |rdoc|
30
+ rdoc.rdoc_dir = 'doc/rdoc'
31
+ rdoc.options << '--line-numbers'
32
+ rdoc.rdoc_files.add(files)
33
+ end
34
+ end
35
+
36
+
37
+ def setup_extension(dir, extension)
38
+ ext = "ext/#{dir}"
39
+ ext_so = "#{ext}/#{extension}.#{Config::CONFIG['DLEXT']}"
40
+ ext_files = FileList[
41
+ "#{ext}/*.cpp",
42
+ "#{ext}/*.h",
43
+ "#{ext}/extconf.rb",
44
+ "#{ext}/Makefile",
45
+ "lib"
46
+ ]
47
+
48
+ task "lib" do
49
+ directory "lib"
50
+ end
51
+
52
+ desc "Builds just the #{extension} extension"
53
+ task extension.to_sym => ["#{ext}/Makefile", ext_so ]
54
+
55
+ file "#{ext}/Makefile" => ["#{ext}/extconf.rb"] do
56
+ extconf "#{ext}"
57
+ end
58
+
59
+ file ext_so => ext_files do
60
+ make "#{ext}"
61
+ cp ext_so, "lib"
62
+ end
63
+ end
64
+
65
+
66
+ def base_gem_spec(pkg_name, pkg_version)
67
+ rm_rf "test/coverage"
68
+ pkg_version = pkg_version
69
+ pkg_name = pkg_name
70
+ pkg_file_name = "#{pkg_name}-#{pkg_version}"
71
+ Gem::Specification.new do |s|
72
+ s.name = pkg_name
73
+ s.version = pkg_version
74
+ s.platform = Gem::Platform::RUBY
75
+ s.has_rdoc = true
76
+ s.extra_rdoc_files = [ "README" ]
77
+
78
+ s.files = %w(COPYING LICENSE README Rakefile) +
79
+ Dir.glob("{bin,doc/rdoc,test}/**/*") +
80
+ Dir.glob("ext/**/*.{h,cpp,rb,rl}") +
81
+ Dir.glob("{examples,tools,lib}/**/*.rb")
82
+
83
+ s.require_path = "lib"
84
+ s.extensions = FileList["ext/**/extconf.rb"].to_a
85
+ s.bindir = "bin"
86
+ end
87
+ end
88
+
89
+ def setup_gem(pkg_name, pkg_version)
90
+ spec = base_gem_spec(pkg_name, pkg_version)
91
+ yield spec if block_given?
92
+
93
+ Rake::GemPackageTask.new(spec) do |p|
94
+ p.gem_spec = spec
95
+ p.need_tar = true if RUBY_PLATFORM !~ /mswin/
96
+ end
97
+ end
98
+
99
+ def sub_project(project, *targets)
100
+ targets.each do |target|
101
+ Dir.chdir "projects/#{project}" do
102
+ sh %{rake --trace #{target.to_s} }
103
+ end
104
+ end
105
+ end
106
+
107
+ # Conditional require rcov/rcovtask if present
108
+ begin
109
+ require 'rcov/rcovtask'
110
+
111
+ Rcov::RcovTask.new do |t|
112
+ t.test_files = FileList['test/test*.rb']
113
+ t.rcov_opts << "-x /usr"
114
+ t.output_dir = "test/coverage"
115
+ end
116
+ rescue Object
117
+ end
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: warp-clamav
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.3.1
5
+ platform: ruby
6
+ authors:
7
+ - Alexander Oryol
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-16 00:00:00 +08:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: eagle.alex@gmail.com
18
+ executables: []
19
+
20
+ extensions:
21
+ - ext/clamav/extconf.rb
22
+ extra_rdoc_files:
23
+ - ChangeLog
24
+ - README.rdoc
25
+ files:
26
+ - .gitignore
27
+ - ChangeLog
28
+ - README.rdoc
29
+ - VERSION
30
+ - clamav.gemspec
31
+ - ext/clamav/clamav.c
32
+ - ext/clamav/const.h
33
+ - ext/clamav/extconf.rb
34
+ - rakefile
35
+ - spec/clamav-testfiles/clam-p.rar
36
+ - spec/clamav-testfiles/clam-ph.rar
37
+ - spec/clamav-testfiles/clam-v2.rar
38
+ - spec/clamav-testfiles/clam-v3.rar
39
+ - spec/clamav-testfiles/clam.cab
40
+ - spec/clamav-testfiles/clam.exe
41
+ - spec/clamav-testfiles/clam.exe.bz2
42
+ - spec/clamav-testfiles/clam.zip
43
+ - spec/clamav-testfiles/eicar.com
44
+ - spec/clamav-testfiles/jquery.tooltip.pack.js
45
+ - spec/clamav-testfiles/multi.zip
46
+ - spec/clamav-testfiles/program.doc
47
+ - spec/clamav-testfiles/robots.txt
48
+ - spec/clamav-testfiles/test.rar
49
+ - spec/clamav-testfiles/test.txt
50
+ - !binary |
51
+ c3BlYy9jbGFtYXYtdGVzdGZpbGVzL9Cf0YDQvtCz0YDQsNC80LzQsC5kb2M=
52
+
53
+ - spec/spec
54
+ - spec/spec_helper.rb
55
+ - spec/unit/clamav_spec.rb
56
+ - tools/rakehelp.rb
57
+ has_rdoc: true
58
+ homepage: http://github.com/eagleas/clamav
59
+ licenses: []
60
+
61
+ post_install_message:
62
+ rdoc_options:
63
+ - --charset=UTF-8
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: "0"
71
+ version:
72
+ required_rubygems_version: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: "0"
77
+ version:
78
+ requirements: []
79
+
80
+ rubyforge_project: clamav
81
+ rubygems_version: 1.3.5
82
+ signing_key:
83
+ specification_version: 3
84
+ summary: ClamAV Ruby bindings
85
+ test_files:
86
+ - spec/spec_helper.rb
87
+ - spec/unit/clamav_spec.rb