users_controller.rb 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636
  1. # Copyright (C) 2012-2014 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_source":"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.lookup( :id => user.id ).attributes_with_associations
  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. if params[:full]
  86. full = User.full( params[:id] )
  87. render :json => full
  88. return
  89. end
  90. user = User.find( params[:id] )
  91. render :json => user
  92. end
  93. =begin
  94. Resource:
  95. POST /api/v1/users.json
  96. Payload:
  97. {
  98. "login": "some_login",
  99. "firstname": "some firstname",
  100. "lastname": "some lastname",
  101. "email": "some@example.com"
  102. }
  103. Response:
  104. {
  105. "id": 1,
  106. "login": "some_login",
  107. ...
  108. },
  109. Test:
  110. 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"}'
  111. =end
  112. def create
  113. user = User.new( User.param_cleanup(params) )
  114. begin
  115. # check if it's first user
  116. count = User.all.count()
  117. # if it's a signup, add user to customer role
  118. if !current_user
  119. user.updated_by_id = 1
  120. user.created_by_id = 1
  121. # check if feature is enabled
  122. if !Setting.get('user_create_account')
  123. render :json => { :error => 'Feature not enabled!' }, :status => :unprocessable_entity
  124. return
  125. end
  126. # add first user as admin/agent and to all groups
  127. group_ids = []
  128. role_ids = []
  129. if count <= 2
  130. Role.where( :name => [ 'Admin', 'Agent'] ).each { |role|
  131. role_ids.push role.id
  132. }
  133. Group.all().each { |group|
  134. group_ids.push group.id
  135. }
  136. # everybody else will go as customer per default
  137. else
  138. role_ids.push Role.where( :name => 'Customer' ).first.id
  139. end
  140. user.role_ids = role_ids
  141. user.group_ids = group_ids
  142. # else do assignment as defined
  143. else
  144. if params[:role_ids]
  145. user.role_ids = params[:role_ids]
  146. end
  147. if params[:group_ids]
  148. user.group_ids = params[:group_ids]
  149. end
  150. end
  151. # check if user already exists
  152. if user.email
  153. exists = User.where( :email => user.email ).first
  154. if exists
  155. render :json => { :error => 'User already exists!' }, :status => :unprocessable_entity
  156. return
  157. end
  158. end
  159. user.save
  160. # if first user set init done
  161. if count <= 2
  162. Setting.create_or_update(
  163. :title => 'System Init Done',
  164. :name => 'system_init_done',
  165. :area => 'Core',
  166. :description => 'Defines if application is in init mode.',
  167. :options => {},
  168. :state => true,
  169. :frontend => true
  170. )
  171. end
  172. # send inviteation if needed / only if session exists
  173. if params[:invite] && current_user
  174. # generate token
  175. token = Token.create( :action => 'PasswordReset', :user_id => user.id )
  176. # send mail
  177. data = {}
  178. data[:subject] = 'Invitation to #{config.product_name} at #{config.fqdn}'
  179. data[:body] = 'Hi #{user.firstname},
  180. I (#{current_user.firstname} #{current_user.lastname}) invite you to #{config.product_name} - a customer support / ticket system platform.
  181. Click on the following link and set your password:
  182. #{config.http_type}://#{config.fqdn}/#password_reset_verify/#{token.name}
  183. Enjoy,
  184. #{current_user.firstname} #{current_user.lastname}
  185. Your #{config.product_name} Team
  186. '
  187. # prepare subject & body
  188. [:subject, :body].each { |key|
  189. data[key.to_sym] = NotificationFactory.build(
  190. :locale => user.locale,
  191. :string => data[key.to_sym],
  192. :objects => {
  193. :token => token,
  194. :user => user,
  195. :current_user => current_user,
  196. }
  197. )
  198. }
  199. # send notification
  200. NotificationFactory.send(
  201. :recipient => user,
  202. :subject => data[:subject],
  203. :body => data[:body]
  204. )
  205. end
  206. user_new = User.find( user.id )
  207. render :json => user_new, :status => :created
  208. rescue Exception => e
  209. render :json => { :error => e.message }, :status => :unprocessable_entity
  210. end
  211. end
  212. =begin
  213. Resource:
  214. PUT /api/v1/users/#{id}.json
  215. Payload:
  216. {
  217. "login": "some_login",
  218. "firstname": "some firstname",
  219. "lastname": "some lastname",
  220. "email": "some@example.com"
  221. }
  222. Response:
  223. {
  224. "id": 2,
  225. "login": "some_login",
  226. ...
  227. },
  228. Test:
  229. 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"}'
  230. =end
  231. def update
  232. # allow user to update him self
  233. if is_role('Customer') && !is_role('Admin') && !is_role('Agent')
  234. if params[:id] != current_user.id
  235. response_access_deny
  236. return
  237. end
  238. end
  239. user = User.find( params[:id] )
  240. begin
  241. user.update_attributes( User.param_cleanup(params) )
  242. # only allow Admin's and Agent's
  243. if is_role('Admin') && is_role('Agent') && params[:role_ids]
  244. user.role_ids = params[:role_ids]
  245. end
  246. # only allow Admin's
  247. if is_role('Admin') && params[:group_ids]
  248. user.group_ids = params[:group_ids]
  249. end
  250. # only allow Admin's and Agent's
  251. if is_role('Admin') && is_role('Agent') && params[:organization_ids]
  252. user.organization_ids = params[:organization_ids]
  253. end
  254. # get new data
  255. user_new = User.find( params[:id] )
  256. render :json => user_new, :status => :ok
  257. rescue Exception => e
  258. render :json => { :error => e.message }, :status => :unprocessable_entity
  259. end
  260. end
  261. # DELETE /api/v1/users/1
  262. def destroy
  263. return if deny_if_not_role('Admin')
  264. model_destory_render(User, params)
  265. end
  266. # GET /api/v1/users/search
  267. def search
  268. if is_role('Customer') && !is_role('Admin') && !is_role('Agent')
  269. response_access_deny
  270. return
  271. end
  272. query_params = {
  273. :query => params[:term],
  274. :limit => params[:limit],
  275. :current_user => current_user,
  276. }
  277. if params[:role_ids] && !params[:role_ids].empty?
  278. query_params[:role_ids] = params[:role_ids]
  279. end
  280. # do query
  281. user_all = User.search(query_params)
  282. # build result list
  283. if !params[:full]
  284. users = []
  285. user_all.each { |user|
  286. realname = user.firstname.to_s + ' ' + user.lastname.to_s
  287. if user.email && user.email.to_s != ''
  288. realname = realname + ' <' + user.email.to_s + '>'
  289. end
  290. a = { :id => user.id, :label => realname, :value => realname }
  291. users.push a
  292. }
  293. # return result
  294. render :json => users
  295. return
  296. end
  297. user_ids = []
  298. assets = {}
  299. user_all.each { |user|
  300. assets = user.assets(assets)
  301. user_ids.push user.id
  302. }
  303. # return result
  304. render :json => {
  305. :assets => assets,
  306. :user_ids => user_ids.uniq,
  307. }
  308. end
  309. # GET /api/v1/users/history/1
  310. def history
  311. # permissin check
  312. if !is_role('Admin') && !is_role('Agent')
  313. response_access_deny
  314. return
  315. end
  316. # get user data
  317. user = User.find( params[:id] )
  318. # get history of user
  319. history = user.history_get(true)
  320. # return result
  321. render :json => history
  322. end
  323. =begin
  324. Resource:
  325. POST /api/v1/users/password_reset
  326. Payload:
  327. {
  328. "username": "some user name"
  329. }
  330. Response:
  331. {
  332. :message => 'ok'
  333. }
  334. Test:
  335. curl http://localhost/api/v1/users/password_reset.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X POST -d '{"username": "some_username"}'
  336. =end
  337. def password_reset_send
  338. # check if feature is enabled
  339. if !Setting.get('user_lost_password')
  340. render :json => { :error => 'Feature not enabled!' }, :status => :unprocessable_entity
  341. return
  342. end
  343. success = User.password_reset_send( params[:username] )
  344. if success
  345. render :json => { :message => 'ok' }, :status => :ok
  346. else
  347. render :json => { :message => 'failed' }, :status => :unprocessable_entity
  348. end
  349. end
  350. =begin
  351. Resource:
  352. POST /api/v1/users/password_reset_verify
  353. Payload:
  354. {
  355. "token": "SoMeToKeN",
  356. "password" "new_password"
  357. }
  358. Response:
  359. {
  360. :message => 'ok'
  361. }
  362. Test:
  363. 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"}'
  364. =end
  365. def password_reset_verify
  366. if params[:password]
  367. user = User.password_reset_via_token( params[:token], params[:password] )
  368. else
  369. user = User.password_reset_check( params[:token] )
  370. end
  371. if user
  372. render :json => { :message => 'ok', :user_login => user.login }, :status => :ok
  373. else
  374. render :json => { :message => 'failed' }, :status => :unprocessable_entity
  375. end
  376. end
  377. =begin
  378. Resource:
  379. POST /api/v1/users/password_change
  380. Payload:
  381. {
  382. "password_old": "some_password_old",
  383. "password_new": "some_password_new"
  384. }
  385. Response:
  386. {
  387. :message => 'ok'
  388. }
  389. Test:
  390. 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"}'
  391. =end
  392. def password_change
  393. # check old password
  394. if !params[:password_old]
  395. render :json => { :message => 'Old password needed!' }, :status => :unprocessable_entity
  396. return
  397. end
  398. user = User.authenticate( current_user.login, params[:password_old] )
  399. if !user
  400. render :json => { :message => 'Old password is wrong!' }, :status => :unprocessable_entity
  401. return
  402. end
  403. # set new password
  404. if !params[:password_new]
  405. render :json => { :message => 'New password needed!' }, :status => :unprocessable_entity
  406. return
  407. end
  408. user.update_attributes( :password => params[:password_new] )
  409. render :json => { :message => 'ok', :user_login => user.login }, :status => :ok
  410. end
  411. =begin
  412. Resource:
  413. PUT /api/v1/users/preferences.json
  414. Payload:
  415. {
  416. "language": "de",
  417. "notification": true
  418. }
  419. Response:
  420. {
  421. :message => 'ok'
  422. }
  423. Test:
  424. curl http://localhost/api/v1/users/preferences.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X PUT -d '{"language": "de", "notifications": true}'
  425. =end
  426. def preferences
  427. if !current_user
  428. render :json => { :message => 'No current user!' }, :status => :unprocessable_entity
  429. return
  430. end
  431. if params[:user]
  432. params[:user].each {|key, value|
  433. current_user.preferences[key.to_sym] = value
  434. }
  435. end
  436. current_user.save
  437. render :json => { :message => 'ok' }, :status => :ok
  438. end
  439. =begin
  440. Resource:
  441. DELETE /api/v1/users/account.json
  442. Payload:
  443. {
  444. "provider": "twitter",
  445. "uid": 581482342942
  446. }
  447. Response:
  448. {
  449. :message => 'ok'
  450. }
  451. Test:
  452. curl http://localhost/api/v1/users/account.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X PUT -d '{"provider": "twitter", "uid": 581482342942}'
  453. =end
  454. def account_remove
  455. if !current_user
  456. render :json => { :message => 'No current user!' }, :status => :unprocessable_entity
  457. return
  458. end
  459. # provider + uid to remove
  460. if !params[:provider]
  461. render :json => { :message => 'provider needed!' }, :status => :unprocessable_entity
  462. return
  463. end
  464. if !params[:uid]
  465. render :json => { :message => 'uid needed!' }, :status => :unprocessable_entity
  466. return
  467. end
  468. # remove from database
  469. record = Authorization.where(
  470. :user_id => current_user.id,
  471. :provider => params[:provider],
  472. :uid => params[:uid],
  473. )
  474. if !record.first
  475. render :json => { :message => 'No record found!' }, :status => :unprocessable_entity
  476. return
  477. end
  478. record.destroy_all
  479. render :json => { :message => 'ok' }, :status => :ok
  480. end
  481. =begin
  482. Resource:
  483. GET /api/v1/users/image/8d6cca1c6bdc226cf2ba131e264ca2c7
  484. Response:
  485. <IMAGE>
  486. Test:
  487. curl http://localhost/api/v1/users/image/8d6cca1c6bdc226cf2ba131e264ca2c7 -v -u #{login}:#{password}
  488. =end
  489. def image
  490. # cache image
  491. response.headers['Expires'] = 1.year.from_now.httpdate
  492. response.headers["Cache-Control"] = "cache, store, max-age=31536000, must-revalidate"
  493. response.headers["Pragma"] = "cache"
  494. user = User.where( :image => params[:hash] ).first
  495. if user
  496. image = user.get_image
  497. send_data(
  498. image[:content],
  499. :filename => image[:filename],
  500. :type => image[:content_type],
  501. :disposition => 'inline'
  502. )
  503. return
  504. end
  505. render :json => {}, :status => 404
  506. end
  507. end