merged cont.
[opensuse:yast-rest-service.git] / webservice / lib / exceptions.rb
1 #--
2 # Webyast Webservice framework
3 #
4 # Copyright (C) 2009, 2010 Novell, Inc. 
5 #   This library is free software; you can redistribute it and/or modify
6 # it only under the terms of version 2.1 of the GNU Lesser General Public
7 # License as published by the Free Software Foundation. 
8 #
9 #   This library is distributed in the hope that it will be useful, but WITHOUT
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 
12 # details. 
13 #
14 #   You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software 
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 #++
18
19 # parent of all rest-service related exception.
20 # Main goal is to provide to_xml method to report it in response.
21 class BackendException < StandardError
22
23   def to_xml(options={})
24     no_arg_to_xml(options,"GENERAL", "Universal error, should be redefined.")
25   end
26
27   protected
28 # protected initialize as this is just abstract class.
29 # message make sense just for logging purpose
30   def initialize(message="BackendException")
31     super message
32   end
33
34   #create xml without arguments, so only error type and description
35   def no_arg_to_xml(options,type,descr)
36     xml = Builder::XmlMarkup.new(options)
37     xml.instruct! unless options[:skip_instruct]
38
39     xml.error do
40       xml.type type
41       xml.description descr
42     end
43
44   end
45
46 end
47
48 # Exception that reports invalid arguments
49 # initialized by constrains which is broken
50 # If uncatched then response 422 and cause fail of ActiveResouce#save
51 class InvalidParameters < ArgumentError
52   # Takes as argument constrains. Constrains is hash where key is parameter
53   # and value is broken constrain
54   # (it is not translated so should be some symbol, which is then on frontend
55   #  readed and reported translated message)
56   #
57   # example::
58   #   raise InvalidParameters.new {
59   #      :email => "MISSING"
60   #   }
61   def initialize (constrains)
62     @constrains = constrains
63     super("Invalid arguments: #{@constrains.inspect}")
64   end
65
66   # Creates standartized xml for ActiveResource validation - http://railsbrain.com/api/rails-2.3.2/doc/index.html?a=C00000626&name=Base
67   # error is reported in format '<humanized argument name> --- <error identificator>
68   def to_xml(options={})
69     xml = Builder::XmlMarkup.new(options)
70     xml.instruct! unless options[:skip_instruct]
71
72     xml.errors do #do not use type = array as it break validation in ActiveResource bnc#587016
73      @constrains.each {
74         |k,v|
75         xml.error "#{k.to_s.humanize} #{v}"
76       }
77     end
78   end
79 end
80
81 class NoPermissionException < BackendException
82   attr_reader :permission, :user
83   
84   def initialize(permission,user)
85     @permission = permission
86     @user = user
87   end
88
89   def to_xml(options={})
90     xml = Builder::XmlMarkup.new(options)
91     xml.instruct! unless options[:skip_instruct]
92
93     xml.error do
94       xml.type "NO_PERM"
95       xml.description "Permission to allow #{@permission} is not available for user #{@user}"
96       xml.permission @permission
97       xml.user @user
98       xml.bug false
99     end
100   end
101 end
102
103 class NotLoggedException < BackendException
104   def initialize()
105     super("No one is logged.")
106   end
107
108   def to_xml(options={})
109     no_arg_to_xml(options,"NOT_LOGGED", "No one is logged to rest service.")
110   end
111 end
112
113 class PolicyKitException < BackendException
114   def initialize(message,user,permission)
115     @message = message
116     @user = user
117     @permission = permission
118     super "Policy kit exception for user #{user} and permission #{permission}: #{message}."
119   end
120
121   def to_xml(options={})
122     xml = Builder::XmlMarkup.new(options)
123     xml.instruct! unless options[:skip_instruct]
124
125     xml.error do
126       xml.type "POLKIT"
127       xml.description message
128       xml.polkitout @message
129       xml.user @user
130       xml.permission @permission
131     end
132   end
133 end
134
135 # Exception that signalizes that target file is missing or corrupted
136 # for bad configuration in file use own exception with better explanation what is wrong
137 class CorruptedFileException < BackendException
138   def initialize(file)
139     @file = file
140     super "Target system is not consistent: Missing or corrupted file #{@file}" # RORSCAN_ITL
141   end
142
143   def to_xml(options={})
144     xml = Builder::XmlMarkup.new(options)
145     xml.instruct! unless options[:skip_instruct]
146
147     xml.error do
148       xml.type "BADFILE"
149       xml.description message
150       xml.file @file
151     end
152   end
153 end
154
155 # Exception that signalizes that the requested path does not point to a directory
156 class NotADirException < BackendException
157   def initialize(file)
158     @file = file
159     super "File error: Path #{@file} does not point to a directory"
160   end
161
162   def to_xml(options={})
163     xml = Builder::XmlMarkup.new(options)
164     xml.instruct! unless options[:skip_instruct]
165
166     xml.error do
167       xml.type "NOTADIR"
168       xml.description message
169       xml.file @file
170     end
171   end
172 end
173
174 # Exception, which signalizes, that some functionality of backend was requested
175 # without accepting the EULA first.
176 class EulaNotAcceptedException < BackendException
177   def initialize()
178     super("EULA not yet accepted.")
179   end
180
181   def to_xml(options={})
182     no_arg_to_xml(options,"EULA_NOT_ACCEPTED", "Functionality of the target system was required, but its EULA was not accepted yet.") # RORSCAN_ITL
183   end
184 end
185
186 class ServiceNotAvailable < BackendException
187   def initialize(service)
188     @service = service
189   end
190
191   def to_xml(options={})
192     xml = Builder::XmlMarkup.new(options)
193     xml.instruct! unless options[:skip_instruct]
194     xml.error do
195       xml.type "SERVICE_NOT_AVAILABLE"
196       xml.description "#{@service} is not available on the target machine"
197       xml.service @service
198     end
199   end
200 end
201
202 class ServiceNotRunning < BackendException
203   def initialize(service)
204     @service = service
205   end
206
207   def to_xml(options={})
208     xml = Builder::XmlMarkup.new(options)
209     xml.instruct! unless options[:skip_instruct]
210     xml.error do
211       xml.type "SERVICE_NOT_RUNNING"
212       xml.description "#{@service} is not running on the target machine"
213       xml.service @service
214     end
215   end
216 end
217
218 class DBusException < BackendException
219   def to_xml(options={})
220     xml = Builder::XmlMarkup.new(options)
221     xml.instruct! unless options[:skip_instruct]
222     xml.error do
223       xml.type "DBUS_ERROR"
224       xml.description "DBus return error: #{message}"
225       xml.output message
226     end
227   end
228 end