]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Improve P2P & Privacy section
authorChocobozzz <me@florianbigard.com>
Wed, 27 Jun 2018 12:21:03 +0000 (14:21 +0200)
committerChocobozzz <me@florianbigard.com>
Wed, 27 Jun 2018 12:59:09 +0000 (14:59 +0200)
18 files changed:
client/src/app/+about/about-instance/about-instance.component.html [new file with mode: 0644]
client/src/app/+about/about-instance/about-instance.component.scss [moved from client/src/app/about/about.component.scss with 70% similarity]
client/src/app/+about/about-instance/about-instance.component.ts [moved from client/src/app/about/about.component.ts with 86% similarity]
client/src/app/+about/about-peertube/about-peertube.component.html [new file with mode: 0644]
client/src/app/+about/about-peertube/about-peertube.component.scss [new file with mode: 0644]
client/src/app/+about/about-peertube/about-peertube.component.ts [new file with mode: 0644]
client/src/app/+about/about-routing.module.ts [new file with mode: 0644]
client/src/app/+about/about.component.html [new file with mode: 0644]
client/src/app/+about/about.component.scss [new file with mode: 0644]
client/src/app/+about/about.component.ts [new file with mode: 0644]
client/src/app/+about/about.module.ts [moved from client/src/app/about/about.module.ts with 59% similarity]
client/src/app/+about/index.ts [moved from client/src/app/about/index.ts with 100% similarity]
client/src/app/about/about-routing.module.ts [deleted file]
client/src/app/about/about.component.html [deleted file]
client/src/app/app-routing.module.ts
client/src/app/app.module.ts
client/src/app/videos/+video-watch/video-watch.component.html
client/src/standalone/videos/embed.ts

diff --git a/client/src/app/+about/about-instance/about-instance.component.html b/client/src/app/+about/about-instance/about-instance.component.html
new file mode 100644 (file)
index 0000000..e433b00
--- /dev/null
@@ -0,0 +1,39 @@
+<div i18n class="about-instance-title">
+  About {{ instanceName }} instance
+</div>
+
+<div class="short-description">
+  <div>{{ shortDescription }}</div>
+</div>
+
+<div class="description">
+  <div i18n class="section-title">Description</div>
+
+  <div [innerHTML]="descriptionHTML"></div>
+</div>
+
+<div class="terms">
+  <div i18n class="section-title">Terms</div>
+
+  <div [innerHTML]="termsHTML"></div>
+</div>
+
+<div class="signup">
+  <div i18n class="section-title">Signup</div>
+
+  <div *ngIf="isSignupAllowed">
+    <ng-container i18n>User registration is allowed and</ng-container>
+
+    <ng-container i18n *ngIf="userVideoQuota !== -1">
+      this instance provides a baseline quota of {{ userVideoQuota | bytes: 0 }} space for the videos of its users.
+    </ng-container>
+
+    <ng-container i18n *ngIf="userVideoQuota === -1">
+      this instance provides unlimited space for the videos of its users.
+    </ng-container>
+  </div>
+
+  <div i18n *ngIf="isSignupAllowed === false">
+    User registration is currently not allowed.
+  </div>
+</div>
\ No newline at end of file
similarity index 70%
rename from client/src/app/about/about.component.scss
rename to client/src/app/+about/about-instance/about-instance.component.scss
index a63cd229cf294a0ed8d8fbca5714309456b7166d..b451e85aa452ea2c46911bc4c5c8eedc5d645653 100644 (file)
@@ -1,6 +1,12 @@
 @import '_variables';
 @import '_mixins';
 
