authpds 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MIT-LICENSE +1 -1
- data/README.rdoc +28 -7
- data/Rakefile +1 -6
- data/lib/authpds.rb +0 -2
- data/lib/authpds/acts_as_authentic.rb +19 -17
- data/lib/authpds/controllers/authpds_controller.rb +51 -54
- data/lib/authpds/controllers/authpds_sessions_controller.rb +20 -20
- data/lib/authpds/exlibris/pds.rb +1 -7
- data/lib/authpds/session.rb +29 -28
- data/lib/authpds/version.rb +1 -1
- data/test/support/user.rb +6 -6
- data/test/test_helper.rb +1 -1
- data/test/unit/authpds_controller_test.rb +9 -10
- data/test/unit/authpds_user_sessions_controller_test.rb +2 -2
- data/test/unit/pds_test.rb +8 -21
- data/test/unit/user_session_test.rb +20 -22
- data/test/unit/user_test.rb +21 -15
- metadata +28 -14
- data/lib/authpds/institution.rb +0 -44
- data/lib/authpds/institution_list.rb +0 -75
- data/test/support/config/institutions2.yml +0 -352
- data/test/unit/institution_list_test.rb +0 -63
- data/test/unit/institution_test.rb +0 -17
data/lib/authpds/institution.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
class Institution < Struct.new(:display_name, :name, :default, :parent_institution,
|
2
|
-
:ip_addresses, :login, :layouts, :views, :controllers, :models)
|
3
|
-
require 'ipaddr'
|
4
|
-
|
5
|
-
# Better initializer than Struct gives us, take a hash instead
|
6
|
-
# of an ordered array. :services=>[] is an array of service ids,
|
7
|
-
# not actual Services!
|
8
|
-
def initialize(h={})
|
9
|
-
members.each {|m| self.send( ("#{m}=").to_sym , (h.delete("#{m}".to_sym) || h.delete("#{m}"))) }
|
10
|
-
# If the institution is named default, take that as an
|
11
|
-
# indication that it's the default institution
|
12
|
-
self.default= true if name == "default" or name == "DEFAULT"
|
13
|
-
self.default= false unless default
|
14
|
-
# Log the fact that there are left overs in the hash
|
15
|
-
# Rails.logger.warn("The following institution settings were ignored: #{h.inspect}.") unless h.empty?
|
16
|
-
end
|
17
|
-
|
18
|
-
# Instantiates a new copy of all services included in this institution,
|
19
|
-
# returns an array.
|
20
|
-
def instantiate_services!
|
21
|
-
services.collect {|s| }
|
22
|
-
end
|
23
|
-
|
24
|
-
# Check the list of IP addresses for the given IP
|
25
|
-
def includes_ip?(prospective_ip_address)
|
26
|
-
return false if ip_addresses.nil?
|
27
|
-
ip_prospect = IPAddr.new(prospective_ip_address)
|
28
|
-
ip_addresses.each do |ip_address|
|
29
|
-
ip_range = (ip_address.match(/[\-\*]/)) ?
|
30
|
-
(ip_address.match(/\-/)) ?
|
31
|
-
(IPAddr.new(ip_address.split("-")[0])..IPAddr.new(ip_address.split("-")[1])) :
|
32
|
-
(IPAddr.new(ip_address.gsub(/\*/, "0"))..IPAddr.new(ip_address.gsub(/\*/, "255"))) :
|
33
|
-
IPAddr.new(ip_address).to_range
|
34
|
-
return true if ip_range === ip_prospect unless ip_range.nil?
|
35
|
-
end
|
36
|
-
return false;
|
37
|
-
end
|
38
|
-
|
39
|
-
def to_h
|
40
|
-
h = {}
|
41
|
-
members.each {|m| h[m.to_sym] = self.send(m)}
|
42
|
-
h
|
43
|
-
end
|
44
|
-
end
|
@@ -1,75 +0,0 @@
|
|
1
|
-
class InstitutionList
|
2
|
-
include Singleton # get the instance with InstitutionList.instance
|
3
|
-
@@institutions_yaml_path = nil
|
4
|
-
|
5
|
-
def initialize
|
6
|
-
@institutions = nil
|
7
|
-
end
|
8
|
-
|
9
|
-
# Used for initialization and testing
|
10
|
-
def self.yaml_path=(path)
|
11
|
-
@@institutions_yaml_path = path
|
12
|
-
self.instance.reload
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.institutions_defined?
|
16
|
-
return !@@institutions_yaml_path.nil?
|
17
|
-
end
|
18
|
-
|
19
|
-
# Returns an Institution
|
20
|
-
def get(name)
|
21
|
-
return institutions[name]
|
22
|
-
end
|
23
|
-
|
24
|
-
# Returns an array of Institutions
|
25
|
-
def defaults
|
26
|
-
return institutions.values.find_all {|institution| institution.default === true}
|
27
|
-
end
|
28
|
-
|
29
|
-
# Returns an array of Institutions
|
30
|
-
def institutions_with_ip(ip)
|
31
|
-
return institutions.values.find_all { |institution| institution.includes_ip?(ip) }
|
32
|
-
end
|
33
|
-
|
34
|
-
# Reload institutions from the YAML file.
|
35
|
-
def reload
|
36
|
-
@institutions = nil
|
37
|
-
institutions
|
38
|
-
true
|
39
|
-
end
|
40
|
-
|
41
|
-
# Load institutions from the YAML file and return as a hash.
|
42
|
-
def institutions
|
43
|
-
unless @institutions
|
44
|
-
raise ArgumentError.new("institutions_yaml_path was not specified.") if @@institutions_yaml_path.nil?
|
45
|
-
raise NameError.new(
|
46
|
-
"The file #{@@institutions_yaml_path} does not exist. "+
|
47
|
-
"In order to use the institution feature you must create the file."
|
48
|
-
) unless File.exists?(@@institutions_yaml_path)
|
49
|
-
institutions_hash = YAML.load_file( @@institutions_yaml_path )
|
50
|
-
institutions_with_parents = {}
|
51
|
-
# Prepare institution definitions
|
52
|
-
institutions_hash.each do |name, definition|
|
53
|
-
definition["name"] = name
|
54
|
-
definition["default"] = false unless definition.key?("default")
|
55
|
-
institutions_with_parents[name] = definition if definition.key?("parent_institution")
|
56
|
-
end
|
57
|
-
# Handle inheritance for institutions
|
58
|
-
institutions_with_parents.each do |name, definition|
|
59
|
-
institutions_hash[name] = merge_with_parent(institutions_hash, definition)
|
60
|
-
end
|
61
|
-
# Turn the institution definitions to Institutions
|
62
|
-
@institutions = {}
|
63
|
-
institutions_hash.each do |name, definition|
|
64
|
-
@institutions[name] = Institution.new(definition)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
return @institutions
|
68
|
-
end
|
69
|
-
|
70
|
-
private
|
71
|
-
def merge_with_parent(institutions, child)
|
72
|
-
parent = institutions[child["parent_institution"]]
|
73
|
-
return (parent["parent_institution"].nil?) ? parent.merge(child) : merge_with_parent(institutions, parent).merge(child)
|
74
|
-
end
|
75
|
-
end
|
@@ -1,352 +0,0 @@
|
|
1
|
-
# Configure what service plugins are used by Umlaut. This skeleton file
|
2
|
-
# has been generated into your app to help you get started.
|
3
|
-
#
|
4
|
-
# If a service has "disabled:true", it's currently turned off.
|
5
|
-
#
|
6
|
-
# Some services require local api key or connection details as config.
|
7
|
-
# Most services take other options for custom configuration too, not
|
8
|
-
# all options are neccesarily listed as examples here, see source
|
9
|
-
# or source-generated docs for more info.
|
10
|
-
default:
|
11
|
-
display_name: "NYU Libraries"
|
12
|
-
layouts:
|
13
|
-
resolve: layouts/nyu/resolve
|
14
|
-
search: layouts/nyu/search
|
15
|
-
login:
|
16
|
-
link_code: NYU
|
17
|
-
views:
|
18
|
-
tabs_partial: search/nyu/tabs
|
19
|
-
tip1_partial: search/nyu/tip1
|
20
|
-
tip2_partial: search/nyu/tip2
|
21
|
-
sfx_base_url: http://sfx.library.nyu.edu/sfxlcl41?
|
22
|
-
services:
|
23
|
-
# Priority 2
|
24
|
-
NYU_Primo:
|
25
|
-
type: PrimoService
|
26
|
-
priority: 2 # After SFX, to get SFX metadata enhancement
|
27
|
-
status: active
|
28
|
-
base_url: http://bobcatdev.library.nyu.edu
|
29
|
-
vid: NYU
|
30
|
-
institution: NYU
|
31
|
-
holding_search_institution: NYU
|
32
|
-
holding_search_text: Search for this title in BobCat.
|
33
|
-
suppress_holdings: [ !ruby/regexp '/\$\$LBWEB/', !ruby/regexp '/\$\$LNWEB/', !ruby/regexp '/\$\$LTWEB/', !ruby/regexp '/\$\$LWEB/', !ruby/regexp '/\$\$1Restricted Internet Resources/' ]
|
34
|
-
ez_proxy: !ruby/regexp '/https\:\/\/ezproxy\.library\.nyu\.edu\/login\?url=/'
|
35
|
-
service_types:
|
36
|
-
- primo_source
|
37
|
-
- holding_search
|
38
|
-
- fulltext
|
39
|
-
- table_of_contents
|
40
|
-
- referent_enhance
|
41
|
-
- cover_image
|
42
|
-
# Priority 3
|
43
|
-
# First half of Amazon, run in foreground, get metadata and cover images.
|
44
|
-
Amazon:
|
45
|
-
disabled: true
|
46
|
-
display_name: Amazon.com
|
47
|
-
type: Amazon
|
48
|
-
url: http://webservices.amazon.com/onca/xml
|
49
|
-
api_key: 1ZQ8VEWY2A7VSJ93CW82
|
50
|
-
secret_key: jZNsa8uaOxo2mj1TvHQVDs464TcPEvuidSF/xepO
|
51
|
-
associate_tag: nyli0a-20
|
52
|
-
priority: 3
|
53
|
-
service_types:
|
54
|
-
- referent_enhance
|
55
|
-
- cover_image
|
56
|
-
# Priority a: Background
|
57
|
-
NYU_Primo_Source:
|
58
|
-
type: PrimoSource
|
59
|
-
priority: a
|
60
|
-
status: active
|
61
|
-
base_url: http://bobcatdev.library.nyu.edu
|
62
|
-
vid: NYU
|
63
|
-
# Priority c: Background
|
64
|
-
# Second half of Amazon. It's Slow to lookup highlighted_link and search_inside
|
65
|
-
# availability, so we do it in a bg wave.
|
66
|
-
Amazon_bg:
|
67
|
-
type: Amazon
|
68
|
-
disabled: true
|
69
|
-
api_key: 1ZQ8VEWY2A7VSJ93CW82
|
70
|
-
secret_key: jZNsa8uaOxo2mj1TvHQVDs464TcPEvuidSF/xepO
|
71
|
-
associate_tag: nyli0a-20
|
72
|
-
priority: c
|
73
|
-
make_aws_call: false
|
74
|
-
service_types:
|
75
|
-
- abstract
|
76
|
-
- highlighted_link
|
77
|
-
- search_inside
|
78
|
-
- excerpts
|
79
|
-
CoverThing:
|
80
|
-
type: CoverThing
|
81
|
-
disabled: true
|
82
|
-
developer_key: 0db3ae0934bc35aed93ea676c883128c
|
83
|
-
priority: c
|
84
|
-
# Pre-empted by says if we already have a cover_image response
|
85
|
-
# from somewhere else that runs earlier, don't run this.
|
86
|
-
preempted_by:
|
87
|
-
existing_type: cover_image
|
88
|
-
ElsevierCover:
|
89
|
-
type: ElsevierCover
|
90
|
-
priority: c
|
91
|
-
UlrichsCover:
|
92
|
-
type: UlrichsCover
|
93
|
-
priority: c
|
94
|
-
GoogleBookSearch:
|
95
|
-
type: GoogleBookSearch
|
96
|
-
disabled: true
|
97
|
-
priority: c
|
98
|
-
api_key: AIzaSyADjP7PRPsGaPYJB9tvfm8ZSpdmhUsCR1w
|
99
|
-
Ulrichs:
|
100
|
-
display_name: "Ulrich's Directory"
|
101
|
-
type: UlrichsLink
|
102
|
-
priority: c
|
103
|
-
IsbnDb:
|
104
|
-
display_name: isbndb.com
|
105
|
-
disabled: true
|
106
|
-
type: IsbnDb
|
107
|
-
priority: c
|
108
|
-
access_key: 9FAOAU2Z
|
109
|
-
InternetArchive:
|
110
|
-
display_name: the Internet Archive
|
111
|
-
type: InternetArchive
|
112
|
-
priority: c
|
113
|
-
# disable audio results? uncomment:
|
114
|
-
#num_results_for_types:
|
115
|
-
# audio: 0
|
116
|
-
ScopusCitations:
|
117
|
-
type: Scopus
|
118
|
-
priority: c
|
119
|
-
json_api_key: yI7GR2aKR1n9ZvMd36rrd1zASdGJYJ
|
120
|
-
# partner_id: YOUR_SCOPUS_PARTNER_ID
|
121
|
-
# link_salt_key: "YOUR_SCOPUS_LINK_SALT_KEY"
|
122
|
-
# Web of Knowledge API has no api key, but your
|
123
|
-
# IP needs to be registered with them. See source docs
|
124
|
-
# for how.
|
125
|
-
IsiCitations:
|
126
|
-
type: Isi
|
127
|
-
priority: c
|
128
|
-
# Thomson JCR LAMR api has no api key, but your
|
129
|
-
# IP needs to be registered with them. Same registraiton
|
130
|
-
# as for ISI WoK generally.
|
131
|
-
Jcr:
|
132
|
-
type: Jcr
|
133
|
-
priority: c
|
134
|
-
# Priority d
|
135
|
-
HathiTrust:
|
136
|
-
type: HathiTrust
|
137
|
-
priority: d
|
138
|
-
# Uncomment to link through this 'internal' URL instead
|
139
|
-
# of following permalinks. jrochkind does this to use
|
140
|
-
# a WAYFless shibboleth login with EZProxy.
|
141
|
-
#direct_link_base: 'https://babel.hathitrust.org/shcgi/'
|
142
|
-
#
|
143
|
-
# This next says:
|
144
|
-
# Don't add HathiTrust fulltext if there's already a
|
145
|
-
# GoogleBookSearch fulltext. Still add other HT response
|
146
|
-
# types.
|
147
|
-
# preempted_by:
|
148
|
-
# self_type: fulltext
|
149
|
-
# existing_service: GoogleBookSearch
|
150
|
-
# existing_type: fulltext
|
151
|
-
EmailExport:
|
152
|
-
type: EmailExport
|
153
|
-
priority: d
|
154
|
-
TxtHoldingExport:
|
155
|
-
type: TxtHoldingExport
|
156
|
-
priority: d
|
157
|
-
# Worldcat scraper can be quite slow, move it to wave 'd' to avoid
|
158
|
-
# holding up wave 'c'
|
159
|
-
Worldcat:
|
160
|
-
display_name: OCLC Worldcat.org
|
161
|
-
type: Worldcat
|
162
|
-
priority: d
|
163
|
-
# suppress_precheck says don't actually screen-scrape to
|
164
|
-
# see if the link is good, just link blindly. Mostly works
|
165
|
-
# for WorldCat, avoids the performance hit.
|
166
|
-
suppress_precheck: true
|
167
|
-
WorldcatIdentities:
|
168
|
-
type: WorldcatIdentities
|
169
|
-
priority: d
|
170
|
-
# Turn off certain response types:
|
171
|
-
#note_types: false
|
172
|
-
#wikipedia_link: false
|
173
|
-
#openurl_widely_held: false
|
174
|
-
#require_identifier: true
|
175
|
-
# GPO is kind of experimental, it doesn't work great, but IF an
|
176
|
-
# OpenURL includes a sudoc call number or other GPO identifiers,
|
177
|
-
# will try to link to full text via GPO catalog scrape.
|
178
|
-
Gpo:
|
179
|
-
type: Gpo
|
180
|
-
disabled: true
|
181
|
-
priority: e
|
182
|
-
#preempted_by:
|
183
|
-
# - existing_type: fulltext
|
184
|
-
# - existing_type: fulltext_title_level
|
185
|
-
####
|
186
|
-
# Link out filters: Effect what happens when a user clicks
|
187
|
-
# on an Umlaut link to a third party source. Link out filters
|
188
|
-
# can operate to change where link goes or execute side effects
|
189
|
-
# on click.
|
190
|
-
####
|
191
|
-
# Redirect outgoing links through EZProxy
|
192
|
-
EZProxy:
|
193
|
-
type: Ezproxy
|
194
|
-
disabled: true
|
195
|
-
task: link_out_filter
|
196
|
-
proxy_server: HOSTNAME_OF_YOUR_EZPROXY
|
197
|
-
# By default, will pre-check with EZProxy api and
|
198
|
-
# only send links through EZProxy that are proxyable.
|
199
|
-
# requires proxy_password to be set.
|
200
|
-
# optionally, set precheck_with_api false, and the EZProxy
|
201
|
-
# api won't be used, ALL links go through EZProxy. You may
|
202
|
-
# have EZProxy itself set to transparently redirect non-proxyable
|
203
|
-
# URLs back to non-proxied version.
|
204
|
-
#
|
205
|
-
#precheck_with_api: false
|
206
|
-
priority: 5
|
207
|
-
proxy_password: YOUR_EZPROXY_API_PWD
|
208
|
-
# Want to exclude certain hostnames from being directed through EZProxy?
|
209
|
-
# list them in array here:
|
210
|
-
#exclude: [ host.unversity.edu, otherhost.somewhere.com]
|
211
|
-
# Use of SFX api means that SFX can no longer keep statistics on
|
212
|
-
# clickthroughs. This link out filter will attempt to fake SFX into
|
213
|
-
# thinking a direct click happened when user clicks on an SFX link
|
214
|
-
# via Umlaut. This is VERY fragile logic, required reverse engineering
|
215
|
-
# SFX and faking it out, still doesn't work all the time. But works
|
216
|
-
# much of the time.
|
217
|
-
SFX_backchannel_record:
|
218
|
-
disabled: true
|
219
|
-
type: SfxBackchannelRecord
|
220
|
-
priority: 6
|
221
|
-
|
222
|
-
NYU:
|
223
|
-
parent_institution: default
|
224
|
-
ip_addresses:
|
225
|
-
- '128.122.0.0-128.122.149.239'
|
226
|
-
- '172.26.*.*'
|
227
|
-
- '172.27.*.*'
|
228
|
-
- '172.22.88.*'
|
229
|
-
- '216.165.*.*'
|
230
|
-
- '128.238.*.*'
|
231
|
-
services:
|
232
|
-
NYU_SFX:
|
233
|
-
name: Get It @ NYU
|
234
|
-
display_name: Get It @ NYU
|
235
|
-
type: Sfx
|
236
|
-
base_url: http://sfx.library.nyu.edu/sfxlcl41
|
237
|
-
priority: 1
|
238
|
-
status: active
|
239
|
-
click_passthrough: false
|
240
|
-
sfx_requests_expire_crontab: '00 00 * * 00'
|
241
|
-
sfx_timeout: 9
|
242
|
-
extra_targets_of_interest:
|
243
|
-
ISI_RESEARCHSOFT_EXPORT_TOOL: export_citation
|
244
|
-
REFWORKS_EXPORT_TOOL: export_citation
|
245
|
-
ASK_A_LIBRARIAN_LCL: help
|
246
|
-
COMMENTS_ABOUT_BOBCAT_LCL: help
|
247
|
-
|
248
|
-
NYUAD:
|
249
|
-
display_name: NYU Abu Dhabi Library
|
250
|
-
parent_institution: NYU
|
251
|
-
resolve_layout: layouts/nyuad/resolve
|
252
|
-
search_layout: layouts/nyuad/search
|
253
|
-
views:
|
254
|
-
tabs_partial: search/nyuad/tabs
|
255
|
-
tip1_partial: search/nyuad/tip1
|
256
|
-
tip2_partial: search/nyu/tip2
|
257
|
-
sfx_base_url: http://sfx.library.nyu.edu/sfxlcl41?
|
258
|
-
ip_addresses:
|
259
|
-
- 192.168.224.0/23
|
260
|
-
- 192.168.226.0/24
|
261
|
-
- 192.168.227.0/25
|
262
|
-
- 192.168.227.128/26
|
263
|
-
- 172.25.79.0/26
|
264
|
-
- 172.26.240.0/22
|
265
|
-
- 172.30.60.0/24
|
266
|
-
- 172.27.240.0/22
|
267
|
-
- 172.29.252.0/24
|
268
|
-
- 172.29.120.0/23
|
269
|
-
- 192.168.192.0/23
|
270
|
-
- 192.168.195.0/25
|
271
|
-
- 172.25.76.0/23
|
272
|
-
- 172.26.232.0/22
|
273
|
-
- 172.30.58.0/24
|
274
|
-
- 172.27.232.0/22
|
275
|
-
- 172.29.250.0/24
|
276
|
-
- 172.29.116.0/23
|
277
|
-
- 192.168.194.0/24
|
278
|
-
- 172.25.78.0/26
|
279
|
-
- 172.26.236.0/22
|
280
|
-
- 172.30.59.0/24
|
281
|
-
- 172.27.236.0/22
|
282
|
-
- 172.29.251.0/24
|
283
|
-
- 172.29.118.0/23
|
284
|
-
|
285
|
-
CU:
|
286
|
-
display_name: The Cooper Union Library
|
287
|
-
resolve_layout: layouts/cu/resolve
|
288
|
-
search_layout: layouts/cu/search
|
289
|
-
login:
|
290
|
-
link_code: CU
|
291
|
-
views:
|
292
|
-
tabs_partial: search/cu/tabs
|
293
|
-
sfx_base_url: http://sfx.library.nyu.edu/sfxcooper?
|
294
|
-
ip_addresses:
|
295
|
-
- 199.98.16.0-199.98.31.255
|
296
|
-
services:
|
297
|
-
# CU SFX service.
|
298
|
-
CU_SFX:
|
299
|
-
name: Get It @ Cooper Union
|
300
|
-
display_name: Get It @ Cooper Union
|
301
|
-
type: Sfx
|
302
|
-
base_url: http://sfx.library.nyu.edu/sfxcooper
|
303
|
-
priority: 1
|
304
|
-
status: active
|
305
|
-
click_passthrough: false
|
306
|
-
sfx_requests_expire_crontab: '00 00 * * 00'
|
307
|
-
sfx_timeout: 9
|
308
|
-
extra_targets_of_interest:
|
309
|
-
CAPTURE_CITATION: export_citation
|
310
|
-
|
311
|
-
NS:
|
312
|
-
display_name: New School Libraries
|
313
|
-
resolve_layout: layouts/cu/resolve
|
314
|
-
search_layout: layouts/cu/search
|
315
|
-
login:
|
316
|
-
link_code: NS
|
317
|
-
views:
|
318
|
-
tabs_partial: search/ns/tabs
|
319
|
-
sfx_base_url: http://sfx4.library.newschool.edu/ns?
|
320
|
-
ip_addresses:
|
321
|
-
- 149.31.0.0-149.31.255.255
|
322
|
-
- 69.64.210.46
|
323
|
-
- 69.64.210.50
|
324
|
-
- 69.64.210.42
|
325
|
-
- 69.193.198.126
|
326
|
-
services:
|
327
|
-
NS_SFX:
|
328
|
-
name: Get It @ New School Libraries
|
329
|
-
display_name: Get It @ New School Libraries
|
330
|
-
type: Sfx
|
331
|
-
base_url: http://sfx4.library.newschool.edu/ns
|
332
|
-
priority: 1
|
333
|
-
status: active
|
334
|
-
click_passthrough: true
|
335
|
-
sfx_requests_expire_crontab: '00 00 * * 00'
|
336
|
-
sfx_timeout: 9
|
337
|
-
extra_targets_of_interest:
|
338
|
-
ISI_RESEARCHSOFT_EXPORT_TOOL: export_citation
|
339
|
-
REFWORKS_EXPORT_TOOL: export_citation
|
340
|
-
# ISI_WEB_OF_SCIENCE: export_citation
|
341
|
-
# BX_RECOMMENDER_SERVICE: help
|
342
|
-
ASK_A_LIBRARIAN_LCL: help
|
343
|
-
COMMENTS_ABOUT_BOBCAT_LCL: help
|
344
|
-
|
345
|
-
NYSID:
|
346
|
-
login:
|
347
|
-
link_code: NYSID
|
348
|
-
resolve_layout: layouts/nysid/resolve
|
349
|
-
search_layout: layouts/nysid/search
|
350
|
-
display_name: New York School of Interior Design Library
|
351
|
-
ip_addresses:
|
352
|
-
- 128.122.0.1
|