Added support for more authentication methods for the default calendar module

HTTP Basic, Digest and OAuth2/Bearer authentications are now supported
by the calendar module
This commit is contained in:
Beh 2017-03-07 00:12:43 +01:00
parent bd0de83d31
commit 9848f80630
6 changed files with 61 additions and 23 deletions

Binary file not shown.

View File

@ -58,12 +58,16 @@ config: {
{ {
url: 'http://www.calendarlabs.com/templates/ical/US-Holidays.ics', url: 'http://www.calendarlabs.com/templates/ical/US-Holidays.ics',
symbol: 'calendar', symbol: 'calendar',
auth: {
user: 'username',
pass: 'superstrongpassword',
method: 'basic'
}
}, },
], ],
} }
```` ````
#### Calendar configuration options: #### Calendar configuration options:
| Option | Description | Option | Description
| --------------------- | ----------- | --------------------- | -----------
@ -71,7 +75,14 @@ config: {
| `symbol` | The symbol to show in front of an event. This property is optional. <br><br> **Possible values:** See [Font Awesome](http://fontawesome.io/icons/) website. | `symbol` | The symbol to show in front of an event. This property is optional. <br><br> **Possible values:** See [Font Awesome](http://fontawesome.io/icons/) website.
| `color` | The font color of an event from this calendar. This property should be set if the config is set to colored: true. <br><br> **Possible values:** HEX, RGB or RGBA values (#efefef, rgb(242,242,242), rgba(242,242,242,0.5)). | `color` | The font color of an event from this calendar. This property should be set if the config is set to colored: true. <br><br> **Possible values:** HEX, RGB or RGBA values (#efefef, rgb(242,242,242), rgba(242,242,242,0.5)).
| `repeatingCountTitle` | The count title for yearly repating events in this calendar. <br><br> **Example:** `'Birthday'` | `repeatingCountTitle` | The count title for yearly repating events in this calendar. <br><br> **Example:** `'Birthday'`
| `user` | The username for HTTP Basic authentication.
| `pass` | The password for HTTP Basic authentication.
| `maximumEntries` | The maximum number of events shown. Overrides global setting. **Possible values:** `0` - `100` | `maximumEntries` | The maximum number of events shown. Overrides global setting. **Possible values:** `0` - `100`
| `maximumNumberOfDays` | The maximum number of days in the future. Overrides global setting | `maximumNumberOfDays` | The maximum number of days in the future. Overrides global setting
| `auth` | The object containing options for authentication against the calendar.
#### Calendar authentication options:
| Option | Description
| --------------------- | -----------
| `user` | The username for HTTP authentication.
| `pass` | The password for HTTP authentication. (If you use Bearer authentication, this should be your BearerToken.)
| `method` | Which authentication method should be used. HTTP Basic, Digest and Bearer authentication methods are supported. Basic authentication is used by default if this option is omitted. **Possible values:** `digest`, `basic`, `bearer` **Default value:** `basic`

View File

@ -72,10 +72,18 @@ Module.register("calendar", {
var calendarConfig = { var calendarConfig = {
maximumEntries: calendar.maximumEntries, maximumEntries: calendar.maximumEntries,
maximumNumberOfDays: calendar.maximumNumberOfDays, maximumNumberOfDays: calendar.maximumNumberOfDays
}; };
this.addCalendar(calendar.url, calendar.user, calendar.pass, calendarConfig); // we check user and password here for backwards compatibility with old configs
if(calendar.user && calendar.pass){
calendar.auth = {
user: calendar.user,
pass: calendar.pass
}
}
this.addCalendar(calendar.url, calendar.auth, calendarConfig);
} }
this.calendarData = {}; this.calendarData = {};
@ -313,14 +321,13 @@ Module.register("calendar", {
* *
* argument url string - Url to add. * argument url string - Url to add.
*/ */
addCalendar: function (url, user, pass, calendarConfig) { addCalendar: function (url, auth, calendarConfig) {
this.sendSocketNotification("ADD_CALENDAR", { this.sendSocketNotification("ADD_CALENDAR", {
url: url, url: url,
maximumEntries: calendarConfig.maximumEntries || this.config.maximumEntries, maximumEntries: calendarConfig.maximumEntries || this.config.maximumEntries,
maximumNumberOfDays: calendarConfig.maximumNumberOfDays || this.config.maximumNumberOfDays, maximumNumberOfDays: calendarConfig.maximumNumberOfDays || this.config.maximumNumberOfDays,
fetchInterval: this.config.fetchInterval, fetchInterval: this.config.fetchInterval,
user: user, auth: auth
pass: pass
}); });
}, },

View File

@ -8,7 +8,7 @@
var ical = require("./vendor/ical.js"); var ical = require("./vendor/ical.js");
var moment = require("moment"); var moment = require("moment");
var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumberOfDays, user, pass) { var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumberOfDays, auth) {
var self = this; var self = this;
var reloadTimer = null; var reloadTimer = null;
@ -32,11 +32,23 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe
} }
}; };
if (user && pass) { if (auth) {
if(auth.method === 'bearer'){
opts.auth = { opts.auth = {
user: user, bearer: auth.pass
pass: pass, }
sendImmediately: true
}else{
opts.auth = {
user: auth.user,
pass: auth.pass
};
if(auth.method === 'digest'){
opts.auth.sendImmediately = false;
}else{
opts.auth.sendImmediately = true;
}
} }
} }
@ -47,7 +59,7 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe
return; return;
} }
//console.log(data); // console.log(data);
newEvents = []; newEvents = [];
var limitFunction = function(date, i) {return i < maximumEntries;}; var limitFunction = function(date, i) {return i < maximumEntries;};

