Class: EncryptDecrypt::EncryptedServer

Inherits:
Object
  • Object
show all
Defined in:
lib/accu-encrypt.rb

Overview

A class which allows for the creation of an encrypted session over a server, with the client acting as the server.

Codes: 0 - Connection refused, 1 - Connection accepted, 2 - Ready, 3 - Sending encrypted message, 4 - End communications, 5 - Verification message inbound

Instance Method Summary collapse

Constructor Details

#initialize(server) ⇒ EncryptedServer

Initializes EncryptedServer object.



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
# File 'lib/accu-encrypt.rb', line 53

def initialize( server )
  @server = server
  print "Connection attempt from |" + @server.peeraddr[3] + "|.  Would you like to connect? "
  response = gets.chomp.downcase
  if response == "y" then
    puts "Connection accepted."
    send_code(1)
    @password = EncryptDecrypt.get_password "Please enter password for communications: "
    @listen_thread, @interactive_thread = nil, nil
    @mode = EncryptDecrypt.get_mode
    if listen_code() == 2 then
      send_code(2)
      puts "Ready code received.\nSuccessfully connected!"
      listen_encrypted()
      interactive()
      @listen_thread.join
      @interactive_thread.join
      puts "Ending connection."
    else
      puts "Connection refused."
    end
  else
    send_code 0
    puts "Connection refused."
  end
  server.close
end

Instance Method Details

#interactiveObject

Opens an interactive session.



162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
# File 'lib/accu-encrypt.rb', line 162

def interactive()
  @interactive_thread = Thread.new {
    loop {
      print "What would you like to do? |S Q| "
      response = gets.chomp.downcase
      while response != "q" and response != "s" do
        puts "Incorrect input: |" + response + "|"
        print "What would you like to do? |S Q| "
        response = gets.chomp.downcase
      end
      if response == "q" then
        puts "Sending close message to client."
        send_code(4)
        @listen_thread.exit
        @interactive_thread.exit
      else
        print "Type message and end with END:\n\n"
        lines = ""
        while line = gets and line.chomp != "END" do
          #puts "|" + line + "|"
          lines << line
        end
        lines = lines.chomp
        puts "Message read.\nEncrypting now."
        send_encrypted(lines)
        puts "Message sent."
      end
    }
  }
end

#listen {|msg| ... } ⇒ Object

Listens for a generic network communication and yields to a passed block (if any).

Yields:

  • (msg)


104
105
106
107
# File 'lib/accu-encrypt.rb', line 104

def listen()
  msg = @server.gets.chomp
  yield msg
end

#listen_codeObject

Listens for a network code.



121
122
123
124
125
126
127
128
129
130
131
# File 'lib/accu-encrypt.rb', line 121

def listen_code()
  listen { |msg|
    if msg.slice(0..1) == "C:" then
      #puts "Code present."
      return msg.slice(2..msg.length).to_i
    else
      #puts "Code not present."
      return msg.slice(0..1)
    end
  }
end

#listen_encryptedObject

Listens for encrypted messages.



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/accu-encrypt.rb', line 82

def listen_encrypted()
  @listen_thread = Thread.new {
    loop {
      code = listen_code()
      if code == 3 then
        lines = ""
        while line = @server.gets and line != "END\n" do
          lines << line
        end
        secret,text = EncryptDecrypt.decrypt(@password,lines,@mode)
        puts "Message received:\n\n" + text.chomp + "\n\nMessage end."
      elsif code == 4 then
        puts "Client closed connection."
        @interactive_thread.exit
        @listen_thread.exit
      end
    }
  }
end

#listen_linesObject

Listens for multiple lines, appends them together and stops at END.



111
112
113
114
115
116
117
118
# File 'lib/accu-encrypt.rb', line 111

def listen_lines()
  lines = []
  while line = @server.gets.chomp and line != "END" do
    #puts "|" + line + "|"
    lines << line
  end
  lines
end

#send(text) ⇒ Object

Sends a plaintext message.



134
135
136
# File 'lib/accu-encrypt.rb', line 134

def send(text)
  @server.puts text
end

#send_code(code) ⇒ Object

Sends a code.



157
158
159
# File 'lib/accu-encrypt.rb', line 157

def send_code(code)
  send("C:#{code}")
end

#send_encrypted(lines) ⇒ Object

Send over an encrypted multiline message.



149
150
151
152
153
154
# File 'lib/accu-encrypt.rb', line 149

def send_encrypted(lines)
  secret,text = EncryptDecrypt.encrypt(@password,lines,@mode)
  send_code(3)
  send(text)
  send("END")
end

#send_lines(lines) ⇒ Object

Sends multiple lines and appends END to end the send.



140
141
142
143
144
145
146
# File 'lib/accu-encrypt.rb', line 140

def send_lines(lines)
  array = lines.split("\n")
  array.each do |line|
    send(line)
  end
  send("END")
end