schleuder 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data.tar.gz.sig +0 -0
  2. data/LICENSE +339 -0
  3. data/README +32 -0
  4. data/bin/schleuder +96 -0
  5. data/bin/schleuder-fix-gem-dependencies +30 -0
  6. data/bin/schleuder-init-setup +37 -0
  7. data/bin/schleuder-migrate-v2.1-to-v2.2 +205 -0
  8. data/bin/schleuder-newlist +384 -0
  9. data/contrib/check-expired-keys.rb +59 -0
  10. data/contrib/mutt-schleuder-colors.rc +10 -0
  11. data/contrib/mutt-schleuder-resend.vim +24 -0
  12. data/contrib/smtpserver.rb +76 -0
  13. data/ext/default-list.conf +146 -0
  14. data/ext/default-members.conf +7 -0
  15. data/ext/list.conf.example +14 -0
  16. data/ext/schleuder.conf +62 -0
  17. data/lib/schleuder.rb +49 -0
  18. data/lib/schleuder/archiver.rb +46 -0
  19. data/lib/schleuder/crypt.rb +188 -0
  20. data/lib/schleuder/errors.rb +5 -0
  21. data/lib/schleuder/list.rb +177 -0
  22. data/lib/schleuder/list_config.rb +146 -0
  23. data/lib/schleuder/log/listlogger.rb +56 -0
  24. data/lib/schleuder/log/outputter/emailoutputter.rb +118 -0
  25. data/lib/schleuder/log/outputter/metaemailoutputter.rb +50 -0
  26. data/lib/schleuder/log/schleuderlogger.rb +23 -0
  27. data/lib/schleuder/mail.rb +861 -0
  28. data/lib/schleuder/mailer.rb +26 -0
  29. data/lib/schleuder/member.rb +69 -0
  30. data/lib/schleuder/plugin.rb +54 -0
  31. data/lib/schleuder/processor.rb +363 -0
  32. data/lib/schleuder/schleuder_config.rb +72 -0
  33. data/lib/schleuder/storage.rb +84 -0
  34. data/lib/schleuder/utils.rb +80 -0
  35. data/lib/schleuder/version.rb +3 -0
  36. data/man/schleuder-newlist.8 +191 -0
  37. data/man/schleuder.8 +400 -0
  38. data/plugins/README +20 -0
  39. data/plugins/manage_keys_plugin.rb +113 -0
  40. data/plugins/manage_members_plugin.rb +152 -0
  41. data/plugins/manage_self_plugin.rb +26 -0
  42. data/plugins/resend_plugin.rb +35 -0
  43. data/plugins/version_plugin.rb +12 -0
  44. metadata +178 -0
  45. metadata.gz.sig +2 -0
