##// END OF EJS Templates
Fixed thatinitialize_http_header overrides basic auth in rdm-mailhandler.rb (#13165)....
Jean-Philippe Lang -
r11141:f77edce621c6
parent child
Show More
@@ -1,150 +1,150
1 1 #!/usr/bin/env ruby
2 2
3 3 require 'net/http'
4 4 require 'net/https'
5 5 require 'uri'
6 6 require 'optparse'
7 7
8 8 module Net
9 9 class HTTPS < HTTP
10 10 def self.post_form(url, params, headers, options={})
11 11 request = Post.new(url.path)
12 12 request.form_data = params
13 request.basic_auth url.user, url.password if url.user
14 13 request.initialize_http_header(headers)
14 request.basic_auth url.user, url.password if url.user
15 15 http = new(url.host, url.port)
16 16 http.use_ssl = (url.scheme == 'https')
17 17 if options[:no_check_certificate]
18 18 http.verify_mode = OpenSSL::SSL::VERIFY_NONE
19 19 end
20 20 http.start {|h| h.request(request) }
21 21 end
22 22 end
23 23 end
24 24
25 25 class RedmineMailHandler
26 VERSION = '0.2'
26 VERSION = '0.2.1'
27 27
28 28 attr_accessor :verbose, :issue_attributes, :allow_override, :unknown_user, :no_permission_check, :url, :key, :no_check_certificate
29 29
30 30 def initialize
31 31 self.issue_attributes = {}
32 32
33 33 optparse = OptionParser.new do |opts|
34 34 opts.banner = "Usage: rdm-mailhandler.rb [options] --url=<Redmine URL> --key=<API key>"
35 35 opts.separator("")
36 36 opts.separator("Reads an email from standard input and forward it to a Redmine server through a HTTP request.")
37 37 opts.separator("")
38 38 opts.separator("Required arguments:")
39 39 opts.on("-u", "--url URL", "URL of the Redmine server") {|v| self.url = v}
40 40 opts.on("-k", "--key KEY", "Redmine API key") {|v| self.key = v}
41 41 opts.separator("")
42 42 opts.separator("General options:")
43 43 opts.on("--unknown-user ACTION", "how to handle emails from an unknown user",
44 44 "ACTION can be one of the following values:",
45 45 "* ignore: email is ignored (default)",
46 46 "* accept: accept as anonymous user",
47 47 "* create: create a user account") {|v| self.unknown_user = v}
48 48 opts.on("--no-permission-check", "disable permission checking when receiving",
49 49 "the email") {self.no_permission_check = '1'}
50 50 opts.on("--key-file FILE", "path to a file that contains the Redmine",
51 51 "API key (use this option instead of --key",
52 52 "if you don't the key to appear in the",
53 53 "command line)") {|v| read_key_from_file(v)}
54 54 opts.on("--no-check-certificate", "do not check server certificate") {self.no_check_certificate = true}
55 55 opts.on("-h", "--help", "show this help") {puts opts; exit 1}
56 56 opts.on("-v", "--verbose", "show extra information") {self.verbose = true}
57 57 opts.on("-V", "--version", "show version information and exit") {puts VERSION; exit}
58 58 opts.separator("")
59 59 opts.separator("Issue attributes control options:")
60 60 opts.on("-p", "--project PROJECT", "identifier of the target project") {|v| self.issue_attributes['project'] = v}
61 61 opts.on("-s", "--status STATUS", "name of the target status") {|v| self.issue_attributes['status'] = v}
62 62 opts.on("-t", "--tracker TRACKER", "name of the target tracker") {|v| self.issue_attributes['tracker'] = v}
63 63 opts.on( "--category CATEGORY", "name of the target category") {|v| self.issue_attributes['category'] = v}
64 64 opts.on( "--priority PRIORITY", "name of the target priority") {|v| self.issue_attributes['priority'] = v}
65 65 opts.on("-o", "--allow-override ATTRS", "allow email content to override attributes",
66 66 "specified by previous options",
67 67 "ATTRS is a comma separated list of attributes") {|v| self.allow_override = v}
68 68 opts.separator("")
69 69 opts.separator("Examples:")
70 70 opts.separator("No project specified. Emails MUST contain the 'Project' keyword:")
71 71 opts.separator(" rdm-mailhandler.rb --url http://redmine.domain.foo --key secret")
72 72 opts.separator("")
73 73 opts.separator("Fixed project and default tracker specified, but emails can override")
74 74 opts.separator("both tracker and priority attributes using keywords:")
75 75 opts.separator(" rdm-mailhandler.rb --url https://domain.foo/redmine --key secret \\")
76 76 opts.separator(" --project foo \\")
77 77 opts.separator(" --tracker bug \\")
78 78 opts.separator(" --allow-override tracker,priority")
79 79
80 80 opts.summary_width = 27
81 81 end
82 82 optparse.parse!
83 83
84 84 unless url && key
85 85 puts "Some arguments are missing. Use `rdm-mailhandler.rb --help` for getting help."
86 86 exit 1
87 87 end
88 88 end
89 89
90 90 def submit(email)
91 91 uri = url.gsub(%r{/*$}, '') + '/mail_handler'
92 92
93 93 headers = { 'User-Agent' => "Redmine mail handler/#{VERSION}" }
94 94
95 95 data = { 'key' => key, 'email' => email,
96 96 'allow_override' => allow_override,
97 97 'unknown_user' => unknown_user,
98 98 'no_permission_check' => no_permission_check}
99 99 issue_attributes.each { |attr, value| data["issue[#{attr}]"] = value }
100 100
101 101 debug "Posting to #{uri}..."
102 102 begin
103 103 response = Net::HTTPS.post_form(URI.parse(uri), data, headers, :no_check_certificate => no_check_certificate)
104 104 rescue SystemCallError => e # connection refused, etc.
105 105 warn "An error occured while contacting your Redmine server: #{e.message}"
106 106 return 75 # temporary failure
107 107 end
108 108 debug "Response received: #{response.code}"
109 109
110 110 case response.code.to_i
111 111 when 403
112 112 warn "Request was denied by your Redmine server. " +
113 113 "Make sure that 'WS for incoming emails' is enabled in application settings and that you provided the correct API key."
114 114 return 77
115 115 when 422
116 116 warn "Request was denied by your Redmine server. " +
117 117 "Possible reasons: email is sent from an invalid email address or is missing some information."
118 118 return 77
119 119 when 400..499
120 120 warn "Request was denied by your Redmine server (#{response.code})."
121 121 return 77
122 122 when 500..599
123 123 warn "Failed to contact your Redmine server (#{response.code})."
124 124 return 75
125 125 when 201
126 126 debug "Proccessed successfully"
127 127 return 0
128 128 else
129 129 return 1
130 130 end
131 131 end
132 132
133 133 private
134 134
135 135 def debug(msg)
136 136 puts msg if verbose
137 137 end
138 138
139 139 def read_key_from_file(filename)
140 140 begin
141 141 self.key = File.read(filename).strip
142 142 rescue Exception => e
143 143 $stderr.puts "Unable to read the key from #{filename}:\n#{e.message}"
144 144 exit 1
145 145 end
146 146 end
147 147 end
148 148
149 149 handler = RedmineMailHandler.new
150 150 exit(handler.submit(STDIN.read))
General Comments 0
You need to be logged in to leave comments. Login now