Skip to content

Commit 19f547b

Browse files
committed
fix(ajax): correctly handle Basic authentication
Fixes #109. When username and password are present in db url, generate Basic authentication token and put it in ajax request headers.
1 parent a80b456 commit 19f547b

File tree

5 files changed

+36
-5
lines changed

5 files changed

+36
-5
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
"dependencies": {
4242
"inherits": "2.0.3",
4343
"pouchdb-ajax": "6.3.4",
44+
"pouchdb-binary-utils": "6.3.4",
4445
"pouchdb-promise": "6.3.4",
4546
"pouchdb-utils": "6.3.4",
4647
"url-join": "2.0.2",

src/admins.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { AuthError, getBaseUrl, getConfigUrl, wrapError } from './utils';
1+
import { AuthError, getBaseUrl, getBasicAuthHeaders, getConfigUrl, wrapError } from './utils';
22

33
import ajaxCore from 'pouchdb-ajax';
44
import { assign, toPromise } from 'pouchdb-utils';
@@ -14,6 +14,7 @@ var getMembership = toPromise(function (opts, callback) {
1414
var ajaxOpts = assign({
1515
method: 'GET',
1616
url: url,
17+
headers: getBasicAuthHeaders(db),
1718
}, opts.ajax || {});
1819
ajaxCore(ajaxOpts, wrapError(callback));
1920
});
@@ -54,6 +55,7 @@ var signUpAdmin = toPromise(function (username, password, opts, callback) {
5455
method: 'PUT',
5556
url: url,
5657
processData: false,
58+
headers: getBasicAuthHeaders(db),
5759
body: '"' + password + '"',
5860
}, opts.ajax || {});
5961
ajaxCore(ajaxOpts, wrapError(callback));
@@ -93,6 +95,7 @@ var deleteAdmin = toPromise(function (username, opts, callback) {
9395
method: 'DELETE',
9496
url: url,
9597
processData: false,
98+
headers: getBasicAuthHeaders(db),
9699
}, opts.ajax || {});
97100
ajaxCore(ajaxOpts, wrapError(callback));
98101
});

src/authentication.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
import { AuthError, getSessionUrl, wrapError } from './utils';
3+
import { AuthError, getBasicAuthHeaders, getSessionUrl, wrapError } from './utils';
44

55
import ajaxCore from 'pouchdb-ajax';
66
import { assign, toPromise } from 'pouchdb-utils';
@@ -24,7 +24,7 @@ var logIn = toPromise(function (username, password, opts, callback) {
2424
var ajaxOpts = assign({
2525
method: 'POST',
2626
url: getSessionUrl(db),
27-
headers: {'Content-Type': 'application/json'},
27+
headers: assign({'Content-Type': 'application/json'}, getBasicAuthHeaders(db)),
2828
body: {name: username, password: password},
2929
}, opts.ajax || {});
3030
ajaxCore(ajaxOpts, wrapError(callback));
@@ -39,6 +39,7 @@ var logOut = toPromise(function (opts, callback) {
3939
var ajaxOpts = assign({
4040
method: 'DELETE',
4141
url: getSessionUrl(db),
42+
headers: getBasicAuthHeaders(db),
4243
}, opts.ajax || {});
4344
ajaxCore(ajaxOpts, wrapError(callback));
4445
});
@@ -54,6 +55,7 @@ var getSession = toPromise(function (opts, callback) {
5455
var ajaxOpts = assign({
5556
method: 'GET',
5657
url: url,
58+
headers: getBasicAuthHeaders(db),
5759
}, opts.ajax || {});
5860
ajaxCore(ajaxOpts, wrapError(callback));
5961
});

src/users.js

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use strict';
22

3-
import { AuthError, getUsersUrl, wrapError } from './utils';
3+
import { AuthError, getBasicAuthHeaders, getUsersUrl, wrapError } from './utils';
44

55
import Promise from 'pouchdb-promise';
66
import ajaxCore from 'pouchdb-ajax';
@@ -43,6 +43,7 @@ function updateUser(db, user, opts, callback) {
4343
method: 'PUT',
4444
url: url,
4545
body: user,
46+
headers: getBasicAuthHeaders(db),
4647
}, opts.ajax || {});
4748
ajaxCore(ajaxOpts, wrapError(callback));
4849
}
@@ -89,6 +90,7 @@ var getUser = toPromise(function (username, opts, callback) {
8990
var ajaxOpts = assign({
9091
method: 'GET',
9192
url: url + '/' + encodeURIComponent('org.couchdb.user:' + username),
93+
headers: getBasicAuthHeaders(db),
9294
}, opts.ajax || {});
9395
ajaxCore(ajaxOpts, wrapError(callback));
9496
});
@@ -137,6 +139,7 @@ var deleteUser = toPromise(function (username, opts, callback) {
137139
var ajaxOpts = assign({
138140
method: 'DELETE',
139141
url: url,
142+
headers: getBasicAuthHeaders(db),
140143
}, opts.ajax || {});
141144
ajaxCore(ajaxOpts, wrapError(callback));
142145
});
@@ -169,6 +172,7 @@ var changePassword = toPromise(function (username, password, opts, callback) {
169172
var ajaxOpts = assign({
170173
method: 'PUT',
171174
url: url,
175+
headers: getBasicAuthHeaders(db),
172176
body: user,
173177
}, opts.ajax || {});
174178
ajaxCore(ajaxOpts, wrapError(callback));
@@ -193,6 +197,7 @@ var changeUsername = toPromise(function (oldUsername, newUsername, opts, callbac
193197
var updateOpts = assign({
194198
method: 'PUT',
195199
url: url,
200+
headers: getBasicAuthHeaders(db),
196201
body: user,
197202
}, opts.ajax);
198203
return ajax(updateOpts);

src/utils.js

+21-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import urlJoin from 'url-join';
44
import urlParse from 'url-parse';
55
import inherits from 'inherits';
6+
import { btoa } from 'pouchdb-binary-utils';
67

78
function getBaseUrl(db) {
89
if (typeof db.getUrl === 'function') { // pouchdb pre-6.0.0
@@ -26,6 +27,17 @@ function getSessionUrl(db) {
2627
return urlJoin(getBaseUrl(db), '/_session');
2728
}
2829

30+
function getBasicAuthHeaders(db) {
31+
var url = urlParse(db.name);
32+
if (!url.auth) {
33+
return {};
34+
}
35+
36+
var str = url.username + ':' + url.password;
37+
var token = btoa(unescape(encodeURIComponent(str)));
38+
return {Authorization: 'Basic ' + token};
39+
}
40+
2941
function wrapError(callback) {
3042
// provide more helpful error message
3143
return function (err, res) {
@@ -51,4 +63,12 @@ function AuthError(message) {
5163

5264
inherits(AuthError, Error);
5365

54-
export { AuthError, getBaseUrl, getConfigUrl, getSessionUrl, getUsersUrl, wrapError };
66+
export {
67+
AuthError,
68+
getBaseUrl,
69+
getBasicAuthHeaders,
70+
getConfigUrl,
71+
getSessionUrl,
72+
getUsersUrl,
73+
wrapError,
74+
};

0 commit comments

Comments
 (0)