secure-scuttlebot classic
at main 6.2 kB view raw
1var valid = require('muxrpc-validation') 2var zerr = require('zerr') 3var ref = require('../plugins/ref') 4 5// errors 6var MissingAttr = zerr('Usage', 'Param % must have a .% of type "%"') 7var AttrType = zerr('Usage', '.% of param % must be of type "%"') 8 9function isFilter (v) { 10 return (v == '@' || v == '%' || v == '&') 11} 12 13module.exports = valid({ 14 msgId: function (v) { 15 if (!ref.isMsg(v)) 16 return 'type' 17 }, 18 msgLink: function (v) { 19 if (!ref.isMsgLink(v)) 20 return 'type' 21 }, 22 feedId: function (v) { 23 if (!ref.isFeed(v)) 24 return 'type' 25 }, 26 blobId: function (v) { 27 if (!ref.isBlob(v)) 28 return 'type' 29 }, 30 31 msgContent: function (v, n) { 32 var err = this.get('object')(v, n) 33 if (err) return err 34 if (!v.type || typeof v.type != 'string') 35 return MissingAttr(n, 'type', 'string') 36 }, 37 38 msg: function (v, n) { 39 var err = this.get('object')(v, n) 40 if (err) 41 return err 42 43 //allow content to be string. (i.e. for encrypted messages) 44 //or object with type string 45 if(!v.content) 46 return MissingAttr(n, 'content', 'object|string') 47 else if(typeof v.content === 'string') 48 ; //check if it's base64? 49 else if('object' === typeof v.content) { 50 if(!v.content.type || typeof v.content.type != 'string') 51 return MissingAttr(n, 'content.type', 'string') 52 } 53 else 54 return MissingAttr(n, 'content', 'object|string') 55 56 // .author 57 if (!ref.isFeed(v.author)) 58 return MissingAttr(n, 'author', 'feedId') 59 60 // .sequence 61 if (typeof v.sequence != 'number') 62 return MissingAttr(n, 'sequence', 'number') 63 64 // .previous 65 if (v.sequence > 1 && !ref.isMsg(v.previous)) 66 return MissingAttr(n, 'previous', 'msgId') 67 else if(v.sequence == 1 && v.previous != null) 68 return MissingAttr(n, 'previous', 'null') 69 70 // .timestamp 71 if (typeof v.timestamp != 'number') 72 return MissingAttr(n, 'timestamp', 'number') 73 74 // .hash 75 if (v.hash != 'sha256') 76 return zerr('Usage', 'Param % must have .hash set to "sha256"')(n) 77 78 // .signature 79 if (typeof v.signature != 'string') 80 return MissingAttr(n, 'signature', 'string') 81 }, 82 83 readStreamOpts: function (v, n) { 84 var err = this.get('object')(v, n) 85 if (err) 86 return err 87 88 // .live 89 if (v.live && typeof v.live != 'boolean' && typeof v.live != 'number') 90 return AttrType(n, 'live', 'boolean') 91 92 // .reverse 93 if (v.reverse && typeof v.reverse != 'boolean' && typeof v.reverse != 'number') 94 return AttrType(n, 'reverse', 'boolean') 95 96 // .keys 97 if (v.keys && typeof v.keys != 'boolean' && typeof v.keys != 'number') 98 return AttrType(n, 'keys', 'boolean') 99 100 // .values 101 if (v.values && typeof v.values != 'boolean' && typeof v.values != 'number') 102 return AttrType(n, 'values', 'boolean') 103 104 // .limit 105 if (v.limit && typeof v.limit != 'number') 106 return AttrType(n, 'limit', 'number') 107 108 // .fillCache 109 if (v.fillCache && typeof v.fillCache != 'boolean' && typeof v.fillCache != 'number') 110 return AttrType(n, 'fillCache', 'boolean') 111 }, 112 113 createHistoryStreamOpts: function (v, n) { 114 // .id 115 if (!ref.isFeed(v.id)) 116 return MissingAttr(n, 'id', 'feedId') 117 118 // .seq 119 if (v.seq && typeof v.seq != 'number') 120 return AttrType(n, 'seq', 'number') 121 122 // .live 123 if (v.live && typeof v.live != 'boolean' && typeof v.live != 'number') 124 return AttrType(n, 'live', 'boolean') 125 126 // .limit 127 if (v.limit && typeof v.limit != 'number') 128 return AttrType(n, 'limit', 'number') 129 130 // .keys 131 if (v.keys && typeof v.keys != 'boolean' && typeof v.keys != 'number') 132 return AttrType(n, 'keys', 'boolean') 133 134 // .values 135 if (v.values && typeof v.values != 'boolean' && typeof v.values != 'number') 136 return AttrType(n, 'values', 'boolean') 137 }, 138 139 createUserStreamOpts: function (v, n) { 140 var err = this.get('readStreamOpts')(v, n) 141 if (err) 142 return err 143 144 // .id 145 if (!ref.isFeed(v.id)) 146 return MissingAttr(n, 'id', 'feedId') 147 }, 148 149 messagesByTypeOpts: function (v, n) { 150 var err = this.get('readStreamOpts')(v, n) 151 if (err) 152 return err 153 154 // .type 155 if (typeof v.type != 'string') 156 return MissingAttr(n, 'type', 'string') 157 }, 158 159 linksOpts: function (v, n) { 160 var err = this.get('object')(v, n) 161 if (err) 162 return err 163 164 // .source 165 if (v.source && !ref.isLink(v.source) && !isFilter(v.source)) 166 return AttrType(n, 'source', 'id|filter') 167 168 // .dest 169 if (v.dest && !ref.isLink(v.dest) && !isFilter(v.dest)) 170 return AttrType(n, 'dest', 'id|filter') 171 172 // .rel 173 if (v.rel && typeof v.rel != 'string') 174 return AttrType(n, 'rel', 'string') 175 176 // .live 177 if (v.live && typeof v.live != 'boolean' && typeof v.live != 'number') 178 return AttrType(n, 'live', 'boolean') 179 180 // .reverse 181 if (v.reverse && typeof v.reverse != 'boolean' && typeof v.reverse != 'number') 182 return AttrType(n, 'reverse', 'boolean') 183 184 // .keys 185 if (v.keys && typeof v.keys != 'boolean' && typeof v.keys != 'number') 186 return AttrType(n, 'keys', 'boolean') 187 188 // .values 189 if (v.values && typeof v.values != 'boolean' && typeof v.values != 'number') 190 return AttrType(n, 'values', 'boolean') 191 }, 192 193 isBlockedOpts: function (v, n) { 194 var err = this.get('object')(v, n) 195 if (err) 196 return err 197 198 // .source 199 if (v.source && !ref.isFeed(v.source)) 200 return AttrType(n, 'source', 'feedId') 201 202 // .dest 203 if (v.dest && !ref.isFeed(v.dest)) 204 return AttrType(n, 'dest', 'feedId') 205 }, 206 207 createFriendStreamOpts: function (v, n) { 208 var err = this.get('object')(v, n) 209 if (err) 210 return err 211 212 // .start 213 if (v.start && !ref.isFeed(v.start)) 214 return AttrType(n, 'start', 'feedId') 215 216 // .graph 217 if (v.graph && typeof v.graph != 'string') 218 return AttrType(n, 'graph', 'string') 219 220 // .dunbar 221 if (v.dunbar && typeof v.dunbar != 'number') 222 return AttrType(n, 'dunbar', 'number') 223 224 // .hops 225 if (v.hops && typeof v.hops != 'number') 226 return AttrType(n, 'hops', 'number') 227 } 228}) 229 230 231 232 233 234 235 236