View File

@ -8,14 +8,22 @@
var CalendarFetcher = require("./calendarfetcher.js"); var CalendarFetcher = require("./calendarfetcher.js");
var url = "https://calendar.google.com/calendar/ical/pkm1t2uedjbp0uvq1o7oj1jouo%40group.calendar.google.com/private-08ba559f89eec70dd74bbd887d0a3598/basic.ics"; var url = "https://calendar.google.com/calendar/ical/pkm1t2uedjbp0uvq1o7oj1jouo%40group.calendar.google.com/private-08ba559f89eec70dd74bbd887d0a3598/basic.ics"; // Standard test URL
// var url = "https://www.googleapis.com/calendar/v3/calendars/primary/events/"; // URL for Bearer auth (must be configured in Google OAuth2 first)
var fetchInterval = 60 * 60 * 1000; var fetchInterval = 60 * 60 * 1000;
var maximumEntries = 10; var maximumEntries = 10;
var maximumNumberOfDays = 365; var maximumNumberOfDays = 365;
var user = "magicmirror";
var pass = "MyStrongPass";
var auth = {
user: user,
pass: pass
};
console.log("Create fetcher ..."); console.log("Create fetcher ...");
fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays); fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays, auth);
fetcher.onReceive(function(fetcher) { fetcher.onReceive(function(fetcher) {
console.log(fetcher.events()); console.log(fetcher.events());

View File

@ -24,7 +24,7 @@ module.exports = NodeHelper.create({
socketNotificationReceived: function(notification, payload) { socketNotificationReceived: function(notification, payload) {
if (notification === "ADD_CALENDAR") { if (notification === "ADD_CALENDAR") {
//console.log('ADD_CALENDAR: '); //console.log('ADD_CALENDAR: ');
this.createFetcher(payload.url, payload.fetchInterval, payload.maximumEntries, payload.maximumNumberOfDays, payload.user, payload.pass); this.createFetcher(payload.url, payload.fetchInterval, payload.maximumEntries, payload.maximumNumberOfDays, payload.auth);
} }
}, },
@ -36,7 +36,7 @@ module.exports = NodeHelper.create({
* attribute reloadInterval number - Reload interval in milliseconds. * attribute reloadInterval number - Reload interval in milliseconds.
*/ */
createFetcher: function(url, fetchInterval, maximumEntries, maximumNumberOfDays, user, pass) { createFetcher: function(url, fetchInterval, maximumEntries, maximumNumberOfDays, auth) {
var self = this; var self = this;
if (!validUrl.isUri(url)) { if (!validUrl.isUri(url)) {
@ -47,7 +47,7 @@ module.exports = NodeHelper.create({
var fetcher; var fetcher;
if (typeof self.fetchers[url] === "undefined") { if (typeof self.fetchers[url] === "undefined") {
console.log("Create new calendar fetcher for url: " + url + " - Interval: " + fetchInterval); console.log("Create new calendar fetcher for url: " + url + " - Interval: " + fetchInterval);
fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays, user, pass); fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays, auth);
fetcher.onReceive(function(fetcher) { fetcher.onReceive(function(fetcher) {
//console.log('Broadcast events.'); //console.log('Broadcast events.');