users_controller.rb 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  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. # do query
  273. user_all = User.search(
  274. :query => params[:term],
  275. :limit => params[:limit],
  276. :current_user => current_user,
  277. )
  278. # build result list
  279. users = []
  280. user_all.each do |user|
  281. realname = user.firstname.to_s + ' ' + user.lastname.to_s
  282. if user.email && user.email.to_s != ''
  283. realname = realname + ' <' + user.email.to_s + '>'
  284. end
  285. a = { :id => user.id, :label => realname, :value => realname }
  286. users.push a
  287. end
  288. # return result
  289. render :json => users
  290. end
  291. # GET /api/v1/users/history/1
  292. def history
  293. # permissin check
  294. if !is_role('Admin') && !is_role('Agent')
  295. response_access_deny
  296. return
  297. end
  298. # get user data
  299. user = User.find( params[:id] )
  300. # get history of user
  301. history = user.history_get(true)
  302. # return result
  303. render :json => history
  304. end
  305. =begin
  306. Resource:
  307. POST /api/v1/users/password_reset
  308. Payload:
  309. {
  310. "username": "some user name"
  311. }
  312. Response:
  313. {
  314. :message => 'ok'
  315. }
  316. Test:
  317. curl http://localhost/api/v1/users/password_reset.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X POST -d '{"username": "some_username"}'
  318. =end
  319. def password_reset_send
  320. # check if feature is enabled
  321. if !Setting.get('user_lost_password')
  322. render :json => { :error => 'Feature not enabled!' }, :status => :unprocessable_entity
  323. return
  324. end
  325. success = User.password_reset_send( params[:username] )
  326. if success
  327. render :json => { :message => 'ok' }, :status => :ok
  328. else
  329. render :json => { :message => 'failed' }, :status => :unprocessable_entity
  330. end
  331. end
  332. =begin
  333. Resource:
  334. POST /api/v1/users/password_reset_verify
  335. Payload:
  336. {
  337. "token": "SoMeToKeN",
  338. "password" "new_password"
  339. }
  340. Response:
  341. {
  342. :message => 'ok'
  343. }
  344. Test:
  345. 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"}'
  346. =end
  347. def password_reset_verify
  348. if params[:password]
  349. user = User.password_reset_via_token( params[:token], params[:password] )
  350. else
  351. user = User.password_reset_check( params[:token] )
  352. end
  353. if user
  354. render :json => { :message => 'ok', :user_login => user.login }, :status => :ok
  355. else
  356. render :json => { :message => 'failed' }, :status => :unprocessable_entity
  357. end
  358. end
  359. =begin
  360. Resource:
  361. POST /api/v1/users/password_change
  362. Payload:
  363. {
  364. "password_old": "some_password_old",
  365. "password_new": "some_password_new"
  366. }
  367. Response:
  368. {
  369. :message => 'ok'
  370. }
  371. Test:
  372. 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"}'
  373. =end
  374. def password_change
  375. # check old password
  376. if !params[:password_old]
  377. render :json => { :message => 'Old password needed!' }, :status => :unprocessable_entity
  378. return
  379. end
  380. user = User.authenticate( current_user.login, params[:password_old] )
  381. if !user
  382. render :json => { :message => 'Old password is wrong!' }, :status => :unprocessable_entity
  383. return
  384. end
  385. # set new password
  386. if !params[:password_new]
  387. render :json => { :message => 'New password needed!' }, :status => :unprocessable_entity
  388. return
  389. end
  390. user.update_attributes( :password => params[:password_new] )
  391. render :json => { :message => 'ok', :user_login => user.login }, :status => :ok
  392. end
  393. =begin
  394. Resource:
  395. PUT /api/v1/users/preferences.json
  396. Payload:
  397. {
  398. "language": "de",
  399. "notification": true
  400. }
  401. Response:
  402. {
  403. :message => 'ok'
  404. }
  405. Test:
  406. curl http://localhost/api/v1/users/preferences.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X PUT -d '{"language": "de", "notifications": true}'
  407. =end
  408. def preferences
  409. if !current_user
  410. render :json => { :message => 'No current user!' }, :status => :unprocessable_entity
  411. return
  412. end
  413. if params[:user]
  414. params[:user].each {|key, value|
  415. current_user.preferences[key.to_sym] = value
  416. }
  417. end
  418. current_user.save
  419. render :json => { :message => 'ok' }, :status => :ok
  420. end
  421. =begin
  422. Resource:
  423. DELETE /api/v1/users/account.json
  424. Payload:
  425. {
  426. "provider": "twitter",
  427. "uid": 581482342942
  428. }
  429. Response:
  430. {
  431. :message => 'ok'
  432. }
  433. Test:
  434. curl http://localhost/api/v1/users/account.json -v -u #{login}:#{password} -H "Content-Type: application/json" -X PUT -d '{"provider": "twitter", "uid": 581482342942}'
  435. =end
  436. def account_remove
  437. if !current_user
  438. render :json => { :message => 'No current user!' }, :status => :unprocessable_entity
  439. return
  440. end
  441. # provider + uid to remove
  442. if !params[:provider]
  443. render :json => { :message => 'provider needed!' }, :status => :unprocessable_entity
  444. return
  445. end
  446. if !params[:uid]
  447. render :json => { :message => 'uid needed!' }, :status => :unprocessable_entity
  448. return
  449. end
  450. # remove from database
  451. record = Authorization.where(
  452. :user_id => current_user.id,
  453. :provider => params[:provider],
  454. :uid => params[:uid],
  455. )
  456. if !record.first
  457. render :json => { :message => 'No record found!' }, :status => :unprocessable_entity
  458. return
  459. end
  460. record.destroy_all
  461. render :json => { :message => 'ok' }, :status => :ok
  462. end
  463. =begin
  464. Resource:
  465. GET /api/v1/users/image/8d6cca1c6bdc226cf2ba131e264ca2c7
  466. Response:
  467. <IMAGE>
  468. Test:
  469. curl http://localhost/api/v1/users/image/8d6cca1c6bdc226cf2ba131e264ca2c7 -v -u #{login}:#{password}
  470. =end
  471. def image
  472. # cache image
  473. response.headers['Expires'] = 1.year.from_now.httpdate
  474. response.headers["Cache-Control"] = "cache, store, max-age=31536000, must-revalidate"
  475. response.headers["Pragma"] = "cache"
  476. # serve user image
  477. user = User.where( :image => params[:hash] ).first
  478. if user
  479. # find file
  480. list = Store.list( :object => 'User::Image', :o_id => user.id )
  481. if list && list[0]
  482. file = Store.find( list[0] )
  483. send_data(
  484. file.content,
  485. :filename => file.filename,
  486. :type => file.preferences['Content-Type'] || file.preferences['Mime-Type'],
  487. :disposition => 'inline'
  488. )
  489. return
  490. end
  491. end
  492. # serve defalt image
  493. image = 'R0lGODdhMAAwAOMAAMzMzJaWlr6+vqqqqqOjo8XFxbe3t7GxsZycnAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAMAAwAAAEcxDISau9OOvNu/9gKI5kaZ5oqq5s675wLM90bd94ru98TwuAA+KQAQqJK8EAgBAgMEqmkzUgBIeSwWGZtR5XhSqAULACCoGCJGwlm1MGQrq9RqgB8fm4ZTUgDBIEcRR9fz6HiImKi4yNjo+QkZKTlJWWkBEAOw=='
  494. send_data(
  495. Base64.decode64(image),
  496. :filename => 'image.gif',
  497. :type => 'image/gif',
  498. :disposition => 'inline',
  499. )
  500. end
  501. end