data/plugins/README ADDED
@@ -0,0 +1,20 @@
1
+ Writing Plugins for Schleuder
2
+ ----------------------------
3
+
4
+ There are a few rules which any Plugin must follow to work (correctly):
5
+
6
+ - Name the file: <your_name>_plugin.rb (use underscores!)
7
+ - Name the class: YourNamePlugin
8
+ - module Schleuder
9
+ - Inherit from Plugin
10
+ - Implement two instance-methods:
11
+ - match(mail)
12
+ Is executed to determine whether process() should be executed. Needs to
13
+ take one argument (a Schleuder::Mail-object) and to return true or false.
14
+ - process(mail)
15
+ Is executed if match() returned true. Manipulate the taken
16
+ Schleuder::Mail-object here.
17
+ - use reply(origmail, your_message) to send a message to the sending
18
+ list-member and prevent normal distribution.
19
+
20
+ For examples see other Plugins.
@@ -0,0 +1,113 @@
1
+ module Schleuder
2
+ class ManageKeysPlugin < Plugin
3
+ def initialize
4
+ @plugin_type = :request
5
+ end
6
+
7
+ def list_keys(mail, value)
8
+ Schleuder.log.debug 'LIST-KEY requested'
9
+ listkeys(mail)
10
+ end
11
+
12
+ def add_key(mail, value)
13
+ Schleuder.log.debug 'ADD-KEY requested'
14
+ addkey(mail, mail.body)
15
+ end
16
+
17
+ def del_key(mail, value)
18
+ Schleuder.log.debug 'DEL-KEY requested'
19
+ # TODO: implement callback to sender with Hash to prevent replay
20
+ # attacks.
21
+ # Split at slash to work around some people's habit to include the
22
+ # bitlength and key-type ("2048R/DEADBEEF"). If there's no slash this
23
+ # won't do no harm. We need to force the string'iness to avoid nil's,
24
+ # though.
25
+ val = value.split('/').last.to_s
26
+ msg = "The DEL-KEY-keyword is deprecated and will be removed some day in the future. Please use DELETE-KEY instead.".fmt
27
+ msg << delkey(mail, val)
28
+ msg
29
+ end
30
+
31
+ def delete_key(mail, value)
32
+ Schleuder.log.debug 'DELETE-KEY requested'
33
+ delkey(mail, value.split('/').last)
34
+ end
35
+
36
+ def send_key(mail, value)
37
+ Schleuder.log.debug 'SEND-KEY requested'
38
+ val = value.split('/').last
39
+ msg = "The SEND-KEY-keyword is deprecated and will be removed some day in the future. Please use GET-KEY instead.".fmt
40
+ msg << getkey(mail, val)
41
+ msg
42
+ end
43
+
44
+ def get_key(mail, value)
45
+ Schleuder.log.debug 'GET-KEY requested'
46
+ val = value.split('/').last
47
+ getkey(mail, val)
48
+ end
49
+
50
+ private
51
+
52
+ def listkeys(mail)
53
+ m = ""
54
+ mail.crypt.list_keys.each do |k|
55
+ if not (trust = [:revoked, :expired, :disabled, :invalid].grep(k.trust)).empty?
56
+ m << "*Warning*: Key is #{trust.join(' and ')}!\n"
57
+ end
58
+ m << "#{k.to_s}"
59
+ if (exp = k.subkeys.first.expires) > Time.utc(1971, 1, 1, 1)
60
+ if exp < Time.now
61
+ m << "Expired at #{exp}.\n"
62
+ else
63
+ m << "Expires at #{exp}.\n"
64
+ end
65
+ end
66
+ m << "\n"
67
+ end
68
+ m
69
+ end
70
+
71
+ def addkey(mail, key)
72
+ m = ""
73
+ res = mail.crypt.add_key(key)
74
+ res.imports.each do |i|
75
+ if i.status == 1
76
+ action = "imported"
77
+ else
78
+ action = "not imported"
79
+ end
80
+ m << "#{mail.crypt.get_key(i.fpr).to_s}\n--> #{action}\n\n"
81
+ end
82
+ m << "\nImportResult.inspect:\n=> #{res.inspect}"
83
+ m
84
+ end
85
+
86
+ def delkey(mail, req)
87
+ unless (key = mail.crypt.get_key(req)).first
88
+ msg = "Failed to lookup key (#{req}) that should be deleted. Reason: #{key[1].capitalize}."
89
+ Schleuder.log.debug msg
90
+ return "--> #{msg}\n\n"
91
+ end
92
+ Schleuder.log.debug "Key to be deleted: #{key.inspect}"
93
+ res = mail.crypt.delete_key(key.first)
94
+ if res == true
95
+ action = "Key deleted."
96
+ else
97
+ action = "Key not deleted.\nException: #{res.to_s}"
98
+ end
99
+ "#{key.to_s}\n--> #{action}\n\n"
100
+ end
101
+
102
+ def getkey(mail, req)
103
+ keyblock = mail.crypt.export(req)
104
+ if keyblock.empty?
105
+ "#{req}\n\n--> No matching key present.\n"
106
+ else
107
+ "#{mail.crypt.list_keys(req).to_s.gsub(/^pub /, "\npub ")}\n\n#{keyblock}\n"
108
+ end
109
+ end
110
+
111
+ end
112
+ end
113
+
@@ -0,0 +1,152 @@
1
+ module Schleuder
2
+ class ManageMembersPlugin < Plugin
3
+ def initialize
4
+ @plugin_type = :request
5
+ end
6
+
7
+ def get_members(mail, value)
8
+ # TODO: deprecation-notice
9
+ Schleuder.log.debug 'GET-MEMBERS requested'
10
+ get_membersfile
11
+ end
12
+
13
+ def save_members(mail, value)
14
+ # TODO: deprecation-notice
15
+ Schleuder.log.debug 'SAVE-MEMBERS requested'
16
+ if mail.body.strip.empty?
17
+ "Error, empty input. You need to write the members list yaml-formatted into the body."
18
+ else
19
+ Schleuder.list.members = YAML.load(mail.body)
20
+ "Saving was successful.\n\nCurrent members.conf:\n\n#{get_membersfile}\n"
21
+ end
22
+ end
23
+
24
+ def add_member(mail, value)
25
+ Schleuder.log.debug 'ADD-MEMBER requested'
26
+ addmember(mail, value, mail.body)
27
+ end
28
+
29
+ def delete_member(mail, value)
30
+ Schleuder.log.debug 'DELETE-MEMBER requested'
31
+ deletemember(mail, value)
32
+ end
33
+
34
+ def list_members(mail, value)
35
+ Schleuder.log.debug 'LIST-MEMBERS requested'
36
+ listmembers(mail)
37
+ end
38
+
39
+ def get_member(mail, value)
40
+ Schleuder.log.debug 'GET-MEMBER requested'
41
+ getmember(mail, value)
42
+ end
43
+
44
+ def listmembers(mail)
45
+ msg = ''
46
+ msg << "Default mime-setting for this list: #{Schleuder.list.config.default_mime.downcase}.\n"
47
+ msg << "\nAdmins for this list:\n\n#{_list_members(Schleuder.list.config.admins)}"
48
+ msg << "\n\nMembers:\n\n#{_list_members(Schleuder.list.members)}"
49
+ msg
50
+ end
51
+
52
+ def _list_members(members)
53
+ members.collect { |member|
54
+ res = member.email.dup
55
+ res << " (mime: #{member.mime.downcase})" if member.mime && !member.mime.downcase.eql?(Schleuder.list.config.default_mime.downcase)
56
+ res << " :: #{_list_keys(member)}\n\n"
57
+ }.join('')
58
+ end
59
+
60
+ def _list_keys(member)
61
+ result = ''
62
+ key, msg = member.key(false) # also get a potentially expired key -> will
63
+ # also inform about multiple keys on the list
64
+ # that might not me the case otherwise
65
+ if key
66
+ if key.trust.eql?(:expired)
67
+ result << "*Warning*: Key expired! "
68
+ elsif key.trust.eql?(:revoked)
69
+ result << "*Warning*: Key revoked! "
70
+ end
71
+ result << member.key_descr
72
+ else
73
+ result << "*Warning*: #{msg}"
74
+ end
75
+ result
76
+ end
77
+
78
+ def addmember(mail, string, key)
79
+ email, mime = string.split(' ')
80
+ mem = Member.new({:email => email})
81
+ mem.mime = mime if mime
82
+ # TODO: test if address already subscribed
83
+ Schleuder.list.members = Schleuder.list.members << mem
84
+ msg = "#{mem}\n--> Member saved.\n\n"
85
+ if key
86
+ mail.crypt.add_key(key).imports.each do |i|
87
+ msg << "#{mail.crypt.key_descr(mail.crypt.get_key(i.fpr))}\n"
88
+ if i.status.eql? 1
89
+ msg << "--> Key imported.\n\n"
90
+ else
91
+ msg << "--> Key *not* imported (no error, maybe already present?).\n\n"
92
+ end
93
+ end
94
+ msg << "\n"
95
+ end
96
+ msg << "Updated members-list:\n\n#{_list_members(mail)}"
97
+ msg
98
+ end
99
+
100
+ def deletemember(mail, string)
101
+ msg = ''
102
+ members = Schleuder.list.members.dup
103
+ members.delete_if {|mem| mem.email.eql?(string)}
104
+ if members.eql? Schleuder.list.members
105
+ msg << "Member #{string} not found"
106
+ else
107
+ if Schleuder.list.members = members
108
+ msg << "Member #{string} deleted.\n"
109
+ else
110
+ msg = "Something failed. Please ask the maintainer of this list to figure out what\nhappened (e.g. by mailing to #{Schleuder.list.owner_addr}).\n"
111
+ end
112
+ end
113
+ msg << "\nUpdated members-list:\n\n#{_list_members(mail)}\n"
114
+ msg
115
+ end
116
+
117
+ def getmember(mail, string)
118
+ Schleuder.log.debug "string: #{string.inspect}"
119
+ msg = ''
120
+ member = Schleuder.list.find_member_by_email string
121
+ unless member
122
+ return "Member #{string} not found.\n"
123
+ end
124
+ msg << "Email: #{member.email}\nMime: "
125
+ if member.mime
126
+ msg << member.mime.downcase
127
+ else
128
+ msg << "#{Schleuder.list.config.default_mime.downcase} (list-default)"
129
+ end
130
+ msg << "\n\n"
131
+ keys = mail.crypt.list_keys(member.email)
132
+ if keys.empty?
133
+ msg << "*Warning*: No key!\n\n"
134
+ else
135
+ if keys.size > 1
136
+ msg << "*Warning*: Multiple keys!\n\n"
137
+ end
138
+ msg << "Key(s):\n\n"
139
+ keys.each do |key|
140
+ msg << "#{key.to_s}Fingerprint: #{key.subkeys.first.fpr}\n\n"
141
+ end
142
+ end
143
+ msg
144
+ end
145
+
146
+ private
147
+ def get_membersfile
148
+ File.read(Schleuder.list.members_file)
149
+ end
150
+ end
151
+ end
152
+
@@ -0,0 +1,26 @@
1
+ module Schleuder
2
+ class ManageSelfPlugin < Plugin
3
+ def initialize
4
+ @plugin_type = :request
5
+ end
6
+
7
+ def unsubscribe(mail, foo)
8
+ Schleuder.log.debug 'UNSUBSCRIBE requested'
9
+ msg = ''
10
+
11
+ key = Plugin.signing_key(mail)
12
+ member = Schleuder.list.find_member_by_key(key) || Schleuder.list.find_admin_by_key(key)
13
+
14
+ members = Schleuder.list.members.dup
15
+ members.delete_if {|mem| mem.email.eql?(member.email)}
16
+
17
+ if Schleuder.list.members = members
18
+ msg << "Your address #{member.email} hast been unsubscribed.\n"
19
+ else
20
+ msg = "Something failed. Please ask the maintainer of this list to figure out what\nhappened (e.g. by mailing to #{Schleuder.list.owner_addr}).\n"
21
+ end
22
+ msg
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,35 @@
1
+ module Schleuder
2
+ class ResendPlugin < Plugin
3
+ def initialize
4
+ @plugin_type = :list
5
+ end
6
+
7
+ def resend(mail, value)
8
+ store_address(mail, value, false)
9
+ end
10
+
11
+ def resend_encrypted_only(mail, value)
12
+ store_address(mail, value, true)
13
+ end
14
+
15
+ def store_address(mail, value, encrypted_only)
16
+ if mail.to.to_a.include? Schleuder.list.request_addr
17
+ msg = "The resend-command may only be used in message sent over the list, not messages sent to the request-address."
18
+ Schleuder.log.warn msg
19
+ return msg.fmt
20
+ end
21
+ if Utils.emailaddress? value
22
+ m = Member.new({'email' => value})
23
+ if encrypted_only
24
+ m.encrypted_only = true
25
+ end
26
+ mail.resend_to << m
27
+ else
28
+ Schleuder.log.warn "Skipping invalid email address given with resend-keyword: #{value}"
29
+ mail.metadata[:error] << "Invalid address given: '#{value}'."
30
+ end
31
+ mail
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,12 @@
1
+ module Schleuder
2
+ class VersionPlugin < Plugin
3
+ def initialize
4
+ @plugin_type = :request
5
+ end
6
+
7
+ def get_version(mail, value)
8
+ require 'schleuder/version'
9
+ "This list runs on schleuder v#{Schleuder::VERSION}.\n\nFor documentation see <http://schleuder.nadir.org/documentation.html>"
10
+ end
11
+ end
12
+ end
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: schleuder
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.2.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - paz
9
+ - ng
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain:
13
+ - !binary |-
14
+ LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUROakNDQWg2Z0F3SUJB
15
+ Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREJCTVJNd0VRWURWUVFEREFwelky
16
+ aHMKWlhWa1pYSXlNUlV3RXdZS0NaSW1pWlB5TEdRQkdSWUZibUZrYVhJeEV6
17
+ QVJCZ29Ka2lhSmsvSXNaQUVaRmdOdgpjbWN3SGhjTk1USXdOakEyTVRreE5E
18
+ STBXaGNOTVRNd05qQTJNVGt4TkRJMFdqQkJNUk13RVFZRFZRUUREQXB6Clky
19
+ aHNaWFZrWlhJeU1SVXdFd1lLQ1pJbWlaUHlMR1FCR1JZRmJtRmthWEl4RXpB
20
+ UkJnb0praWFKay9Jc1pBRVoKRmdOdmNtY3dnZ0VpTUEwR0NTcUdTSWIzRFFF
21
+ QkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDaEdydW9ObnEzSXI3ZApGZCtrdEcw
22
+ dE1abG0yWlNPa3VITzVRUnJnWUxnYkJocFRFZjhpNkFqem9WTDBBSUMrdU1N
23
+ Vlk5aUU2ZnphS1VECkI3U3ZOdGNjSHNrWDZ6SFVWVnRTcUY5VnBiUW9tV3Bj
24
+ azBpQnF3UUl3NHZFTGUyaVorL1pVTEtJSkkvQlk0M3kKdFg3T3JhOGl6U3lQ
25
+ R2N1NkUxZnI1UEpJNmlnRm5sRWdzL2pDalAvSllIZi9mNDlmbkl6QUpnTzBR
26
+ N1lOTkpWcgpSMFpxbTFIYllFMnQrUnRvbVQyamdDakJ0RjQyaFg4K2dCNHlW
27
+ NW5lZGZIS3laZkQ2emQ3ZG9QRS9wZHRwbjgwCkJyUlFiSFhsRVBEQ2FkSEgw
28
+ MTNqN29MN0I1ZkpsSGVqWDZQRmZQdGVwcTNhZERRL08zbEZ2emZIdUpVR2pF
29
+ TzUKUVhwN2w1K2ZBZ01CQUFHak9UQTNNQWtHQTFVZEV3UUNNQUF3SFFZRFZS
30
+ ME9CQllFRklHMUc1UHhBMWxOL0JVWQprb212bHRzT1dDVGVNQXNHQTFVZER3
31
+ UUVBd0lFc0RBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQWtrTDRWWVhPCmlI
32
+ YzQ5bHFrMU9FL2IzWFZYWGdiQlZ1aHhvTkpYZC9oSjRlTmVxbVpydWMrZDlX
33
+ bEJIYTlVVFRGZ3JmUkxOcmsKSkRaSnc5Y3E5NmI0TmxsaG54Q2xpZ21SZXQ0
34
+ RkpmYWVtYS9naTZZN0lWRmZMUG5nVVhDUGN1SUNGOXBKd05HcwpLSUVndEE1
35
+ TmNVMitJZFpLekowRnBoV3pIRlRpVytMd1Uyb0lTTEhwTXhXZVhZSXNLTW9x
36
+ MjM4U3k3Y1l3emQ3CnZhZEhrZHMzNTRsbU4vajNhYW1kTXJyeHUyOTlvdTh1
37
+ am9IbGcxK3IxNjlsa2J1VHdXbEI2RlVXT1J3emhvMWIKOFlJWWRpT29jUHdm
38
+ Zi9BZ3l3UVdGZDRGV2VNV0xQeXRkK1VndzZCSmZSSXY2VC9OTVJKWWRIUDJW
39
+ M1RTUVJyTApSYXNUTTVlUzIrK3EwQT09Ci0tLS0tRU5EIENFUlRJRklDQVRF
40
+ LS0tLS0K
41
+ date: 2012-06-06 00:00:00.000000000 Z
42
+ dependencies:
43
+ - !ruby/object:Gem::Dependency
44
+ name: gpgme
45
+ requirement: &9959680 !ruby/object:Gem::Requirement
46
+ none: false
47
+ requirements:
48
+ - - =
49
+ - !ruby/object:Gem::Version
50
+ version: 1.0.8
51
+ type: :runtime
52
+ prerelease: false
53
+ version_requirements: *9959680
54
+ - !ruby/object:Gem::Dependency
55
+ name: highline
56
+ requirement: &9957020 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: 1.6.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: *9957020
65
+ - !ruby/object:Gem::Dependency
66
+ name: log4r
67
+ requirement: &9955820 !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ! '>='
71
+ - !ruby/object:Gem::Version
72
+ version: 1.1.9
73
+ type: :runtime
74
+ prerelease: false
75
+ version_requirements: *9955820
76
+ - !ruby/object:Gem::Dependency
77
+ name: ruby-filemagic
78
+ requirement: &10014620 !ruby/object:Gem::Requirement
79
+ none: false
80
+ requirements:
81
+ - - ! '>='
82
+ - !ruby/object:Gem::Version
83
+ version: 0.4.2
84
+ type: :runtime
85
+ prerelease: false
86
+ version_requirements: *10014620
87
+ description: ! 'Schleuder is designed as a tool for group communication: subscribers
88
+ can communicate encrypted (and pseudonymously) among themselves, receive emails
89
+ from non-subscribers and send emails to non-subscribers via the list.
90
+
91
+
92
+ Schleuder takes care of all decryption and encryption, stripping of headers, formatting
93
+ conversions, etc. Schleuder can also send out its own public key upon request and
94
+ process administrative commands by email.'
95
+ email: schleuder2@nadir.org
96
+ executables:
97
+ - schleuder
98
+ - schleuder-newlist
99
+ - schleuder-fix-gem-dependencies
100
+ - schleuder-init-setup
101
+ - schleuder-migrate-v2.1-to-v2.2
102
+ extensions: []
103
+ extra_rdoc_files: []
104
+ files:
105
+ - contrib/check-expired-keys.rb
106
+ - contrib/mutt-schleuder-colors.rc
107
+ - contrib/mutt-schleuder-resend.vim
108
+ - contrib/smtpserver.rb
109
+ - ext/default-list.conf
110
+ - ext/default-members.conf
111
+ - ext/list.conf.example
112
+ - ext/schleuder.conf
113
+ - lib/schleuder.rb
114
+ - lib/schleuder/archiver.rb
115
+ - lib/schleuder/crypt.rb
116
+ - lib/schleuder/errors.rb
117
+ - lib/schleuder/list.rb
118
+ - lib/schleuder/list_config.rb
119
+ - lib/schleuder/log/listlogger.rb
120
+ - lib/schleuder/log/outputter/emailoutputter.rb
121
+ - lib/schleuder/log/outputter/metaemailoutputter.rb
122
+ - lib/schleuder/log/schleuderlogger.rb
123
+ - lib/schleuder/mail.rb
124
+ - lib/schleuder/mailer.rb
125
+ - lib/schleuder/member.rb
126
+ - lib/schleuder/plugin.rb
127
+ - lib/schleuder/processor.rb
128
+ - lib/schleuder/schleuder_config.rb
129
+ - lib/schleuder/storage.rb
130
+ - lib/schleuder/utils.rb
131
+ - lib/schleuder/version.rb
132
+ - plugins/README
133
+ - plugins/manage_keys_plugin.rb
134
+ - plugins/manage_members_plugin.rb
135
+ - plugins/manage_self_plugin.rb
136
+ - plugins/resend_plugin.rb
137
+ - plugins/version_plugin.rb
138
+ - README
139
+ - LICENSE
140
+ - man/schleuder.8
141
+ - man/schleuder-newlist.8
142
+ - !binary |-
143
+ YmluL3NjaGxldWRlcg==
144
+ - !binary |-
145
+ YmluL3NjaGxldWRlci1uZXdsaXN0
146
+ - !binary |-
147
+ YmluL3NjaGxldWRlci1maXgtZ2VtLWRlcGVuZGVuY2llcw==
148
+ - !binary |-
149
+ YmluL3NjaGxldWRlci1pbml0LXNldHVw
150
+ - !binary |-
151
+ YmluL3NjaGxldWRlci1taWdyYXRlLXYyLjEtdG8tdjIuMg==
152
+ homepage: http://schleuder2.nadir.org
153
+ licenses: []
154
+ post_install_message: ! "\n\n Note: There's still one dependency missing, which
155
+ we can't install in\n this run of rubygems. Please execute schleuder-fix-gem-dependencies
156
+ to\n complete the installation!\n\n"
157
+ rdoc_options: []
158
+ require_paths:
159
+ - lib
160
+ required_ruby_version: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ required_rubygems_version: !ruby/object:Gem::Requirement
167
+ none: false
168
+ requirements:
169
+ - - ! '>='
170
+ - !ruby/object:Gem::Version
171
+ version: '0'
172
+ requirements: []
173
+ rubyforge_project: ! '[none]'
174
+ rubygems_version: 1.8.11
175
+ signing_key:
176
+ specification_version: 3
177
+ summary: Schleuder is a gpg-enabled mailinglist with remailer-capabilities.
178
+ test_files: []