Class Net::SSH::Authentication::Pageant::Socket
In: lib/net/ssh/authentication/pageant.rb
lib/net/ssh/authentication/pageant.rb
Parent: Object

This is the pseudo-socket implementation that mimics the interface of a socket, translating each request into a Windows messaging call to the pageant daemon. This allows pageant support to be implemented simply by replacing the socket factory used by the Agent class.

Methods

close   close   new   open   open   read   read   send   send   send_query   send_query  

Public Class methods

Create a new instance that communicates with the running pageant instance. If no such instance is running, this will cause an error.

[Source]

    # File lib/net/ssh/authentication/pageant.rb, line 89
89:       def initialize
90:         @win = Win.findWindow("Pageant", "Pageant")
91: 
92:         if @win == 0
93:           raise Net::SSH::Exception,
94:             "pageant process not running"
95:         end
96: 
97:         @res = nil
98:         @pos = 0
99:       end

The factory method for creating a new Socket instance. The location parameter is ignored, and is only needed for compatibility with the general Socket interface.

[Source]

    # File lib/net/ssh/authentication/pageant.rb, line 83
83:       def self.open(location=nil)
84:         new
85:       end

The factory method for creating a new Socket instance. The location parameter is ignored, and is only needed for compatibility with the general Socket interface.

[Source]

    # File lib/net/ssh/authentication/pageant.rb, line 83
83:       def self.open(location=nil)
84:         new
85:       end

Public Instance methods

Conceptually close the socket. This doesn‘t really do anthing significant, but merely complies with the Socket interface.

[Source]

     # File lib/net/ssh/authentication/pageant.rb, line 154
154:       def close
155:         @res = nil
156:         @pos = 0
157:       end

Conceptually close the socket. This doesn‘t really do anthing significant, but merely complies with the Socket interface.

[Source]

     # File lib/net/ssh/authentication/pageant.rb, line 154
154:       def close
155:         @res = nil
156:         @pos = 0
157:       end

Reads n bytes from the cached result of the last query. If n is nil, returns all remaining data from the last query.

[Source]

     # File lib/net/ssh/authentication/pageant.rb, line 161
161:       def read(n = nil)
162:         return nil unless @res
163:         if n.nil?
164:           start, @pos = @pos, @res.size
165:           return @res[start..-1]
166:         else
167:           start, @pos = @pos, @pos + n
168:           return @res[start, n]
169:         end
170:       end

Reads n bytes from the cached result of the last query. If n is nil, returns all remaining data from the last query.

[Source]

     # File lib/net/ssh/authentication/pageant.rb, line 161
161:       def read(n = nil)
162:         return nil unless @res
163:         if n.nil?
164:           start, @pos = @pos, @res.size
165:           return @res[start..-1]
166:         else
167:           start, @pos = @pos, @pos + n
168:           return @res[start, n]
169:         end
170:       end

Forwards the data to send_query, ignoring any arguments after the first. Returns 0.

[Source]

     # File lib/net/ssh/authentication/pageant.rb, line 103
103:       def send(data, *args)
104:         @res = send_query(data)
105:         @pos = 0
106:       end

Forwards the data to send_query, ignoring any arguments after the first. Returns 0.

[Source]

     # File lib/net/ssh/authentication/pageant.rb, line 103
103:       def send(data, *args)
104:         @res = send_query(data)
105:         @pos = 0
106:       end

Packages the given query string and sends it to the pageant process via the Windows messaging subsystem. The result is cached, to be returned piece-wise when read is called.

[Source]

     # File lib/net/ssh/authentication/pageant.rb, line 111
111:       def send_query(query)
112:         res = nil
113:         filemap = 0
114:         ptr = nil
115:         id = DL::PtrData.malloc(DL.sizeof("L"))
116: 
117:         mapname = "PageantRequest%08x\000" % Win.getCurrentThreadId()
118:         filemap = Win.createFileMapping(Win::INVALID_HANDLE_VALUE, 
119:                                         Win::NULL,
120:                                         Win::PAGE_READWRITE, 0, 
121:                                         AGENT_MAX_MSGLEN, mapname)
122:         if filemap == 0
123:           raise Net::SSH::Exception,
124:             "Creation of file mapping failed"
125:         end
126: 
127:         ptr = Win.mapViewOfFile(filemap, Win::FILE_MAP_WRITE, 0, 0, 
128:                                 AGENT_MAX_MSGLEN)
129: 
130:         if ptr.nil? || ptr.null?
131:           raise Net::SSH::Exception, "Mapping of file failed"
132:         end
133: 
134:         ptr[0] = query
135:         
136:         cds = [AGENT_COPYDATA_ID, mapname.size + 1, mapname].
137:           pack("LLp").to_ptr
138:         succ = Win.sendMessageTimeout(@win, Win::WM_COPYDATA, Win::NULL,
139:           cds, Win::SMTO_NORMAL, 5000, id)
140: 
141:         if succ > 0
142:           retlen = 4 + ptr.to_s(4).unpack("N")[0]
143:           res = ptr.to_s(retlen)
144:         end        
145: 
146:         return res
147:       ensure
148:         Win.unmapViewOfFile(ptr) unless ptr.nil? || ptr.null?
149:         Win.closeHandle(filemap) if filemap != 0
150:       end

Packages the given query string and sends it to the pageant process via the Windows messaging subsystem. The result is cached, to be returned piece-wise when read is called.

[Source]

     # File lib/net/ssh/authentication/pageant.rb, line 111
111:       def send_query(query)
112:         res = nil
113:         filemap = 0
114:         ptr = nil
115:         id = DL::PtrData.malloc(DL.sizeof("L"))
116: 
117:         mapname = "PageantRequest%08x\000" % Win.getCurrentThreadId()
118:         filemap = Win.createFileMapping(Win::INVALID_HANDLE_VALUE, 
119:                                         Win::NULL,
120:                                         Win::PAGE_READWRITE, 0, 
121:                                         AGENT_MAX_MSGLEN, mapname)
122:         if filemap == 0
123:           raise Net::SSH::Exception,
124:             "Creation of file mapping failed"
125:         end
126: 
127:         ptr = Win.mapViewOfFile(filemap, Win::FILE_MAP_WRITE, 0, 0, 
128:                                 AGENT_MAX_MSGLEN)
129: 
130:         if ptr.nil? || ptr.null?
131:           raise Net::SSH::Exception, "Mapping of file failed"
132:         end
133: 
134:         ptr[0] = query
135:         
136:         cds = [AGENT_COPYDATA_ID, mapname.size + 1, mapname].
137:           pack("LLp").to_ptr
138:         succ = Win.sendMessageTimeout(@win, Win::WM_COPYDATA, Win::NULL,
139:           cds, Win::SMTO_NORMAL, 5000, id)
140: 
141:         if succ > 0
142:           retlen = 4 + ptr.to_s(4).unpack("N")[0]
143:           res = ptr.to_s(retlen)
144:         end        
145: 
146:         return res
147:       ensure
148:         Win.unmapViewOfFile(ptr) unless ptr.nil? || ptr.null?
149:         Win.closeHandle(filemap) if filemap != 0
150:       end

[Validate]