diff --git a/README.md b/README.md
index 60422881..0cd1859c 100644
--- a/README.md
+++ b/README.md
@@ -50,6 +50,7 @@ The table below identifies the services this tool supports and some example serv
| [Matrix](https://github.com/caronc/apprise/wiki/Notify_matrix) | matrix:// or matrixs:// | (TCP) 80 or 443 | matrix://hostname
matrix://user@hostname
matrixs://user:pass@hostname:port/#room_alias
matrixs://user:pass@hostname:port/!room_id
matrixs://user:pass@hostname:port/#room_alias/!room_id/#room2
matrixs://token@hostname:port/?webhook=matrix
matrix://user:token@hostname/?webhook=slack&format=markdown
| [Mattermost](https://github.com/caronc/apprise/wiki/Notify_mattermost) | mmost:// | (TCP) 8065 | mmost://hostname/authkey
mmost://hostname:80/authkey
mmost://user@hostname:80/authkey
mmost://hostname/authkey?channel=channel
mmosts://hostname/authkey
mmosts://user@hostname/authkey
| [Microsoft Teams](https://github.com/caronc/apprise/wiki/Notify_msteams) | msteams:// | (TCP) 443 | msteams://TokenA/TokenB/TokenC/
+| [NextCloud](https://github.com/caronc/apprise/wiki/Notify_nextcloud) | ncloud:// or nclouds:// | (TCP) 80 or 443 | ncloud://adminuser:pass@host/User
nclouds://adminuser:pass@host/User1/User2/UserN
| [Notica](https://github.com/caronc/apprise/wiki/Notify_notica) | notica:// | (TCP) 443 | notica://Token/
| [Notifico](https://github.com/caronc/apprise/wiki/Notify_notifico) | notifico:// | (TCP) 443 | notifico://ProjectID/MessageHook/
| [Prowl](https://github.com/caronc/apprise/wiki/Notify_prowl) | prowl:// | (TCP) 443 | prowl://apikey
prowl://apikey/providerkey
diff --git a/apprise/plugins/NotifyNextCloud.py b/apprise/plugins/NotifyNextCloud.py
index e62bc18c..d4e4f664 100644
--- a/apprise/plugins/NotifyNextCloud.py
+++ b/apprise/plugins/NotifyNextCloud.py
@@ -43,10 +43,10 @@ class NotifyNextCloud(NotifyBase):
service_url = 'https://github.com/nextcloud/notifications'
# Insecure protocol (for those self hosted requests)
- protocol = 'nextcloud'
+ protocol = 'ncloud'
# The default protocol (this is secure for notica)
- secure_protocol = 'nextclouds'
+ secure_protocol = 'nclouds'
# A URL that takes you to the setup/help of the specific protocol
setup_url = 'https://github.com/caronc/apprise/wiki/Notify_nextcloud'
@@ -89,13 +89,11 @@ class NotifyNextCloud(NotifyBase):
'user': {
'name': _('Username'),
'type': 'string',
- 'required': True,
},
'password': {
'name': _('Password'),
'type': 'string',
'private': True,
- 'required': True,
},
'target_user': {
'name': _('Target User'),
@@ -162,8 +160,9 @@ class NotifyNextCloud(NotifyBase):
else:
payload['shortMessage'] = body
- # Auth is used for SELFHOSTED queries
- auth = (self.user, self.password)
+ auth = None
+ if self.user:
+ auth = (self.user, self.password)
notify_url = self.notify_url.format(
schema='https' if self.secure else 'http',
@@ -182,7 +181,7 @@ class NotifyNextCloud(NotifyBase):
try:
r = requests.post(
- notify_url.format(token=self.token),
+ notify_url,
data=payload,
headers=headers,
auth=auth,
@@ -238,11 +237,18 @@ class NotifyNextCloud(NotifyBase):
# Append our headers into our args
args.update({'+{}'.format(k): v for k, v in self.headers.items()})
- auth = '{user}:{password}@'.format(
- user=NotifyNextCloud.quote(self.user, safe=''),
- password=self.pprint(
- self.password, privacy, mode=PrivacyMode.Secret, safe=''),
- )
+ # Determine Authentication
+ auth = ''
+ if self.user and self.password:
+ auth = '{user}:{password}@'.format(
+ user=NotifyNextCloud.quote(self.user, safe=''),
+ password=self.pprint(
+ self.password, privacy, mode=PrivacyMode.Secret, safe=''),
+ )
+ elif self.user:
+ auth = '{user}@'.format(
+ user=NotifyNextCloud.quote(self.user, safe=''),
+ )
default_port = 443 if self.secure else 80
@@ -254,8 +260,6 @@ class NotifyNextCloud(NotifyBase):
hostname=NotifyNextCloud.quote(self.host, safe=''),
port='' if self.port is None or self.port == default_port
else ':{}'.format(self.port),
- fullpath=NotifyNextCloud.quote(
- self.fullpath, safe='/'),
targets='/'.join([NotifyNextCloud.quote(x)
for x in self.targets]),
args=NotifyNextCloud.urlencode(args),
@@ -268,7 +272,8 @@ class NotifyNextCloud(NotifyBase):
us to substantiate this object.
"""
- results = NotifyBase.parse_url(url, verify_host=False)
+
+ results = NotifyBase.parse_url(url)
if not results:
# We're done early as we couldn't load the results
return results
diff --git a/packaging/redhat/python-apprise.spec b/packaging/redhat/python-apprise.spec
index 200b5098..7a91da4a 100644
--- a/packaging/redhat/python-apprise.spec
+++ b/packaging/redhat/python-apprise.spec
@@ -49,10 +49,11 @@ it easy to access:
Boxcar, ClickSend, Discord, E-Mail, Emby, Faast, Flock, Gitter, Gotify, Growl,
IFTTT, Join, KODI, Kumulos, Mailgun, MatterMost, Matrix, Microsoft Windows
-Notifications, Microsoft Teams, MessageBird, MSG91, Nexmo, Notica, Notifico,
-Notify MyAndroid, Prowl, Pushalot, PushBullet, Pushjet, Pushover, PushSafer,
-Rocket.Chat, SendGrid, SimplePush, Slack, Super Toasty, Stride, Syslog,
-Techulus Push, Telegram, Twilio, Twitter, Twist, XBMC, XMPP, Webex Teams}
+Notifications, Microsoft Teams, MessageBird, MSG91, Nexmo, NextCloud, Notica,
+Notifico, Notify MyAndroid, Prowl, Pushalot, PushBullet, Pushjet, Pushover,
+PushSafer, Rocket.Chat, SendGrid, SimplePush, Slack, Super Toasty, Stride,
+Syslog, Techulus Push, Telegram, Twilio, Twitter, Twist, XBMC, XMPP,
+Webex Teams}
Name: python-%{pypi_name}
Version: 0.8.2
diff --git a/setup.py b/setup.py
index e7accfd5..3c3c933a 100755
--- a/setup.py
+++ b/setup.py
@@ -72,10 +72,10 @@ setup(
keywords='Push Notifications Alerts Email AWS SNS Boxcar ClickSend '
'Discord Dbus Emby Faast Flock Gitter Gnome Gotify Growl IFTTT Join '
'KODI Kumulos Mailgun Matrix Mattermost MessageBird MSG91 Nexmo '
- 'Notica, Notifico Prowl PushBullet Pushjet Pushed Pushover PushSafer '
- 'Rocket.Chat Ryver SendGrid SimplePush Slack Stride Syslog Techulus '
- 'Push Telegram Twilio Twist Twitter XBMC Microsoft MSTeams Windows '
- 'Webex CLI API',
+ 'NextCloud Notica, Notifico Prowl PushBullet Pushjet Pushed Pushover '
+ 'PushSafer Rocket.Chat Ryver SendGrid SimplePush Slack Stride Syslog '
+ 'Techulus Push Telegram Twilio Twist Twitter XBMC Microsoft MSTeams '
+ 'Windows Webex CLI API',
author='Chris Caron',
author_email='lead2gold@gmail.com',
packages=find_packages(),
diff --git a/test/test_rest_plugins.py b/test/test_rest_plugins.py
index 19acd5f9..4e3e189c 100644
--- a/test/test_rest_plugins.py
+++ b/test/test_rest_plugins.py
@@ -1737,6 +1737,72 @@ TEST_URLS = (
'test_requests_exceptions': True,
}),
+ ##################################
+ # NotifyNextCloud
+ ##################################
+ ('ncloud://:@/', {
+ 'instance': None,
+ }),
+ ('ncloud://', {
+ 'instance': None,
+ }),
+ ('nclouds://', {
+ # No hostname
+ 'instance': None,
+ }),
+ ('ncloud://localhost', {
+ # No user specified
+ 'instance': TypeError,
+ }),
+ ('ncloud://localhost/admin', {
+ 'instance': plugins.NotifyNextCloud,
+ }),
+ ('ncloud://user@localhost/admin', {
+ 'instance': plugins.NotifyNextCloud,
+ }),
+ ('ncloud://user@localhost?to=user1,user2', {
+ 'instance': plugins.NotifyNextCloud,
+ }),
+ ('ncloud://user:pass@localhost/user1/user2', {
+ 'instance': plugins.NotifyNextCloud,
+
+ # Our expected url(privacy=True) startswith() response:
+ 'privacy_url': 'ncloud://user:****@localhost/user1/user2',
+ }),
+ ('ncloud://user:pass@localhost:8080/admin', {
+ 'instance': plugins.NotifyNextCloud,
+ }),
+ ('nclouds://user:pass@localhost/admin', {
+ 'instance': plugins.NotifyNextCloud,
+
+ # Our expected url(privacy=True) startswith() response:
+ 'privacy_url': 'nclouds://user:****@localhost/admin',
+ }),
+ ('nclouds://user:pass@localhost:8080/admin/', {
+ 'instance': plugins.NotifyNextCloud,
+ }),
+ ('ncloud://localhost:8080/admin?-HeaderKey=HeaderValue', {
+ 'instance': plugins.NotifyNextCloud,
+ }),
+ ('ncloud://user:pass@localhost:8081/admin', {
+ 'instance': plugins.NotifyNextCloud,
+ # force a failure
+ 'response': False,
+ 'requests_response_code': requests.codes.internal_server_error,
+ }),
+ ('ncloud://user:pass@localhost:8082/admin', {
+ 'instance': plugins.NotifyNextCloud,
+ # throw a bizzare code forcing us to fail to look it up
+ 'response': False,
+ 'requests_response_code': 999,
+ }),
+ ('ncloud://user:pass@localhost:8083/user1/user2/user3', {
+ 'instance': plugins.NotifyNextCloud,
+ # Throws a series of connection and transfer exceptions when this flag
+ # is set and tests that we gracfully handle them
+ 'test_requests_exceptions': True,
+ }),
+
##################################
# NotifyProwl
##################################