From cd699d757fc0f29ac4b55ecfdd212768e1721a94 Mon Sep 17 00:00:00 2001
From: cgeek <cem.moreau@gmail.com>
Date: Thu, 21 Jun 2018 18:25:53 +0200
Subject: [PATCH] [enh] sync: reject too old peers

---
 app/lib/common-libs/constants.ts | 4 +++-
 app/lib/common-libs/errors.ts    | 1 +
 app/service/PeeringService.ts    | 7 +++++++
 3 files changed, 11 insertions(+), 1 deletion(-)
 mode change 100644 => 100755 app/lib/common-libs/constants.ts
 mode change 100644 => 100755 app/lib/common-libs/errors.ts
 mode change 100644 => 100755 app/service/PeeringService.ts

diff --git a/app/lib/common-libs/constants.ts b/app/lib/common-libs/constants.ts
old mode 100644
new mode 100755
index 79fa4a2c1..30d4f4b7d
--- a/app/lib/common-libs/constants.ts
+++ b/app/lib/common-libs/constants.ts
@@ -302,7 +302,9 @@ export const CommonConstants = {
   BLOCK_MAX_TX_CHAINING_DEPTH: 5,
 
   CONST_BLOCKS_CHUNK: 250,
-  BLOCKS_IN_MEMORY_MAX: 288 * 60 // 60 days of blocks
+  BLOCKS_IN_MEMORY_MAX: 288 * 60, // 60 days of blocks
+
+  MAX_AGE_OF_PEER_IN_BLOCKS: 200, // blocks
 }
 
 function exact (regexpContent:string) {
diff --git a/app/lib/common-libs/errors.ts b/app/lib/common-libs/errors.ts
old mode 100644
new mode 100755
index 74d0c31b3..ffaa416c8
--- a/app/lib/common-libs/errors.ts
+++ b/app/lib/common-libs/errors.ts
@@ -1,5 +1,6 @@
 
 export enum DataErrors {
+  TOO_OLD_PEER,
   LOKI_DIVIDEND_GET_WRITTEN_ON_SHOULD_NOT_BE_USED,
   LOKI_DIVIDEND_REMOVE_BLOCK_SHOULD_NOT_BE_USED,
   NEGATIVE_BALANCE,
diff --git a/app/service/PeeringService.ts b/app/service/PeeringService.ts
old mode 100644
new mode 100755
index 8e34626a5..41c666070
--- a/app/service/PeeringService.ts
+++ b/app/service/PeeringService.ts
@@ -23,6 +23,8 @@ import {Server} from "../../server"
 import {GlobalFifoPromise} from "./GlobalFifoPromise"
 import {DBPeer} from "../lib/db/DBPeer"
 import {Underscore} from "../lib/common-libs/underscore"
+import {CommonConstants} from "../lib/common-libs/constants"
+import {DataErrors} from "../lib/common-libs/errors"
 
 const util           = require('util');
 const events         = require('events');
@@ -104,6 +106,7 @@ export class PeeringService {
           }
         }
         if (thePeer.block == constants.PEER.SPECIAL_BLOCK) {
+          thePeer.block = constants.PEER.SPECIAL_BLOCK;
           thePeer.statusTS = 0;
           thePeer.status = 'UP';
         } else {
@@ -115,6 +118,10 @@ export class PeeringService {
             thePeer.statusTS = 0;
             thePeer.status = 'UP';
           }
+          const current = await this.dal.getBlockCurrent()
+          if ((!block && current.number > CommonConstants.MAX_AGE_OF_PEER_IN_BLOCKS) || (block && current.number - block.number > CommonConstants.MAX_AGE_OF_PEER_IN_BLOCKS)) {
+            throw Error(DataErrors[DataErrors.TOO_OLD_PEER])
+          }
         }
         sigTime = block ? block.medianTime : 0;
         thePeer.statusTS = sigTime;
-- 
GitLab