+.about-instance-title {
+  font-size: 20px;
+  font-weight: bold;
+  margin-bottom: 15px;
+}
+
 .section-title {
   font-weight: $font-semibold;
   font-size: 20px;
similarity index 86%
rename from client/src/app/about/about.component.ts
rename to client/src/app/+about/about-instance/about-instance.component.ts
index c37b9318bef21ad23b1836fad39aca9fb79d2a37..354f52ce7956366a4e6be1f4ecba17b3a435d802 100644 (file)
@@ -5,12 +5,12 @@ import { NotificationsService } from 'angular2-notifications'
 import { I18n } from '@ngx-translate/i18n-polyfill'
 
 @Component({
-  selector: 'my-about',
-  templateUrl: './about.component.html',
-  styleUrls: [ './about.component.scss' ]
+  selector: 'my-about-instance',
+  templateUrl: './about-instance.component.html',
+  styleUrls: [ './about-instance.component.scss' ]
 })
 
-export class AboutComponent implements OnInit {
+export class AboutInstanceComponent implements OnInit {
   shortDescription = ''
   descriptionHTML = ''
   termsHTML = ''
diff --git a/client/src/app/+about/about-peertube/about-peertube.component.html b/client/src/app/+about/about-peertube/about-peertube.component.html
new file mode 100644 (file)
index 0000000..b0551f8
--- /dev/null
@@ -0,0 +1,97 @@
+<div i18n class="about-peertube-title">
+  About PeerTube
+</div>
+
+<div class="description">
+  <p i18n>PeerTube is a federated (ActivityPub) video streaming platform using P2P (WebTorrent) directly in the web browser.</p>
+
+  <p i18n>
+    It is a free and open-source software, under the <a href="https://github.com/Chocobozzz/PeerTube/blob/develop/LICENSE">AGPLv3 licence</a>.
+  </p>
+
+  <p i18n>
+    For more information, please visit <a target="_blank" rel="noopener noreferrer" href="https://joinpeertube.org">joinpeertube.org</a>.
+  </p>
+</div>
+
+<div id="p2p-privacy">
+  <div i18n class="section-title">P2P & Privacy</div>
+
+  <p i18n>
+    PeerTube uses the BitTorrent protocol to share bandwidth between users.
+    This implies that your IP address is stored in the instance's BitTorrent tracker as long as you download or watch the video.
+  </p>
+
+  <h4 i18n class="p2p-privacy-title">What are the consequences?</h4>
+
+  <p i18n>
+    In theory, someone with enough technical skills could create a script that tracks which IP is downloading which video.
+    In practice, this is much more difficult because:
+  </p>
+
+  <ul>
+    <li i18n>
+      An HTTP request has to be sent on each tracker for each video to spy.
+      If we want to spy all PeerTube's videos, we have to send as many requests as there are videos (so potentially a lot)
+    </li>
+
+    <li i18n>
+      For each request sent, the tracker returns random peers at a limited number.
+      For instance, if there are 1000 peers in the swarm and the tracker sends only 20 peers for each request, there must be at least 50 requests sent to know every peers in the swarm
+    </li>
+
+    <li i18n>
+      Those requests have to be sent regularly to know who starts/stops watching a video. It is easy to detect that kind of behaviour
+    </li>
+
+    <li i18n>
+      If an IP address is stored in the tracker, it doesn't mean that the person behind the IP (if this person exists) has watched the video
+    </li>
+
+    <li i18n>
+      The IP address is a vague information : usually, it regularly changes and can represent many persons or entities
+    </li>
+
+    <li i18n>
+      Web peers are not directly sent by the tracker: because we use WebRTC inside the web browser, the protocol is different from classic BitTorrent.
+      When you are in a web browser, you send a signal containing your IP address to the tracker that will randomly choose other peers to forward the information to.
+      See <a href="https://github.com/yciabaud/webtorrent/blob/beps/bep_webrtc.rst">this document</a> for more information
+    </li>
+  </ul>
+
+  <p i18n>
+    The worst-case scenario of an average person spying on their friends is quite unlikely.
+    There are much more effective ways to get that kind of information.
+  </p>
+
+  <h4 i18n class="p2p-privacy-title">How does PeerTube compares to YouTube?</h4>
+
+  <p i18n>
+    The threats to privacy in YouTube are different from PeerTube's.
+    In YouTube's case, the platform gathers a huge amount of your personal information (not only your IP) to analyze them and track you.
+    Moreover, YouTube is owned by Google/Alphabet, a company that tracks you across many websites (via AdSense or Google Analytics).
+  </p>
+
+  <h4 i18n class="p2p-privacy-title">What can I do to limit the exposure of my IP address?</h4>
+
+  <p i18n>
+    Your IP address is public so every time you consult a website, there is a number of actors (in addition to the final website) seeing your IP in their connection logs: ISP/routers/trackers/CDN and more.
+    PeerTube is transparent about it: we warn you that if you want to keep your IP private, you must use a VPN or Tor Browser.
+    Thinking that removing P2P from PeerTube will give you back anonymity doesn't make sense.
+  </p>
+
+  <h4 i18n class="p2p-privacy-title">What will be done to mitigate this problem?</h4>
+
+  <p i18n>
+    PeerTube is only in beta, and want to deliver the best countermeasures possible by the time the stable is released.
+    In the meantime, we want to test different ideas related to this issue:
+  </p>
+
+  <ul>
+    <li i18n>Set a limit to the number of peers sent by the tracker</li>
+    <li i18n>Set a limit on the request frequency received by the tracker (being tested)</li>
+    <li i18n>Ring a bell if there are unusual requests (being tested)</li>
+    <li i18n>Disable P2P from the administration interface</li>
+    <li i18n>An automatic video redundancy program: we wouldn't know if the IP downloaded the video on purpose or if it was the automatized program</li>
+  </ul>
+</div>
\ No newline at end of file
diff --git a/client/src/app/+about/about-peertube/about-peertube.component.scss b/client/src/app/+about/about-peertube/about-peertube.component.scss
new file mode 100644 (file)
index 0000000..1d8579e
--- /dev/null
@@ -0,0 +1,22 @@
+@import '_variables';
+@import '_mixins';
+
+.about-peertube-title {
+  font-size: 20px;
+  font-weight: bold;
+  margin-bottom: 15px;
+}
+
+.section-title {
+  font-weight: $font-semibold;
+  font-size: 20px;
+  margin-bottom: 5px;
+}
+
+.description {
+  margin-bottom: 30px;
+}
+
+.p2p-privacy-title {
+  margin-top: 15px;
+}
\ No newline at end of file
diff --git a/client/src/app/+about/about-peertube/about-peertube.component.ts b/client/src/app/+about/about-peertube/about-peertube.component.ts
new file mode 100644 (file)
index 0000000..64fd308
--- /dev/null
@@ -0,0 +1,10 @@
+import { Component } from '@angular/core'
+
+@Component({
+  selector: 'my-about-peertube',
+  templateUrl: './about-peertube.component.html',
+  styleUrls: [ './about-peertube.component.scss' ]
+})
+
+export class AboutPeertubeComponent {
+}
diff --git a/client/src/app/+about/about-routing.module.ts b/client/src/app/+about/about-routing.module.ts
new file mode 100644 (file)
index 0000000..c83c62c
--- /dev/null
@@ -0,0 +1,45 @@
+import { NgModule } from '@angular/core'
+import { RouterModule, Routes } from '@angular/router'
+import { MetaGuard } from '@ngx-meta/core'
+import { AboutComponent } from './about.component'
+import { AboutInstanceComponent } from '@app/+about/about-instance/about-instance.component'
+import { AboutPeertubeComponent } from '@app/+about/about-peertube/about-peertube.component'
+
+const aboutRoutes: Routes = [
+  {
+    path: '',
+    component: AboutComponent,
+    canActivateChild: [ MetaGuard ],
+    children: [
+      {
+        path: '',
+        redirectTo: 'instance',
+        pathMatch: 'full'
+      },
+      {
+        path: 'instance',
+        component: AboutInstanceComponent,
+        data: {
+          meta: {
+            title: 'About this instance'
+          }
+        }
+      },
+      {
+        path: 'peertube',
+        component: AboutPeertubeComponent,
+        data: {
+          meta: {
+            title: 'About PeerTube'
+          }
+        }
+      }
+    ]
+  }
+]
+
+@NgModule({
+  imports: [ RouterModule.forChild(aboutRoutes) ],
+  exports: [ RouterModule ]
+})
+export class AboutRoutingModule {}
diff --git a/client/src/app/+about/about.component.html b/client/src/app/+about/about.component.html
new file mode 100644 (file)
index 0000000..8c50835
--- /dev/null
@@ -0,0 +1,14 @@
+<div class="row">
+  <div class="sub-menu">
+
+    <div class="links">
+      <a i18n routerLink="instance" routerLinkActive="active" class="title-page">Instance</a>
+
+      <a i18n routerLink="peertube" routerLinkActive="active" class="title-page">PeerTube</a>
+    </div>
+  </div>
+
+  <div class="margin-content">
+    <router-outlet></router-outlet>
+  </div>
+</div>
\ No newline at end of file
diff --git a/client/src/app/+about/about.component.scss b/client/src/app/+about/about.component.scss
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/client/src/app/+about/about.component.ts b/client/src/app/+about/about.component.ts
new file mode 100644 (file)
index 0000000..7b65d92
--- /dev/null
@@ -0,0 +1,11 @@
+import { Component } from '@angular/core'
+
+@Component({
+  selector: 'my-about',
+  templateUrl: './about.component.html',
+  styleUrls: [ './about.component.scss' ]
+})
+
+export class AboutComponent {
+
+}
similarity index 59%
rename from client/src/app/about/about.module.ts
rename to client/src/app/+about/about.module.ts
index da3163f4378b591847fd4b693ce600f0148d08ce..ff6e8ef414a41848ae64d924b00d348f6393bf5e 100644 (file)
@@ -3,6 +3,8 @@ import { NgModule } from '@angular/core'
 import { AboutRoutingModule } from './about-routing.module'
 import { AboutComponent } from './about.component'
 import { SharedModule } from '../shared'
+import { AboutInstanceComponent } from '@app/+about/about-instance/about-instance.component'
+import { AboutPeertubeComponent } from '@app/+about/about-peertube/about-peertube.component'
 
 @NgModule({
   imports: [
@@ -11,7 +13,9 @@ import { SharedModule } from '../shared'
   ],
 
   declarations: [
-    AboutComponent
+    AboutComponent,
+    AboutInstanceComponent,
+    AboutPeertubeComponent
   ],
 
   exports: [
diff --git a/client/src/app/about/about-routing.module.ts b/client/src/app/about/about-routing.module.ts
deleted file mode 100644 (file)
index 11a650c..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-import { NgModule } from '@angular/core'
-import { RouterModule, Routes } from '@angular/router'
-import { MetaGuard } from '@ngx-meta/core'
-import { AboutComponent } from './about.component'
-
-const aboutRoutes: Routes = [
-  {
-    path: 'about',
-    component: AboutComponent,
-    canActivate: [ MetaGuard ],
-    data: {
-      meta: {
-        title: 'About'
-      }
-    }
-  }
-]
-
-@NgModule({
-  imports: [ RouterModule.forChild(aboutRoutes) ],
-  exports: [ RouterModule ]
-})
-export class AboutRoutingModule {}
diff --git a/client/src/app/about/about.component.html b/client/src/app/about/about.component.html
deleted file mode 100644 (file)
index dc13f78..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-<div class="margin-content">
-  <div i18n class="title-page title-page-single">
-    Welcome to the {{ instanceName }} instance
-  </div>
-
-  <div class="short-description">
-    <div>{{ shortDescription }}</div>
-  </div>
-
-  <div class="description">
-    <div i18n class="section-title">Description</div>
-
-    <div [innerHTML]="descriptionHTML"></div>
-  </div>
-
-  <div class="terms">
-    <div i18n class="section-title">Terms</div>
-
-    <div [innerHTML]="termsHTML"></div>
-  </div>
-
-  <div class="signup">
-    <div i18n class="section-title">Signup</div>
-
-    <div *ngIf="isSignupAllowed">
-      <ng-container i18n>User registration is allowed and</ng-container>
-
-      <ng-container i18n *ngIf="userVideoQuota !== -1">
-        this instance provides a baseline quota of {{ userVideoQuota | bytes: 0 }} space for the videos of its users.
-      </ng-container>
-
-      <ng-container i18n *ngIf="userVideoQuota === -1">
-        this instance provides unlimited space for the videos of its users.
-      </ng-container>
-    </div>
-
-    <div i18n *ngIf="isSignupAllowed === false">
-      User registration is currently not allowed.
-    </div>
-  </div>
-
-  <div id="p2p-privacy">
-    <div i18n class="section-title">P2P & Privacy</div>
-
-    <p i18n>
-      PeerTube uses the BitTorrent protocol to share bandwidth between users. It implies that your public IP address is stored in the public BitTorrent tracker of the video PeerTube instance as long as you're watching the video.
-      If you want to keep your public IP address private, please use a VPN or the Tor Browser.
-    </p>
-  </div>
-</div>
index 04c53548eb375999361ab90a478ed9964450bcaf..0b31bf453a821ed4579604649adb7893e08f61c8 100644 (file)
@@ -20,6 +20,10 @@ const routes: Routes = [
     path: 'video-channels',
     loadChildren: './+video-channels/video-channels.module#VideoChannelsModule'
   },
+  {
+    path: 'about',
+    loadChildren: './+about/about.module#AboutModule'
+  },
   {
     path: '**',
     loadChildren: './+page-not-found/page-not-found.module#PageNotFoundModule'
index 003c91009bc44ca7bc6e453fe49f89ecf22a3eac..9cffdd31e7ccc8fe136202a4b2477d2b6e4980ef 100644 (file)
@@ -1,6 +1,5 @@
 import { LOCALE_ID, NgModule, TRANSLATIONS, TRANSLATIONS_FORMAT } from '@angular/core'
 import { BrowserModule } from '@angular/platform-browser'
-import { AboutModule } from '@app/about'
 import { ServerService } from '@app/core'
 import { ResetPasswordModule } from '@app/reset-password'
 
@@ -53,7 +52,6 @@ export function metaFactory (serverService: ServerService): MetaLoader {
     SignupModule,
     SharedModule,
     VideosModule,
-    AboutModule,
 
     MetaModule.forRoot({
       provide: MetaLoader,
index 208375e334d97bd653b717081a733448e88c41d2..492568d3cc7a7c6a8c9f5485643319ad238f24ef 100644 (file)
       <ng-container i18n>
         The sharing system used by this video implies that some technical information about your system (such as a public IP address) can be accessed publicly.
       </ng-container>
-      <a i18n i18n-title title="Get more information" target="_blank" rel="noopener noreferrer" href="/about#p2p-privacy">More information</a>
+      <a i18n i18n-title title="Get more information" target="_blank" rel="noopener noreferrer" href="/about/peertube">More information</a>
     </div>
 
     <div i18n class="privacy-concerns-okay" (click)="acceptedPrivacyConcern()">
index bf0eb484ee70a3397954e74f8971fc88d07e84a9..d8db2a1197b1544d06cd8199549b70fe85b226e5 100644 (file)
@@ -107,7 +107,7 @@ loadLocale(window.location.origin, videojs, navigator.language)
 
       player.dock({
         title: videoInfo.name,
-        description: player.localize('Uses P2P, others may know you are watching this video.')
+        description: player.localize('Uses P2P, others may know your IP is downloading this video.')
       })
 
       addContextMenu(player, window.location.origin + videoInfo.embedPath)