From 9848f8063047854e35a6bc7a27302428e22c51ab Mon Sep 17 00:00:00 2001 From: Beh Date: Tue, 7 Mar 2017 00:12:43 +0100 Subject: [PATCH] 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 --- modules/default/calendar.zip | Bin 0 -> 41893 bytes modules/default/calendar/README.md | 21 ++++++++++++---- modules/default/calendar/calendar.js | 17 +++++++++---- modules/default/calendar/calendarfetcher.js | 26 ++++++++++++++------ modules/default/calendar/debug.js | 14 ++++++++--- modules/default/calendar/node_helper.js | 6 ++--- 6 files changed, 61 insertions(+), 23 deletions(-) create mode 100644 modules/default/calendar.zip diff --git a/modules/default/calendar.zip b/modules/default/calendar.zip new file mode 100644 index 0000000000000000000000000000000000000000..91ccaeab853bae16bd5108022f1095733d8b4a33 GIT binary patch literal 41893 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 CVfNVo literal 0 HcmV?d00001 diff --git a/modules/default/calendar/README.md b/modules/default/calendar/README.md index 57a989a8..655ab89c 100644 --- a/modules/default/calendar/README.md +++ b/modules/default/calendar/README.md @@ -53,25 +53,36 @@ The `colored` property gives the option for an individual color for each calenda #### Default value: ````javascript config: { - colored: false, + colored: false, calendars: [ { url: 'http://www.calendarlabs.com/templates/ical/US-Holidays.ics', symbol: 'calendar', + auth: { + user: 'username', + pass: 'superstrongpassword', + method: 'basic' + } }, ], } ```` - #### Calendar configuration options: | Option | Description | --------------------- | ----------- | `url` | The url of the calendar .ical. This property is required.

**Possible values:** Any public accessble .ical calendar. | `symbol` | The symbol to show in front of an event. This property is optional.

**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.

**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.

**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.

**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` | `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` diff --git a/modules/default/calendar/calendar.js b/modules/default/calendar/calendar.js index 644fc1f6..79e9edca 100644 --- a/modules/default/calendar/calendar.js +++ b/modules/default/calendar/calendar.js @@ -72,10 +72,18 @@ Module.register("calendar", { var calendarConfig = { 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 = {}; @@ -313,14 +321,13 @@ Module.register("calendar", { * * argument url string - Url to add. */ - addCalendar: function (url, user, pass, calendarConfig) { + addCalendar: function (url, auth, calendarConfig) { this.sendSocketNotification("ADD_CALENDAR", { url: url, maximumEntries: calendarConfig.maximumEntries || this.config.maximumEntries, maximumNumberOfDays: calendarConfig.maximumNumberOfDays || this.config.maximumNumberOfDays, fetchInterval: this.config.fetchInterval, - user: user, - pass: pass + auth: auth }); }, diff --git a/modules/default/calendar/calendarfetcher.js b/modules/default/calendar/calendarfetcher.js index d5ca075e..4728ffae 100644 --- a/modules/default/calendar/calendarfetcher.js +++ b/modules/default/calendar/calendarfetcher.js @@ -8,7 +8,7 @@ var ical = require("./vendor/ical.js"); 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 reloadTimer = null; @@ -32,11 +32,23 @@ var CalendarFetcher = function(url, reloadInterval, maximumEntries, maximumNumbe } }; - if (user && pass) { - opts.auth = { - user: user, - pass: pass, - sendImmediately: true + if (auth) { + if(auth.method === 'bearer'){ + opts.auth = { + bearer: auth.pass + } + + }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; } - //console.log(data); + // console.log(data); newEvents = []; var limitFunction = function(date, i) {return i < maximumEntries;}; diff --git a/modules/default/calendar/debug.js b/modules/default/calendar/debug.js index 9b72d51d..ddf0fb42 100644 --- a/modules/default/calendar/debug.js +++ b/modules/default/calendar/debug.js @@ -8,14 +8,22 @@ 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 maximumEntries = 10; var maximumNumberOfDays = 365; +var user = "magicmirror"; +var pass = "MyStrongPass"; + +var auth = { + user: user, + pass: pass +}; console.log("Create fetcher ..."); -fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays); +fetcher = new CalendarFetcher(url, fetchInterval, maximumEntries, maximumNumberOfDays, auth); fetcher.onReceive(function(fetcher) { console.log(fetcher.events()); @@ -29,4 +37,4 @@ fetcher.onError(function(fetcher, error) { fetcher.startFetch(); -console.log("Create fetcher done! "); +console.log("Create fetcher done! "); \ No newline at end of file diff --git a/modules/default/calendar/node_helper.js b/modules/default/calendar/node_helper.js index cc511659..90c286c8 100644 --- a/modules/default/calendar/node_helper.js +++ b/modules/default/calendar/node_helper.js @@ -24,7 +24,7 @@ module.exports = NodeHelper.create({ socketNotificationReceived: function(notification, payload) { if (notification === "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. */ - createFetcher: function(url, fetchInterval, maximumEntries, maximumNumberOfDays, user, pass) { + createFetcher: function(url, fetchInterval, maximumEntries, maximumNumberOfDays, auth) { var self = this; if (!validUrl.isUri(url)) { @@ -47,7 +47,7 @@ module.exports = NodeHelper.create({ var fetcher; if (typeof self.fetchers[url] === "undefined") { 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) { //console.log('Broadcast events.');