1 /* ---------------------------------------------------------------------------
2 * Copyright (C) 2008 Georgia Public Library Service
3 * Bill Erickson <erickson@esilibrary.com>
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 * ---------------------------------------------------------------------------
18 if(!dojo._hasResource["openils.User"]) {
20 dojo._hasResource["openils.User"] = true;
21 dojo.provide("openils.User");
22 dojo.require("DojoSRF");
23 dojo.require('openils.Event');
24 dojo.require('fieldmapper.Fieldmapper');
25 dojo.require('fieldmapper.OrgUtils');
27 dojo.declare('openils.User', null, {
38 constructor : function ( kwargs ) {
39 kwargs = kwargs || {};
41 this.user = kwargs.user;
42 this.passwd = kwargs.passwd;
43 this.authtoken = kwargs.authtoken || openils.User.authtoken;
44 this.authtime = kwargs.authtime || openils.User.authtime;
45 this.login_type = kwargs.login_type;
46 this.location = kwargs.location;
47 this.authcookie = kwargs.authcookie || openils.User.authcookie;
48 this.permOrgStoreCache = {}; /* permName => permOrgUnitStore map */
50 if (this.id && this.authtoken) this.user = this.getById( this.id );
51 else if (this.authtoken) this.getBySession();
52 else if (kwargs.login) this.login();
55 getBySession : function(onComplete) {
57 var req = ['open-ils.auth', 'open-ils.auth.session.retrieve'];
58 var params = [_u.authtoken];
61 fieldmapper.standardRequest(
65 oncomplete : function(r) {
66 var user = r.recv().content();
68 if (!openils.User.user) openils.User.user = _u.user;
75 _u.user = fieldmapper.standardRequest(req, params);
76 if (!openils.User.user) openils.User.user = _u.user;
81 getById : function(id, onComplete) {
82 var req = OpenSRF.CachedClientSession('open-ils.actor').request('open-ils.actor.user.retrieve', this.authtoken, id);
84 req.oncomplete = function(r) {
85 var user = r.recv().content();
92 return req.recv().content();
98 * Logs in, sets the authtoken/authtime vars, and fetches the logged in user
100 login_async : function(args, onComplete) {
103 if (!args) args = {};
104 if (!args.username) args.username = _u.username;
105 if (!args.passwd) args.passwd = _u.passwd;
106 if (!args.type) args.type = _u.login_type;
107 if (!args.location) args.location = _u.location;
109 var initReq = OpenSRF.CachedClientSession('open-ils.auth').request('open-ils.auth.authenticate.init', args.username);
111 initReq.oncomplete = function(r) {
112 var seed = r.recv().content();
114 username : args.username,
115 password : hex_md5(seed + hex_md5(args.passwd)),
118 workstation : args.workstation
121 var authReq = OpenSRF.CachedClientSession('open-ils.auth').request('open-ils.auth.authenticate.complete', loginInfo);
122 authReq.oncomplete = function(rr) {
123 var data = rr.recv().content();
124 _u.authtoken = data.payload.authtoken;
125 if (!openils.User.authtoken) openils.User.authtoken = _u.authtoken;
126 _u.authtime = data.payload.authtime;
127 if (!openils.User.authtime) openils.User.authtime = _u.authtime;
128 _u.getBySession(onComplete);
130 dojo.require('dojo.cookie');
131 dojo.cookie(_u.authcookie, _u.authtoken, {path:'/'});
140 login : function(args) {
142 if (!args) args = {};
143 if (!args.username) args.username = _u.username;
144 if (!args.passwd) args.passwd = _u.passwd;
145 if (!args.type) args.type = _u.login_type;
146 if (!args.location) args.location = _u.location;
148 var seed = fieldmapper.standardRequest(
149 ['open-ils.auth', 'open-ils.auth.authenticate.init'],
154 username : args.username,
155 password : hex_md5(seed + hex_md5(args.passwd)),
158 workstation : args.workstation,
161 var data = fieldmapper.standardRequest(
162 ['open-ils.auth', 'open-ils.auth.authenticate.complete'],
166 _u.authtoken = data.payload.authtoken;
167 if (!openils.User.authtoken) openils.User.authtoken = _u.authtoken;
168 _u.authtime = data.payload.authtime;
169 if (!openils.User.authtime) openils.User.authtime = _u.authtime;
172 dojo.require('dojo.cookie');
173 dojo.cookie(_u.authcookie, _u.authtoken, {path:'/'});
179 * Returns a list of the "highest" org units where the user has the given permission(s).
180 * @param permList A single permission or list of permissions
181 * @param includeDescendents If true, return a list of 'highest' orgs plus descendents
182 * @idlist If true, return a list of IDs instead of org unit objects
184 getPermOrgList : function(permList, onload, includeDescendents, idlist) {
185 if(typeof permList == 'string') permList = [permList];
187 console.log('loading org perms ' + permList + ' for user ' + this.user.id());
188 var oncomplete = function(r) {
189 var permMap = openils.Util.readResponse(r);
191 for(var perm in permMap) {
192 var permOrgList = permMap[perm];
193 for(var i in permOrgList) {
194 if(includeDescendents) {
195 orgList = orgList.concat(
196 fieldmapper.aou.descendantNodeList(permOrgList[i]));
198 orgList = orgList.concat(fieldmapper.aou.findOrgUnit(permOrgList[i]));
205 for(var idx in orgList) {
206 var val = (idlist) ? orgList[idx].id() : orgList[idx];
207 if(trimmed.indexOf(val) < 0)
213 fieldmapper.standardRequest(
214 ['open-ils.actor', 'open-ils.actor.user.work_perm.highest_org_set.batch'],
216 params: [this.authtoken, permList],
217 oncomplete: oncomplete
224 * Builds a dijit.Tree using the orgs where the user has the requested permission
225 * @param perm The permission to check
226 * @param domId The DOM node where the tree widget should live
227 * @param onClick If defined, this will be connected to the tree widget for
230 buildPermOrgTreePicker : function(perm, domId, onClick) {
232 dojo.require('dojo.data.ItemFileReadStore');
233 dojo.require('dijit.Tree');
234 function buildTreePicker(r) {
235 var orgList = r.recv().content();
236 var store = new dojo.data.ItemFileReadStore({data:aou.toStoreData(orgList)});
237 var model = new dijit.tree.ForestStoreModel({
239 query: {_top:'true'},
240 childrenAttrs: ["children"],
241 rootLabel : "Location" /* XXX i18n */
244 var tree = new dijit.Tree({model : model}, dojo.byId(domId));
246 dojo.connect(tree, 'onClick', onClick);
250 fieldmapper.standardRequest(
251 ['open-ils.actor', 'open-ils.actor.user.work_perm.org_unit_list'],
252 { params: [this.authtoken, perm],
253 oncomplete: buildTreePicker,
260 * Sets the store for an existing openils.widget.OrgUnitFilteringSelect
261 * using the orgs where the user has the requested permission.
262 * @param perm The permission to check
263 * @param selector The pre-created dijit.form.FilteringSelect object.
265 buildPermOrgSelector : function(perm, selector, selectedOrg, onload) {
268 dojo.require('dojo.data.ItemFileReadStore');
270 function hookupStore(store) {
271 selector.store = store;
273 if(selectedOrg != null)
274 selector.setValue(selectedOrg);
276 selector.setValue(_u.user.ws_ou());
280 function buildTreePicker(orgList) {
281 var store = new dojo.data.ItemFileReadStore({data:aou.toStoreData(orgList)});
283 _u.permOrgStoreCache[perm] = store;
286 if (_u.permOrgStoreCache[perm])
287 hookupStore(_u.permOrgStoreCache[perm]);
289 _u.getPermOrgList(perm, buildTreePicker);
293 openils.User.user = null;
294 openils.User.authtoken = null;
295 openils.User.authtime = null;
296 openils.User.authcookie = null;