secure-scuttlebot classic
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