aboutsummaryrefslogtreecommitdiff
path: root/fetch.lua
blob: 43e268f4aba5642f9aa9243ed7e548b2d814db79 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
--
-- ~~~ fetch a pawsd service
--

-- require a name & service index to fetch
if not arg[1] or not arg[2] then
    error("server name & index required")
end

-- imports
local PawSD = require("src/pawsd")
local Servers = require("src/servers")
require("src/utils")

local socket = require("socket")
local client = assert(socket.tcp())

-- get arguments & check validity
local server = Servers[arg[1]]
local index = arg[2]

if not server then
    error("server not found")
end

-- connect to client
client:connect(server.host, server.port)

-- send request
local request = string.fromhex(PawSD.Magic.REQUEST .. PawSD.Version .. PawSD.Verbs.FETCH_SERVICE .. server.keyalg .. "0020" .. server.key .. index)
client:send(request)

-- print response
local response = {}

while true do
    local packet, status = client:receive(1)

    -- if packet then print(response) end
    table.insert(response, packet)
    if status == "closed" then break end
end

-- check that the response is correct
local responseMagic = extractfromresponse(response, 1, 8)
if not responseMagic == PawSD.Magic.RESPONSE then
    error("invalid response")
end

-- check that the status is okay
local responseStatus = extractfromresponse(response, 11, 12)
if not responseStatus == PawSD.Responses.OK then
    error("unsuccessful request")
end

-- get signature information
local responseSignatureLength = tonumber(extractfromresponse(response, 13, 14), 16)
local responseSignatureEnd = 14 + responseSignatureLength
local responseSignature = extractfromresponse(response, 15, responseSignatureEnd)

print("Signature: " .. responseSignature)
-- todo: check this?

-- get service index
local responseIndexStart = responseSignatureEnd + 1
local responseIndex = extractfromresponse(response, responseIndexStart, responseIndexStart + 1)

-- get service flags
local responseFlagsStart = responseIndexStart + 2
local responseFlags = extractfromresponse(response, responseFlagsStart, responseFlagsStart + 3)

-- get number of records
local responseRecordCountStart = responseFlagsStart + 4
local responseRecordCount = tonumber(extractfromresponse(response, responseRecordCountStart, responseRecordCountStart + 1), 16)

-- store offset
local recordOffset = responseRecordCountStart + 2

-- loop through each record
for recordNumber = 1, responseRecordCount, 1 do

    print("\n--- Record Number " .. recordNumber .. " ---")

    -- get number of tags
    local responseTagCountStart = recordOffset
    local responseTagCount = tonumber(extractfromresponse(response, responseTagCountStart, responseTagCountStart + 1), 16)

    -- store offset
    local tagOffset = recordOffset + 2

    -- loop through each tag
    for tagNumber = 1, responseTagCount, 1 do

        print("\n    - Tag Number " .. tagNumber .. " -\n")

        -- high tag
        local responseTagHighStart = tagOffset
        local responseTagHigh = extractfromresponse(response, responseTagHighStart, responseTagHighStart + 7)
        print("      High Tag: " .. responseTagHigh)

        -- low tag
        local responseTagLowStart = responseTagHighStart + 8
        local responseTagLow = extractfromresponse(response, responseTagLowStart, responseTagLowStart + 7)
        print("      Low Tag:  " .. responseTagLow)

        -- get value length
        local responseTagValueLength = {}
        local responseTagValueLengthStart = responseTagLowStart + 8
        local responseTagValueLength = tonumber(extractfromresponse(response, responseTagValueLengthStart, responseTagValueLengthStart + 3), 16)

        -- only check if value actually exists
        if responseTagValueLength > 0 then

            -- get value
            local responseTagValueStart = responseTagValueLengthStart + 4
            local responseTagValueEnd = responseTagValueStart + responseTagValueLength
            local responseTagValue = string.fromhex(extractfromresponse(response, responseTagValueStart, responseTagValueEnd))

            print("      Value:    " .. responseTagValue)

            -- adjust offset
            tagOffset = responseTagValueEnd

        else

            -- adjust offset
            tagOffset = responseTagValueLengthStart + 4

        end
    end

    -- adjust offset
    recordOffset = tagOffset
end

-- close connection
client:close()