warp-clamav 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -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