Add isNSFW instance configuration key
authorChocobozzz <me@florianbigard.com>
Wed, 20 Feb 2019 14:36:43 +0000 (15:36 +0100)
committerChocobozzz <me@florianbigard.com>
Wed, 20 Feb 2019 14:36:43 +0000 (15:36 +0100)
14 files changed:
client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.html
client/src/app/+admin/config/edit-custom-config/edit-custom-config.component.ts
client/src/app/core/server/server.service.ts
client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts
config/default.yaml
config/production.yaml.example
server/controllers/api/config.ts
server/initializers/checker-before-init.ts
server/initializers/constants.ts
server/tests/api/check-params/config.ts
server/tests/api/server/config.ts
shared/models/server/custom-config.model.ts
shared/models/server/server-config.model.ts
shared/utils/server/config.ts

index 52eb00d93f4accf0039190e53324ebb9e71d7abc..b7d95bc22cf8e5fcde1541b85acd09b8f183efd7 100644 (file)
             <div *ngIf="formErrors.instance.terms" class="form-error">{{ formErrors.instance.terms }}</div>
           </div>
 
+          <div class="form-group">
+            <my-peertube-checkbox
+              inputName="instanceIsNSFW" formControlName="isNSFW"
+              i18n-labelText labelText="Dedicated to sensitive or NSFW content"
+              i18n-helpHtml helpHtml="Enabling it will allow other administrators to know that you are mainly federating sensitive content.<br /><br />
+              Moreover, the NSFW checkbox on video upload will be automatically checked by default."
+            ></my-peertube-checkbox>
+          </div>
+
           <div class="form-group">
             <label i18n for="instanceDefaultClientRoute">Default client route</label>
             <div class="peertube-select-container">
