diff --git a/client/src/containers/NavigationLinks/view.jsx b/client/src/containers/NavigationLinks/view.jsx
index 3876702e..2f8ce8ca 100644
--- a/client/src/containers/NavigationLinks/view.jsx
+++ b/client/src/containers/NavigationLinks/view.jsx
@@ -1,6 +1,7 @@
import React from 'react';
import { NavLink, withRouter } from 'react-router-dom';
import NavBarChannelOptionsDropdown from '@components/NavBarChannelOptionsDropdown';
+import isApprovedChannel from '../../utils/isApprovedChannel';
const VIEW = 'VIEW';
const LOGOUT = 'LOGOUT';
@@ -31,7 +32,7 @@ class NavigationLinks extends React.Component {
const { site, channelLongId, channelName } = this.props;
return (
- {(!site.publishOnlyApproved || site.approvedChannels.includes(channelLongId)) && chan.longId === long)) ||
+ (name && short && channels.find(chan => chan.name === name && chan.shortId === short))
+ );
+}
+
+module.exports = isApprovedChannel;
diff --git a/server/controllers/api/channel/data/index.js b/server/controllers/api/channel/data/index.js
index c9ceebf4..440326b5 100644
--- a/server/controllers/api/channel/data/index.js
+++ b/server/controllers/api/channel/data/index.js
@@ -1,8 +1,7 @@
const { handleErrorResponse } = require('../../../utils/errorHandlers.js');
-
const getChannelData = require('./getChannelData.js');
-const { publishing: { serveOnlyApproved, approvedChannels } } = require('@config/siteConfig');
-
+const isApprovedChannel = require('../../../../utils/isApprovedChannel');
+const { publishing: { serveOnlyApproved } } = require('@config/siteConfig');
const NO_CHANNEL = 'NO_CHANNEL';
/*
@@ -15,12 +14,17 @@ const channelData = ({ ip, originalUrl, body, params }, res) => {
const channelName = params.channelName;
let channelClaimId = params.channelClaimId;
if (channelClaimId === 'none') channelClaimId = null;
- if (serveOnlyApproved && approvedChannels && !approvedChannels.includes(channelClaimId)) {
+
+ const chanObj = {};
+ if (channelName) chanObj.name = channelName;
+ if (channelClaimId) chanObj[(channelClaimId.length === 40 ? 'longId' : 'shortId')] = channelClaimId;
+ if (serveOnlyApproved && !isApprovedChannel(chanObj)) {
return res.status(404).json({
success: false,
message: 'This spee.ch instance serves limited content which does not include this asset',
});
}
+
getChannelData(channelName, channelClaimId)
.then(data => {
res.status(200).json({
diff --git a/server/controllers/api/claim/publish/index.js b/server/controllers/api/claim/publish/index.js
index 4f551053..c5a2bdbb 100644
--- a/server/controllers/api/claim/publish/index.js
+++ b/server/controllers/api/claim/publish/index.js
@@ -3,7 +3,8 @@ const logger = require('winston');
const { details: { host }, publishing: { disabled, disabledMessage } } = require('@config/siteConfig');
const { sendGATimingEvent } = require('../../../../utils/googleAnalytics.js');
-const { publishing: { publishOnlyApproved, approvedChannels } } = require('@config/siteConfig');
+const isApprovedChannel = require('../../../../utils/isApprovedChannel');
+const { publishing: { publishOnlyApproved } } = require('@config/siteConfig');
const { handleErrorResponse } = require('../../../utils/errorHandlers.js');
@@ -56,7 +57,7 @@ const claimPublish = ({ body, files, headers, ip, originalUrl, user, tor }, res)
// check channel authorization
authenticateUser(channelName, channelId, channelPassword, user)
.then(({ channelName, channelClaimId }) => {
- if (publishOnlyApproved && approvedChannels && !approvedChannels.includes(channelClaimId)) {
+ if (publishOnlyApproved && !isApprovedChannel({ longId: channelClaimId })) {
const error = {
name : UNAPPROVED_CHANNEL,
message: 'This spee.ch instance only allows publishing to approved channels',
diff --git a/server/controllers/assets/utils/getClaimIdAndServeAsset.js b/server/controllers/assets/utils/getClaimIdAndServeAsset.js
index 66486ba8..af81162c 100644
--- a/server/controllers/assets/utils/getClaimIdAndServeAsset.js
+++ b/server/controllers/assets/utils/getClaimIdAndServeAsset.js
@@ -1,6 +1,7 @@
const logger = require('winston');
const db = require('../../../models');
+const isApprovedChannel = require('../../../utils/isApprovedChannel');
const getClaimId = require('../../utils/getClaimId.js');
const { handleErrorResponse } = require('../../utils/errorHandlers.js');
@@ -13,7 +14,7 @@ const BLOCKED_CLAIM = 'BLOCKED_CLAIM';
const NO_FILE = 'NO_FILE';
const UNAPPROVED_CHANNEL = 'UNAPPROVED_CHANNEL';
-const { publishing: { serveOnlyApproved, approvedChannels } } = require('@config/siteConfig');
+const { publishing: { serveOnlyApproved } } = require('@config/siteConfig');
const getClaimIdAndServeAsset = (channelName, channelClaimId, claimName, claimId, originalUrl, ip, res) => {
getClaimId(channelName, channelClaimId, claimName, claimId)
@@ -28,7 +29,7 @@ const getClaimIdAndServeAsset = (channelName, channelClaimId, claimName, claimId
});
})
.then(claim => {
- if (serveOnlyApproved && !approvedChannels.includes(claim.dataValues.certificateId)) {
+ if (serveOnlyApproved && !isApprovedChannel({ longId: claim.dataValues.certificateId })) {
throw new Error(UNAPPROVED_CHANNEL);
}
logger.debug('Outpoint:', claim.dataValues.outpoint);
diff --git a/server/models/claim.js b/server/models/claim.js
index 55010987..6917d189 100644
--- a/server/models/claim.js
+++ b/server/models/claim.js
@@ -1,7 +1,8 @@
const logger = require('winston');
const returnShortId = require('./utils/returnShortId.js');
const { assetDefaults: { thumbnail: defaultThumbnail }, details: { host } } = require('@config/siteConfig');
-const { publishing: { serveOnlyApproved, approvedChannels } } = require('@config/siteConfig');
+const { publishing: { serveOnlyApproved } } = require('@config/siteConfig');
+const isApprovedChannel = require('../utils/isApprovedChannel');
const NO_CLAIM = 'NO_CLAIM';
const NOT_ALLOWED = 'NOT_ALLOWED';
@@ -364,7 +365,7 @@ module.exports = (sequelize, { STRING, BOOLEAN, INTEGER, TEXT, DECIMAL }) => {
where: { name, claimId },
})
.then(claimArray => {
- if (serveOnlyApproved && !approvedChannels.includes(claimArray[0].dataValues.certificateId)) {
+ if (serveOnlyApproved && !isApprovedChannel({ longId: claimArray[0].dataValues.certificateId })) {
reject(NOT_ALLOWED);
}
switch (claimArray.length) {
diff --git a/server/utils/isApprovedChannel.js b/server/utils/isApprovedChannel.js
new file mode 100644
index 00000000..e1b451e2
--- /dev/null
+++ b/server/utils/isApprovedChannel.js
@@ -0,0 +1,11 @@
+const { publishing: { approvedChannels } } = require('@config/siteConfig');
+
+function isApprovedChannel (channel, channels = approvedChannels) {
+ const { name, shortId: short, longId: long } = channel;
+ return Boolean(
+ (long && channels.find(chan => chan.longId === long)) ||
+ (name && short && channels.find(chan => chan.name === name && chan.shortId === short))
+ );
+}
+
+module.exports = isApprovedChannel;