You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

287 lines
9.5 KiB

8 years ago
8 years ago
  1. # Building go-neb
  2. Go-neb is built using `gb` (https://getgb.io/). To build go-neb:
  3. ```bash
  4. # Install gb
  5. go get github.com/constabulary/gb/...
  6. # Clone the go-neb repository
  7. git clone https://github.com/matrix-org/go-neb
  8. cd go-neb
  9. # Build go-neb
  10. gb build github.com/matrix-org/go-neb
  11. ```
  12. # Running go-neb
  13. Go-neb uses environment variables to configure its database and bind address.
  14. To run go-neb:
  15. BIND_ADDRESS=:4050 DATABASE_TYPE=sqlite3 DATABASE_URL=go-neb.db BASE_URL=https://public.facing.endpoint bin/go-neb
  16. Go-neb needs to connect as a matrix user to receive messages. Go-neb can listen
  17. for messages as multiple matrix users. The users are configured using an
  18. HTTP API and the config is stored in the database. Go-neb will automatically
  19. start syncing matrix messages when the user is configured. To create a user:
  20. curl -X POST localhost:4050/admin/configureClient --data-binary '{
  21. "UserID": "@goneb:localhost:8448",
  22. "HomeserverURL": "http://localhost:8008",
  23. "AccessToken": "<access_token>"
  24. }'
  25. {
  26. "OldClient": {},
  27. "NewClient": {
  28. "UserID": "@goneb:localhost:8448",
  29. "HomeserverURL": "http://localhost:8008",
  30. "AccessToken": "<access_token>"
  31. }
  32. }
  33. Services in go-neb listen for messages in particular rooms using a given matrix
  34. user. Services are configured using an HTTP API and the config is stored in the
  35. database. Services use one of the matrix users configured on go-neb to receive
  36. matrix messages. Each service is configured to listen for messages in a set
  37. of rooms. Go-neb will automatically join the service to its rooms when it is
  38. configured. To start an echo service:
  39. curl -X POST localhost:4050/admin/configureService --data-binary '{
  40. "Type": "echo",
  41. "Id": "myserviceid",
  42. "Config": {
  43. "UserID": "@goneb:localhost:8448",
  44. "Rooms": ["!QkdpvTwGlrptdeViJx:localhost:8448"]
  45. }
  46. }'
  47. {
  48. "Type": "echo",
  49. "Id": "myserviceid",
  50. "OldConfig": {},
  51. "NewConfig": {
  52. "UserID": "@goneb:localhost:8448",
  53. "Rooms": ["!QkdpvTwGlrptdeViJx:localhost:8448"]
  54. }
  55. }
  56. Go-neb has a heartbeat listener that returns 200 OK so that load balancers can
  57. check that the server is still running.
  58. curl -X GET localhost:4050/test
  59. {}
  60. Some `AuthRealms` support "Starter Links". These are HTTP URLs which knowledgeable clients should use to *start* the auth process. They are commonly returned as metadata to `!commands`.
  61. These links require the client to prove that they own a given user ID by appending a token
  62. to the Starter Link. This token will be used to verify the client's identity by making an
  63. Open ID request to the user's Homeserver via federation.
  64. ## Starting a Github Service
  65. ### Register a Github realm
  66. This API allows for an optional `StarterLink` value.
  67. ```
  68. curl -X POST localhost:4050/admin/configureAuthRealm --data-binary '{
  69. "ID": "mygithubrealm",
  70. "Type": "github",
  71. "Config": {
  72. "ClientSecret": "YOUR_CLIENT_SECRET",
  73. "ClientID": "YOUR_CLIENT_ID",
  74. "StarterLink": "https://example.com/requestGithubOAuthToken",
  75. "RedirectBaseURI": "https://public.path.to.neb"
  76. }
  77. }'
  78. ```
  79. Returns:
  80. ```
  81. {
  82. "ID":"mygithubrealm",
  83. "Type":"github",
  84. "OldConfig":null,
  85. "NewConfig":{
  86. "ClientSecret":"YOUR_CLIENT_SECRET",
  87. "ClientID":"YOUR_CLIENT_ID",
  88. "StarterLink": "https://example.com/requestGithubOAuthToken",
  89. "RedirectBaseURI":"https://public.path.to.neb"
  90. }
  91. }
  92. ```
  93. ### Make a request for Github Auth
  94. ```
  95. curl -X POST localhost:4050/admin/requestAuthSession --data-binary '{
  96. "RealmID": "mygithubrealm",
  97. "UserID": "@your_user_id:localhost",
  98. "Config": {
  99. }
  100. }'
  101. ```
  102. Returns:
  103. ```
  104. {
  105. "URL":"https://github.com/login/oauth/authorize?client_id=$ID\u0026client_secret=$SECRET\u0026redirect_uri=$REDIRECT_BASE_URI%2Frealms%2Fredirects%2Fmygithubrealm\u0026state=$RANDOM_STRING"
  106. }
  107. ```
  108. Follow this link and grant access for NEB to act on your behalf.
  109. ### Create a github bot
  110. ```
  111. curl -X POST localhost:4050/admin/configureService --data-binary '{
  112. "Type": "github",
  113. "Id": "mygithubserviceid",
  114. "Config": {
  115. "RealmID": "mygithubrealm",
  116. "BotUserID": "@goneb:localhost",
  117. "ClientUserID": "@example:localhost",
  118. "Rooms": {
  119. "!EmwxeXCVubhskuWvaw:localhost": {
  120. "Repos": {
  121. "owner/repo": {
  122. "Events": ["push","issues"]
  123. }
  124. }
  125. }
  126. }
  127. }
  128. }'
  129. ```
  130. This request will make `BotUserID` join the `Rooms` specified and create webhooks for the `owner/repo` projects given.
  131. ## Starting a JIRA Service
  132. ### Register a JIRA realm
  133. Generate an RSA private key: (JIRA does not support key sizes >2048 bits)
  134. ```bash
  135. openssl genrsa -out privkey.pem 2048
  136. cat privkey.pem
  137. ```
  138. This API allows for an optional `StarterLink` value. Create the realm:
  139. ```
  140. curl -X POST localhost:4050/admin/configureAuthRealm --data-binary '{
  141. "ID": "jirarealm",
  142. "Type": "jira",
  143. "Config": {
  144. "JIRAEndpoint": "matrix.org/jira/",
  145. "StarterLink": "https://example.com/requestJIRAOAuthToken",
  146. "ConsumerName": "goneb",
  147. "ConsumerKey": "goneb",
  148. "ConsumerSecret": "random_long_string",
  149. "PrivateKeyPEM": "-----BEGIN RSA PRIVATE KEY-----\r\nMIIEowIBAAKCAQEA39UhbOvQHEkBP9fGnhU+eSObTWBDGWygVYzbcONOlqEOTJUN\r\n8gmnellWqJO45S4jB1vLLnuXiHqEWnmaShIvbUem3QnDDqghu0gfqXHMlQr5R8ZP\r\norTt1F2idWy1wk5rVXeLKSG7uriYhDVOVS69WuefoW5v55b5YZV283v2jROjxHuj\r\ngAsJA7k6tvpYiSXApUl6YHmECfBoiwG9bwItkHwhZ\/fG9i4H8\/aOyr3WlaWbVeKX\r\n+m38lmYZvzQFRAk5ab1vzCGz4cyc\r\nTk2qmZpcjHRd1ijcOkgC23KF8lHWF5Zx0tySR+DWL1JeGm8NJxKMRJZuE8MIkJYF\r\nryE7kjspNItk6npkA3\/A4PWwElhddI4JpiuK+29mMNipRcYYy9e0vH\/igejv7ayd\r\nPLCRMQKBgBDSNWlZT0nNd2DXVqTW9p+MG72VKhDgmEwFB1acOw0lpu1XE8R1wmwG\r\nZRl\/xzri3LOW2Gpc77xu6fs3NIkzQw3v1ifYhX3OrVsCIRBbDjPQI3yYjkhGx24s\r\nVhhZ5S\/TkGk3Kw59bDC6KGqAuQAwX9req2l1NiuNaPU9rE7tf6Bk\r\n-----END RSA PRIVATE KEY-----"
  150. }
  151. }'
  152. ```
  153. The following keys will be modified/added:
  154. - `JIRAEndpoint` in canonicalised form.
  155. - `Server` and `Version` keys which are purely informational for the caller.
  156. - `PublicKeyPEM` which the caller needs a human to insert into the JIRA Application Links web form.
  157. Returns:
  158. ```json
  159. {
  160. "ID": "jirarealm",
  161. "Type": "jira",
  162. "OldConfig": null,
  163. "NewConfig": {
  164. "JIRAEndpoint": "https://matrix.org/jira/",
  165. "StarterLink": "https://example.com/requestJIRAOAuthToken",
  166. "Server": "Matrix.org",
  167. "Version": "6.3.5a",
  168. "ConsumerName": "goneb",
  169. "ConsumerKey": "goneb",
  170. "ConsumerSecret": "random_long_string",
  171. "PublicKeyPEM": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA39UhbOvQHEkBP9fGnhU+\neSObTWBDGWygVYzbcONOlqEOTJUN8gmnellWqJO45S4jB1vLLnuXiHqEWnmaShIv\nbUem3QnDDqghu0gfqXHMlQr5R8ZPorTt1F2idWy1wk5rVXeLKSG7uriYhDVOVS69\nWuefoW5v55b5YZV283v2jROjxHujgAsJA7k6tvpYiSXApUl6YHmECfBoiwG9bwIt\nkHwhZ/fG9i4H8/aOyr3WlaWbVeKX+m38lmYZvzQFRd7UPU7DuO6Aiqj7RxrbAvqq\ndPeoAvo6+V0TRPZ8YzKp2yQmDcGH69IbuKJ2BG1Qx8znZAvghKQ6P9Im+M4c7j9i\ndwIDAQAB\n-----END PUBLIC KEY-----\n",
  172. "PrivateKeyPEM": "-----BEGIN RSA PRIVATE KEY-----\r\nMIIEowIBAAKCAQEA39UhbOvQHEkBP9fGnhU+eSObTWBDGWygVYzbcONOlqEOTJUN\r\n8gmnellWqJO45S4jB1vLLnuXiHqEWnmaShIvbUem3QnDDqghu0gfqXHMlQr5R8ZP\r\norTt1F2idWy1wk5rVXeLKSG7uriYhDVOVS69WuefoW5v55b5YZV283v2jROjxHuj\r\ngAsJA7k6tvpYiSXApUl6YHmECfBoiwG9bwItkHwhZ/fG9i4H8/aOyr3WlaWbVeKX\r\n+m38lmYZvzQFRd7UPU7DuO6Aiqj7RxrbAvqqdPeoAvo6+V0TRPZ8YzKp2yQmDcGH\r\n69IbuKJ2BG1Qx8znZAvghKQ6P9Im+M4c7j9iMG72VKhDgmEwFB1acOw0lpu1XE8R1wmwG\r\nZRl/xzri3LOW2Gpc77xu6fs3NIkzQw3v1ifYhX3OrVsCIRBbDjPQI3yYjkhGx24s\r\nVhhZ5S/TkGk3Kw59bDC6KGqAuQAwX9req2l1NiuNaPU9rE7tf6Bk\r\n-----END RSA PRIVATE KEY-----"
  173. }
  174. }
  175. ```
  176. The `ConsumerKey`, `ConsumerSecret`, `ConsumerName` and `PublicKeyPEM` must be manually inserted
  177. into the "Application Links" section under JIRA Admin Settings by a JIRA admin on the target
  178. JIRA installation. Once that is complete, users can OAuth on the target JIRA installation.
  179. ### Make a request for JIRA Auth
  180. ```
  181. curl -X POST localhost:4050/admin/requestAuthSession --data-binary '{
  182. "RealmID": "jirarealm",
  183. "UserID": "@example:localhost",
  184. "Config": {
  185. }
  186. }'
  187. ```
  188. Returns:
  189. ```json
  190. {
  191. "URL":"https://jira.somewhere.com/plugins/servlet/oauth/authorize?oauth_token=7yeuierbgweguiegrTbOT"
  192. }
  193. ```
  194. Follow this link and grant access for NEB to act on your behalf.
  195. ### Create a JIRA bot
  196. ```
  197. curl -X POST localhost:4050/admin/configureService --data-binary '{
  198. "Type": "jira",
  199. "Id": "jid",
  200. "Config": {
  201. "BotUserID": "@goneb:localhost",
  202. "ClientUserID": "@example:localhost",
  203. "Rooms": {
  204. "!EmwxeXCVubhskuWvaw:localhost": {
  205. "RealmID": "jirarealm",
  206. "Projects": {
  207. "BOTS": {
  208. "Expand": true,
  209. "Track": true
  210. }
  211. }
  212. }
  213. }
  214. }
  215. }'
  216. ```
  217. # Developing on go-neb.
  218. There's a bunch more tools this project uses when developing in order to do
  219. things like linting. Some of them are bundled with go (fmt and vet) but some
  220. are not. You should install the ones which are not:
  221. ```bash
  222. go get github.com/golang/lint/golint
  223. go get github.com/fzipp/gocyclo
  224. ```
  225. You can then install the pre-commit hook:
  226. ```bash
  227. ./hooks/install.sh
  228. ```
  229. ## Viewing the API docs.
  230. ```
  231. # Start a documentation server listening on :6060
  232. GOPATH=$GOPATH:$(pwd) godoc -v -http=localhost:6060 &
  233. # Open up the documentation for go-neb in a browser.
  234. sensible-browser http://localhost/pkg/github.com/matrix-org/go-neb
  235. ```