Giter Site home page Giter Site logo

n2nchat's Introduction

Darknet Chat Plugin

Darknet Chat Plugin is a chat plugin for Freenet that allows communication between groups of people that are connected as friends on Freenet. Its intent is to allow real-time chat rooms with an arbitrary number of participants. Anyone that connects to a chat room can invite anyone else they are connected to.

Building

Darknet Chat Plugin uses Apache Maven to build. It currently requires Fred 0.7.5.1387, Freenet-ext 29, and Apache Commons commons-io 2.0.1. Once you have these dependancies, you can install them in Maven by running

mvn install:install-file -Dfile=freenet.jar -DgroupId=org.freenetproject -DartifactId=fred -Dversion=0.7.5.1387 -Dpackaging=jar
mvn install:install-file -Dfile=freenet-ext.jar -DgroupId=org.freenetproject -DartifactId=freenet-ext -Dversion=29 -Dpackaging=jar
mvn install:install-file -Dfile=commons-io-2.0.1.jar -DgroupId=org.apache.commons -DartifactId=commons-io -Dversion=2.0.1 -Dpackaging=jar

Now you can build the package with mvn package and generate the Javadocs with mvn javadoc:javadoc.

Because Darknet Chat Plugin runs as a plugin to Freenet, Fred and Freenet-ext are not compiled in as dependencies. Apache commons-io is because Freenet does not provide it.

Logging

If you'd like to log debug messages from the Darknet chat plugin, you can add plugins.N2NChat:MINOR,plugins.N2NChat.ChatRoom:MINOR to Detailed priority thresholds under the advanced mode of Configuration > Logs. Seemingly due to logger strangeness, the messages might not appear until after the node is restarted. It can be useful to monitor the log file with tail -F logs/freenet-latest.log.

Internals

ChatRoom

ChatRooms contain Participant objects which contain username, styling, and routing information. Peers' public key hashes are used as peer identifiers. Whenever a ChatRoom receives a message, whether it was composed by that Freenet node or not, it routes the message to all other Participants that are directly connected to that Freenet node. This allows messages from any Participant to be routed to all others. Here "message" refers to a text message, join, or leave. Each ChatRoom has a name and global identifier. The name is selected by the user, and the global identifier is randomly generated. In the event of a global identifier collision, someone would not be able to be in more than one of the colliding rooms at once. As events occur, it generates HTMLNodes for the Participants listing and messages pane that are retrieved by DisplayChatToadlet through asynchronous GETs. These panes contain information on mouseover: the timestamps list the time the message was composed, and the participants list how they are connected to the current node, as well as public key hashes. HTML is escaped using Freenet's existing HTML filtering. (HTMLNodes)

ChatRoom objects handle:

Receiving:

  • Joins
  • Leaves
  • Text messages
  • Invitation acceptance and rejection

Sending:

  • Joins
  • Leaves
  • Text messages
  • Invitation offers and retractions

N2NChatPlugin

N2NChatPlugin is the plugin base class. It registers the plugin's pages and the Darknet message handler. It maintains HashMaps which contain all ChatRooms and track received invitations. The N2NChatPlugin object handles:

Receiving:

  • Invitation offers and retractions

Sending:

  • Invitation acceptance and rejection

MainPageToadlet

MainPageToadlet provides a user interface to create new chat rooms, open a chat room's page, accept and reject invites, and disconnect from chat rooms. It uses N2NChatPlugin's ChatRoom and invite HashMaps. To allow accepting or rejecting invitations, it displays them in a table with links to itself with URL parameters for accepting or rejecting a given invitation. Room creation is done by POSTing a new room name to itself, and disconnection is done by POSTing the global identifier of the room to disconnect from to itself. It uses jQuery to continually refresh the invitations table.

DisplayChatToadlet

DisplayChatToadlet provides a user interface to a room for sending and reading messages and inviting participants. It uses jQuery to continually refresh the messages pane, participants listing, and invitation drop-down, as well as asynchronously POST sent messages and maintain focus in the field. Its goal is to provide an interface close to a desktop IM client such as Pidgin.

StaticResourceToadlet

StaticResourceToadlet provides access to static resources packages within the .jar. It is used by pages to retrieve CSS and Javascript files.

Message format

The base identifier (n2ntype to sendNodeToNodeMessage()) used to register the listener is N2N_MESSAGE_TYPE_CHAT, or 103.

FieldPurpose
typeType of chat message,
globalIdentifierWhich room - hopefully-unique identifier.
pubKeyHashWhich participant.
usernameParticipant's username.
roomNameChatRoom human-readable name.
timeComposedTime the message was composed.
textText of the chat message.
displayJoinWhether a join message should be displayed.
MessagetypeglobalIdentifierpubKeyHashusernameroomNametimeComposedtextdisplayJoin
MESSAGE1
OFFER_INVITE2
RETRACT_INVITE3
ACCEPT_INVITE4
REJECT_INVITE5
JOIN6
LEAVE7

Future Ideas

  • Some kind of chat server (XMPP? IRC?) so that existing programs can be used as interfaces with the chat. This could be similar to FLIP. Too similar? A server could be a separate plugin that also implements the same message protocol or is an addition to the web interface.
  • More robust routing with backup route negotiation and direct connections whenever possible. Currently connections form a chain that is very vulnerable to disruption.
  • More route negotiation would allow for better knowledge of the network, which could be rendered into a cool diagram.
  • Message signing to prevent the currently trivially easy message forging.
  • Apache commons-io is used as a straightforward, although not particularly elegant in this case, way to get Javascript from the jar. It might be better to somehow extend Freenet's StaticToadlet.

n2nchat's People

Contributors

thynix avatar arnebab avatar desyncr avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.