index 654a076b0d242088c3bc2567ac4eb7ae3990a90b..45605e0fe7ac08f5bd810e33a604e1445bae73ec 100644 (file)
@@ -66,6 +66,7 @@ export class EditCustomConfigComponent extends FormReactive implements OnInit {
         description: null,
         terms: null,
         defaultClientRoute: null,
+        isNSFW: false,
         defaultNSFWPolicy: null,
         customizations: {
           javascript: null,
index c868ccdcc26abc8e6a746234398fa6bab5339ed4..10acf6e72d4a4723488a1586779745768c047588 100644 (file)
@@ -4,7 +4,6 @@ import { Inject, Injectable, LOCALE_ID } from '@angular/core'
 import { peertubeLocalStorage } from '@app/shared/misc/peertube-local-storage'
 import { Observable, of, ReplaySubject } from 'rxjs'
 import { getCompleteLocale, ServerConfig } from '../../../../../shared'
-import { About } from '../../../../../shared/models/server/about.model'
 import { environment } from '../../../environments/environment'
 import { VideoConstant, VideoPrivacy } from '../../../../../shared/models/videos'
 import { isDefaultLocale, peertubeTranslate } from '../../../../../shared/models/i18n'
@@ -32,6 +31,7 @@ export class ServerService {
       shortDescription: 'PeerTube, a federated (ActivityPub) video streaming platform  ' +
                         'using P2P (BitTorrent) directly in the web browser with WebTorrent and Angular.',
       defaultClientRoute: '',
+      isNSFW: false,
       defaultNSFWPolicy: 'do_not_list' as 'do_not_list',
       customizations: {
         javascript: '',
index 9cadf52cb5d9c32f64d7e6c23385f918179c58c5..7399f39ee677f9f3e105e17679cdaed41ea7e6c1 100644 (file)
@@ -163,7 +163,7 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy
     }
 
     const privacy = this.firstStepPrivacyId.toString()
-    const nsfw = false
+    const nsfw = this.serverService.getConfig().instance.isNSFW
     const waitTranscoding = true
     const commentsEnabled = true
     const downloadEnabled = true
index 7af615a8206e95208814580b5beea2be199bf1b8..1f6046a1b58b53ae6a68ba60775dcbf26f7b4305 100644 (file)
@@ -163,6 +163,10 @@ instance:
   description: 'Welcome to this PeerTube instance!' # Support markdown
   terms: 'No terms for now.' # Support markdown
   default_client_route: '/videos/trending'
+  # Whether or not the instance is dedicated to NSFW content
+  # Enabling it will allow other administrators to know that you are mainly federating sensitive content
+  # Moreover, the NSFW checkbox on video upload will be automatically checked by default
+  is_nsfw: false
   # By default, "do_not_list" or "blur" or "display" NSFW videos
   # Could be overridden per user with a setting
   default_nsfw_policy: 'do_not_list'
index 413e3c478f9ad53d39dbb96b2344d2bcbb252bf3..ae8fb2d5117e26801aec658a4c4ab61e6160092c 100644 (file)
@@ -177,6 +177,10 @@ instance:
   description: '' # Support markdown
   terms: '' # Support markdown
   default_client_route: '/videos/trending'
+  # Whether or not the instance is dedicated to NSFW content
+  # Enabling it will allow other administrators to know that you are mainly federating sensitive content
+  # Moreover, the NSFW checkbox on video upload will be automatically checked by default
+  is_nsfw: false
   # By default, "do_not_list" or "blur" or "display" NSFW videos
   # Could be overridden per user with a setting
   default_nsfw_policy: 'do_not_list'
index 1f3341bc0c2c21c71f6239f40b44844cb60901a7..6497cda3ce3ae8fa6e450ff6e2e075fce6836e75 100644 (file)
@@ -58,6 +58,7 @@ async function getConfig (req: express.Request, res: express.Response) {
       name: CONFIG.INSTANCE.NAME,
       shortDescription: CONFIG.INSTANCE.SHORT_DESCRIPTION,
       defaultClientRoute: CONFIG.INSTANCE.DEFAULT_CLIENT_ROUTE,
+      isNSFW: CONFIG.INSTANCE.IS_NSFW,
       defaultNSFWPolicy: CONFIG.INSTANCE.DEFAULT_NSFW_POLICY,
       customizations: {
         javascript: CONFIG.INSTANCE.CUSTOMIZATIONS.JAVASCRIPT,
@@ -134,7 +135,7 @@ async function getConfig (req: express.Request, res: express.Response) {
   return res.json(json)
 }
 
-function getAbout (req: express.Request, res: express.Response, next: express.NextFunction) {
+function getAbout (req: express.Request, res: express.Response) {
   const about: About = {
     instance: {
       name: CONFIG.INSTANCE.NAME,
@@ -147,13 +148,13 @@ function getAbout (req: express.Request, res: express.Response, next: express.Ne
   return res.json(about).end()
 }
 
-async function getCustomConfig (req: express.Request, res: express.Response, next: express.NextFunction) {
+async function getCustomConfig (req: express.Request, res: express.Response) {
   const data = customConfig()
 
   return res.json(data).end()
 }
 
-async function deleteCustomConfig (req: express.Request, res: express.Response, next: express.NextFunction) {
+async function deleteCustomConfig (req: express.Request, res: express.Response) {
   await remove(CONFIG.CUSTOM_FILE)
 
   auditLogger.delete(getAuditIdFromRes(res), new CustomConfigAuditView(customConfig()))
@@ -166,7 +167,7 @@ async function deleteCustomConfig (req: express.Request, res: express.Response,
   return res.json(data).end()
 }
 
-async function updateCustomConfig (req: express.Request, res: express.Response, next: express.NextFunction) {
+async function updateCustomConfig (req: express.Request, res: express.Response) {
   const oldCustomConfigAuditKeys = new CustomConfigAuditView(customConfig())
 
   // camelCase to snake_case key + Force number conversion
@@ -203,6 +204,7 @@ function customConfig (): CustomConfig {
       shortDescription: CONFIG.INSTANCE.SHORT_DESCRIPTION,
       description: CONFIG.INSTANCE.DESCRIPTION,
       terms: CONFIG.INSTANCE.TERMS,
+      isNSFW: CONFIG.INSTANCE.IS_NSFW,
       defaultClientRoute: CONFIG.INSTANCE.DEFAULT_CLIENT_ROUTE,
       defaultNSFWPolicy: CONFIG.INSTANCE.DEFAULT_NSFW_POLICY,
       customizations: {
index 29fdb263ecfd31691e4bab181241df6ecab92fb1..230fdd3566a2986590cb809de263ac8525689c53 100644 (file)
@@ -23,7 +23,7 @@ function checkMissedConfig () {
     'import.videos.http.enabled', 'import.videos.torrent.enabled',
     'trending.videos.interval_days',
     'instance.name', 'instance.short_description', 'instance.description', 'instance.terms', 'instance.default_client_route',
-    'instance.default_nsfw_policy', 'instance.robots', 'instance.securitytxt',
+    'instance.is_nsfw', 'instance.default_nsfw_policy', 'instance.robots', 'instance.securitytxt',
     'services.twitter.username', 'services.twitter.whitelisted'
   ]
   const requiredAlternatives = [
index c1be7f326f1638d3d5c6bd77e2a35d9f0cf01b00..bb2c6765f27fb62e7ea50e8b4bfd8f505d3afd6c 100644 (file)
@@ -288,6 +288,7 @@ const CONFIG = {
     get SHORT_DESCRIPTION () { return config.get<string>('instance.short_description') },
     get DESCRIPTION () { return config.get<string>('instance.description') },
     get TERMS () { return config.get<string>('instance.terms') },
+    get IS_NSFW () { return config.get<boolean>('instance.is_nsfw') },
     get DEFAULT_CLIENT_ROUTE () { return config.get<string>('instance.default_client_route') },
     get DEFAULT_NSFW_POLICY () { return config.get<NSFWPolicyType>('instance.default_nsfw_policy') },
     CUSTOMIZATIONS: {
index 3895c4f9ae73a5b1de1498ae94b81479bb15b2f4..c6b460f23566df2b34f8761c014086355ca19e8b 100644 (file)
@@ -19,6 +19,7 @@ describe('Test config API validators', function () {
       shortDescription: 'my short description',
       description: 'my super description',
       terms: 'my super terms',
+      isNSFW: true,
       defaultClientRoute: '/videos/recently-added',
       defaultNSFWPolicy: 'blur',
       customizations: {
index 3be1c94314e94e353b74d086022f51f2f68e8b13..42927605d6affc2cf99c4e9307d878eef4f76da4 100644 (file)
@@ -30,6 +30,7 @@ function checkInitialConfig (data: CustomConfig) {
   expect(data.instance.description).to.equal('Welcome to this PeerTube instance!')
   expect(data.instance.terms).to.equal('No terms for now.')
   expect(data.instance.defaultClientRoute).to.equal('/videos/trending')
+  expect(data.instance.isNSFW).to.be.false
   expect(data.instance.defaultNSFWPolicy).to.equal('display')
   expect(data.instance.customizations.css).to.be.empty
   expect(data.instance.customizations.javascript).to.be.empty
@@ -69,6 +70,7 @@ function checkUpdatedConfig (data: CustomConfig) {
   expect(data.instance.description).to.equal('my super description')
   expect(data.instance.terms).to.equal('my super terms')
   expect(data.instance.defaultClientRoute).to.equal('/videos/recently-added')
+  expect(data.instance.isNSFW).to.be.true
   expect(data.instance.defaultNSFWPolicy).to.equal('blur')
   expect(data.instance.customizations.javascript).to.equal('alert("coucou")')
   expect(data.instance.customizations.css).to.equal('body { background-color: red; }')
@@ -163,6 +165,7 @@ describe('Test config', function () {
         description: 'my super description',
         terms: 'my super terms',
         defaultClientRoute: '/videos/recently-added',
+        isNSFW: true,
         defaultNSFWPolicy: 'blur' as 'blur',
         customizations: {
           javascript: 'alert("coucou")',
index b42ff90c64eb2b8b77ea2351f10aa8c6d21e7ba0..20b261426c8c1f32fdbbc69b1c44e2a6a68d836f 100644 (file)
@@ -6,6 +6,7 @@ export interface CustomConfig {
     shortDescription: string
     description: string
     terms: string
+    isNSFW: boolean
     defaultClientRoute: string
     defaultNSFWPolicy: NSFWPolicyType
     customizations: {
index baafed31faf8a7a6329399e9cc8b56f02d5d0091..0200d88ca7fc2806e60a3c322bb95e3fdf30838e 100644 (file)
@@ -8,6 +8,7 @@ export interface ServerConfig {
     name: string
     shortDescription: string
     defaultClientRoute: string
+    isNSFW: boolean
     defaultNSFWPolicy: NSFWPolicyType
     customizations: {
       javascript: string
index 29c24cff97f6f18b99e2cea0ac83fdd575951cb7..0e16af0f2f90d99c632b9f2b5fe746997adf4226 100644 (file)
@@ -52,6 +52,7 @@ function updateCustomSubConfig (url: string, token: string, newConfig: any) {
       description: 'my super description',
       terms: 'my super terms',
       defaultClientRoute: '/videos/recently-added',
+      isNSFW: true,
       defaultNSFWPolicy: 'blur',
       customizations: {
         javascript: 'alert("coucou")',