1 | var assert = require('assert-plus');
|
2 | var util = require('util');
|
3 |
|
4 | var asn1 = require('asn1');
|
5 |
|
6 | var Control = require('./control');
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | var BerReader = asn1.BerReader;
|
12 | var BerWriter = asn1.BerWriter;
|
13 |
|
14 |
|
15 |
|
16 |
|
17 | function ServerSideSortingRequestControl(options) {
|
18 | assert.optionalObject(options);
|
19 | options = options || {};
|
20 | options.type = ServerSideSortingRequestControl.OID;
|
21 | if (options.value) {
|
22 | if (Buffer.isBuffer(options.value)) {
|
23 | this.parse(options.value);
|
24 | } else if (Array.isArray(options.value)) {
|
25 | assert.arrayOfObject(options.value, 'options.value must be Objects');
|
26 | for (var i = 0; i < options.value.length; i++) {
|
27 | if (!options.value[i].hasOwnProperty('attributeType')) {
|
28 | throw new Error('Missing required key: attributeType');
|
29 | }
|
30 | }
|
31 | this._value = options.value;
|
32 | } else if (typeof (options.value) === 'object') {
|
33 | if (!options.value.hasOwnProperty('attributeType')) {
|
34 | throw new Error('Missing required key: attributeType');
|
35 | }
|
36 | this._value = [options.value];
|
37 | } else {
|
38 | throw new TypeError('options.value must be a Buffer, Array or Object');
|
39 | }
|
40 | options.value = null;
|
41 | }
|
42 | Control.call(this, options);
|
43 | }
|
44 | util.inherits(ServerSideSortingRequestControl, Control);
|
45 | Object.defineProperties(ServerSideSortingRequestControl.prototype, {
|
46 | value: {
|
47 | get: function () { return this._value || []; },
|
48 | configurable: false
|
49 | }
|
50 | });
|
51 |
|
52 | ServerSideSortingRequestControl.prototype.parse = function parse(buffer) {
|
53 | assert.ok(buffer);
|
54 |
|
55 | var ber = new BerReader(buffer);
|
56 | var item;
|
57 | if (ber.readSequence(0x30)) {
|
58 | this._value = [];
|
59 |
|
60 | while (ber.readSequence(0x30)) {
|
61 | item = {};
|
62 | item.attributeType = ber.readString(asn1.Ber.OctetString);
|
63 | if (ber.peek() == 0x80) {
|
64 | item.orderingRule = ber.readString(0x80);
|
65 | }
|
66 | if (ber.peek() == 0x81) {
|
67 | item.reverseOrder = (ber._readTag(0x81) === 0 ? false : true);
|
68 | }
|
69 | this._value.push(item);
|
70 | }
|
71 | return true;
|
72 | }
|
73 | return false;
|
74 | };
|
75 |
|
76 | ServerSideSortingRequestControl.prototype._toBer = function (ber) {
|
77 | assert.ok(ber);
|
78 |
|
79 | if (!this._value || this.value.length === 0)
|
80 | return;
|
81 |
|
82 | var writer = new BerWriter();
|
83 | writer.startSequence(0x30);
|
84 | for (var i = 0; i < this.value.length; i++) {
|
85 | var item = this.value[i];
|
86 | writer.startSequence(0x30);
|
87 | if (item.attributeType) {
|
88 | writer.writeString(item.attributeType, asn1.Ber.OctetString);
|
89 | }
|
90 | if (item.orderingRule) {
|
91 | writer.writeString(item.orderingRule, 0x80);
|
92 | }
|
93 | if (item.reverseOrder) {
|
94 | writer.writeBoolean(item.reverseOrder, 0x81);
|
95 | }
|
96 | writer.endSequence();
|
97 | }
|
98 | writer.endSequence();
|
99 | ber.writeBuffer(writer.buffer, 0x04);
|
100 | };
|
101 |
|
102 | ServerSideSortingRequestControl.prototype._json = function (obj) {
|
103 | obj.controlValue = this.value;
|
104 | return obj;
|
105 | };
|
106 |
|
107 | ServerSideSortingRequestControl.OID = '1.2.840.113556.1.4.473';
|
108 |
|
109 |
|
110 |
|
111 |
|
112 | module.exports = ServerSideSortingRequestControl;
|