users_controller.rb 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554
  1. # Copyright (C) 2012-2013 Zammad Foundation, http://zammad-foundation.org/
  2. class UsersController < ApplicationController
  3. before_filter :authentication_check, :except => [:create, :password_reset_send, :password_reset_verify]
  4. =begin
  5. Format:
  6. JSON
  7. Example:
  8. {
  9. "id":2,
  10. "organization_id":null,
  11. "login":"m@edenhofer.de",
  12. "firstname":"Marti",
  13. "lastname":"Ede",
  14. "email":"m@edenhofer.de",
  15. "image":"http://www.gravatar.com/avatar/1c38b099f2344976005de69965733465?s=48",
  16. "web":"http://127.0.0.1",
  17. "password":"123",
  18. "phone":"112",
  19. "fax":"211",
  20. "mobile":"",
  21. "street":"",
  22. "zip":"",
  23. "city":"",
  24. "country":null,
  25. "verified":false,
  26. "active":true,
  27. "note":"some note",
  28. "source":null,
  29. "role_ids":[1,2],
  30. "group_ids":[1,2,3,4],
  31. }
  32. =end
  33. =begin
  34. Resource:
  35. GET /api/v1/users.json
  36. Response:
  37. [
  38. {
  39. "id": 1,
  40. "login": "some_login1",
  41. ...
  42. },
  43. {
  44. "id": 2,
  45. "login": "some_login2",
  46. ...
  47. }
  48. ]
  49. Test:
  50. curl http://localhost/api/v1/users.json -v -u #{login}:#{password}
  51. =end
  52. def index
  53. # only allow customer to fetch him self
  54. if is_role('Customer') && !is_role('Admin') && !is_role('Agent')
  55. users = User.where( :id => current_user.id )
  56. else
  57. users = User.all
  58. end
  59. users_all = []
  60. users.each {|user|
  61. users_all.push User.user_data_full( user.id )
  62. }
  63. render :json => users_all, :status => :ok
  64. end
  65. =begin
  66. Resource:
  67. GET /api/v1/users/1.json
  68. Response:
  69. {
  70. "id": 1,
  71. "login": "some_login1",
  72. ...
  73. },
  74. Test:
  75. curl http://localhost/api/v1/users/#{id}.json -v -u #{login}:#{password}
  76. =end
  77. def show
  78. # access deny
  79. if is_role('Customer') && !is_role('Admin') && !is_role('Agent')
  80. if params[:id].to_i != current_user.id
  81. response_access_deny
  82. return
  83. end
  84. end
  85. user = User.user_data_full( params[:id] )
  86. render :json => user
  87. end
  88. =begin
  89. Resource:
  90. POST /api/v1/users.json
  91. Payload:
  92. {
  93. "login": "some_login",
  94. "firstname": "some firstname",
  95. "lastname": "some lastname",
  96. "email": "some@example.com"
  97. }
  98. Response:
  99. {
  100. "id": 1,
  101. "login": "some_login",
  102. ...
  103. },
  104. Test:
  105. curl http://localhost/api/v1/users.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X POST -d '{"login": "some_login","firstname": "some firstname","lastname": "some lastname","email": "some@example.com"}'
  106. =end
  107. def create
  108. user = User.new( User.param_cleanup(params) )
  109. begin
  110. # check if it's first user
  111. count = User.all.count()
  112. # if it's a signup, add user to customer role
  113. if !current_user
  114. user.updated_by_id = 1
  115. user.created_by_id = 1
  116. # check if feature is enabled
  117. if !Setting.get('user_create_account')
  118. render :json => { :error => 'Feature not enabled!' }, :status => :unprocessable_entity
  119. return
  120. end
  121. # add first user as admin/agent and to all groups
  122. group_ids = []
  123. role_ids = []
  124. if count <= 2
  125. Role.where( :name => [ 'Admin', 'Agent'] ).each { |role|
  126. role_ids.push role.id
  127. }
  128. Group.all().each { |group|
  129. group_ids.push group.id
  130. }
  131. # everybody else will go as customer per default
  132. else
  133. role_ids.push Role.where( :name => 'Customer' ).first.id
  134. end
  135. user.role_ids = role_ids
  136. user.group_ids = group_ids
  137. # else do assignment as defined
  138. else
  139. if params[:role_ids]
  140. user.role_ids = params[:role_ids]
  141. end
  142. if params[:group_ids]
  143. user.group_ids = params[:group_ids]
  144. end
  145. end
  146. # check if user already exists
  147. if user.email
  148. exists = User.where( :email => user.email ).first
  149. if exists
  150. render :json => { :error => 'User already exists!' }, :status => :unprocessable_entity
  151. return
  152. end
  153. end
  154. user.save
  155. # if first user set init done
  156. if count <= 2
  157. Setting.create_or_update(
  158. :title => 'System Init Done',
  159. :name => 'system_init_done',
  160. :area => 'Core',
  161. :description => 'Defines if application is in init mode.',
  162. :options => {},
  163. :state => true,
  164. :frontend => true
  165. )
  166. end
  167. # send inviteation if needed / only if session exists
  168. if params[:invite] && current_user
  169. # generate token
  170. token = Token.create( :action => 'PasswordReset', :user_id => user.id )
  171. # send mail
  172. data = {}
  173. data[:subject] = 'Invitation to #{config.product_name} at #{config.fqdn}'
  174. data[:body] = 'Hi #{user.firstname},
  175. I (#{current_user.firstname} #{current_user.lastname}) invite you to #{config.product_name} - a customer support / ticket system platform.
  176. Click on the following link and set your password:
  177. #{config.http_type}://#{config.fqdn}/#password_reset_verify/#{token.name}
  178. Enjoy,
  179. #{current_user.firstname} #{current_user.lastname}
  180. Your #{config.product_name} Team
  181. '
  182. # prepare subject & body
  183. [:subject, :body].each { |key|
  184. data[key.to_sym] = NotificationFactory.build(
  185. :locale => user.locale,
  186. :string => data[key.to_sym],
  187. :objects => {
  188. :token => token,
  189. :user => user,
  190. :current_user => current_user,
  191. }
  192. )
  193. }
  194. # send notification
  195. NotificationFactory.send(
  196. :recipient => user,
  197. :subject => data[:subject],
  198. :body => data[:body]
  199. )
  200. end
  201. user_new = User.user_data_full( user.id )
  202. render :json => user_new, :status => :created
  203. rescue Exception => e
  204. render :json => { :error => e.message }, :status => :unprocessable_entity
  205. end
  206. end
  207. =begin
  208. Resource:
  209. PUT /api/v1/users/#{id}.json
  210. Payload:
  211. {
  212. "login": "some_login",
  213. "firstname": "some firstname",
  214. "lastname": "some lastname",
  215. "email": "some@example.com"
  216. }
  217. Response:
  218. {
  219. "id": 2,
  220. "login": "some_login",
  221. ...
  222. },
  223. Test:
  224. curl http://localhost/api/v1/users/2.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X PUT -d '{"login": "some_login","firstname": "some firstname","lastname": "some lastname","email": "some@example.com"}'
  225. =end
  226. def update
  227. # allow user to update him self
  228. if is_role('Customer') && !is_role('Admin') && !is_role('Agent')
  229. if params[:id] != current_user.id
  230. response_access_deny
  231. return
  232. end
  233. end
  234. user = User.find( params[:id] )
  235. begin
  236. user.update_attributes( User.param_cleanup(params) )
  237. # only allow Admin's and Agent's
  238. if is_role('Admin') && is_role('Agent') && params[:role_ids]
  239. user.role_ids = params[:role_ids]
  240. end
  241. # only allow Admin's
  242. if is_role('Admin') && params[:group_ids]
  243. user.group_ids = params[:group_ids]
  244. end
  245. # only allow Admin's and Agent's
  246. if is_role('Admin') && is_role('Agent') && params[:organization_ids]
  247. user.organization_ids = params[:organization_ids]
  248. end
  249. # get new data
  250. user_new = User.user_data_full( params[:id] )
  251. render :json => user_new, :status => :ok
  252. rescue Exception => e
  253. render :json => { :error => e.message }, :status => :unprocessable_entity
  254. end
  255. end
  256. # DELETE /api/v1/users/1
  257. def destroy
  258. return if deny_if_not_role('Admin')
  259. model_destory_render(User, params)
  260. end
  261. # GET /api/v1/users/search
  262. def search
  263. if is_role('Customer') && !is_role('Admin') && !is_role('Agent')
  264. response_access_deny
  265. return
  266. end
  267. # do query
  268. user_all = User.search(
  269. :query => params[:term],
  270. :limit => params[:limit],
  271. :current_user => current_user,
  272. )
  273. # build result list
  274. users = []
  275. user_all.each do |user|
  276. realname = user.firstname.to_s + ' ' + user.lastname.to_s
  277. if user.email && user.email.to_s != ''
  278. realname = realname + ' <' + user.email.to_s + '>'
  279. end
  280. a = { :id => user.id, :label => realname, :value => realname }
  281. users.push a
  282. end
  283. # return result
  284. render :json => users
  285. end
  286. =begin
  287. Resource:
  288. POST /api/v1/users/password_reset
  289. Payload:
  290. {
  291. "username": "some user name"
  292. }
  293. Response:
  294. {
  295. :message => 'ok'
  296. }
  297. Test:
  298. curl http://localhost/api/v1/users/password_reset.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X POST -d '{"username": "some_username"}'
  299. =end
  300. def password_reset_send
  301. # check if feature is enabled
  302. if !Setting.get('user_lost_password')
  303. render :json => { :error => 'Feature not enabled!' }, :status => :unprocessable_entity
  304. return
  305. end
  306. success = User.password_reset_send( params[:username] )
  307. if success
  308. render :json => { :message => 'ok' }, :status => :ok
  309. else
  310. render :json => { :message => 'failed' }, :status => :unprocessable_entity
  311. end
  312. end
  313. =begin
  314. Resource:
  315. POST /api/v1/users/password_reset_verify
  316. Payload:
  317. {
  318. "token": "SoMeToKeN",
  319. "password" "new_password"
  320. }
  321. Response:
  322. {
  323. :message => 'ok'
  324. }
  325. Test:
  326. curl http://localhost/api/v1/users/password_reset_verify.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X POST -d '{"token": "SoMeToKeN", "password" "new_password"}'
  327. =end
  328. def password_reset_verify
  329. if params[:password]
  330. user = User.password_reset_via_token( params[:token], params[:password] )
  331. else
  332. user = User.password_reset_check( params[:token] )
  333. end
  334. if user
  335. render :json => { :message => 'ok', :user_login => user.login }, :status => :ok
  336. else
  337. render :json => { :message => 'failed' }, :status => :unprocessable_entity
  338. end
  339. end
  340. =begin
  341. Resource:
  342. POST /api/v1/users/password_change
  343. Payload:
  344. {
  345. "password_old": "some_password_old",
  346. "password_new": "some_password_new"
  347. }
  348. Response:
  349. {
  350. :message => 'ok'
  351. }
  352. Test:
  353. curl http://localhost/api/v1/users/password_change.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X POST -d '{"password_old": "password_old", "password_new": "password_new"}'
  354. =end
  355. def password_change
  356. # check old password
  357. if !params[:password_old]
  358. render :json => { :message => 'Old password needed!' }, :status => :unprocessable_entity
  359. return
  360. end
  361. user = User.authenticate( current_user.login, params[:password_old] )
  362. if !user
  363. render :json => { :message => 'Old password is wrong!' }, :status => :unprocessable_entity
  364. return
  365. end
  366. # set new password
  367. if !params[:password_new]
  368. render :json => { :message => 'New password needed!' }, :status => :unprocessable_entity
  369. return
  370. end
  371. user.update_attributes( :password => params[:password_new] )
  372. render :json => { :message => 'ok', :user_login => user.login }, :status => :ok
  373. end
  374. =begin
  375. Resource:
  376. PUT /api/v1/users/preferences.json
  377. Payload:
  378. {
  379. "language": "de",
  380. "notification": true
  381. }
  382. Response:
  383. {
  384. :message => 'ok'
  385. }
  386. Test:
  387. curl http://localhost/api/v1/users/preferences.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X PUT -d '{"language": "de", "notifications": true}'
  388. =end
  389. def preferences
  390. if !current_user
  391. render :json => { :message => 'No current user!' }, :status => :unprocessable_entity
  392. return
  393. end
  394. if params[:user]
  395. params[:user].each {|key, value|
  396. current_user.preferences[key.to_sym] = value
  397. }
  398. end
  399. current_user.save
  400. render :json => { :message => 'ok' }, :status => :ok
  401. end
  402. =begin
  403. Resource:
  404. DELETE /api/v1/users/account.json
  405. Payload:
  406. {
  407. "provider": "twitter",
  408. "uid": 581482342942
  409. }
  410. Response:
  411. {
  412. :message => 'ok'
  413. }
  414. Test:
  415. curl http://localhost/api/v1/users/account.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X PUT -d '{"provider": "twitter", "uid": 581482342942}'
  416. =end
  417. def account_remove
  418. if !current_user
  419. render :json => { :message => 'No current user!' }, :status => :unprocessable_entity
  420. return
  421. end
  422. # provider + uid to remove
  423. if !params[:provider]
  424. render :json => { :message => 'provider needed!' }, :status => :unprocessable_entity
  425. return
  426. end
  427. if !params[:uid]
  428. render :json => { :message => 'uid needed!' }, :status => :unprocessable_entity
  429. return
  430. end
  431. # remove from database
  432. record = Authorization.where(
  433. :user_id => current_user.id,
  434. :provider => params[:provider],
  435. :uid => params[:uid],
  436. )
  437. if !record.first
  438. render :json => { :message => 'No record found!' }, :status => :unprocessable_entity
  439. return
  440. end
  441. record.destroy_all
  442. render :json => { :message => 'ok' }, :status => :ok
  443. end
  444. end