From f9f603bc9380834c88b60f8c3b418d62505aac5e Mon Sep 17 00:00:00 2001
From: aguestuser <aguestuser@riseup.net>
Date: Wed, 10 Jun 2020 00:41:02 -0400
Subject: [PATCH 1/4] [218] rename signupChannel -> supportChannel, remove
 special casing

---
 .env.dev.example                              |  2 +-
 .env.example                                  |  2 +-
 README.md                                     |  2 +-
 app/config/signal.js                          |  6 +-
 app/services/dispatcher/commands/execute.js   | 61 ++++++++-----------
 app/services/dispatcher/messenger.js          |  4 +-
 app/services/dispatcher/run.js                |  6 +-
 app/services/registrar/phoneNumber/common.js  |  4 +-
 app/services/registrar/phoneNumber/recycle.js |  2 +-
 .../dispatcher/commands/execute.spec.js       | 25 --------
 .../services/dispatcher/messenger.spec.js     | 46 +-------------
 test/unit/services/dispatcher/run.spec.js     | 18 +++---
 12 files changed, 48 insertions(+), 130 deletions(-)

diff --git a/.env.dev.example b/.env.dev.example
index e7b85b46d..4ccec9ddb 100644
--- a/.env.dev.example
+++ b/.env.dev.example
@@ -13,7 +13,7 @@ SIGNALBOOST_API_TOKEN=%HEX STRING%
 TWILIO_ACCOUNT_SID=%HEX STRING%
 TWILIO_AUTH_TOKEN=%HEX STRING%
 
-# Signup channel number // Optional Phone number used by Signalboost for the special "signup channel"
+# Support channel number // Optional Phone number used by Signalboost for the special "support channel"
 # Use Boost cli to create these, you only need the one specific to the mode you are running in
 # Format must be e164 (https://www.twilio.com/docs/glossary/what-e164), with the + and with no special characters
 
diff --git a/.env.example b/.env.example
index ad5c9f4b4..4685cae2e 100644
--- a/.env.example
+++ b/.env.example
@@ -11,7 +11,7 @@ SIGNALBOOST_HOST_URL=%FULL DOMAIN NAME FOR PROD SERVER%
 
 SIGNALBOOST_API_TOKEN=%HEX STRING%
 
-# Signup channel number // Optional Phone number used by Signalboost for the special "signup channel" 
+# Support channel number // Optional Phone number used by Signalboost for the special "support channel"
 # Use Boost cli to create these, you only need the one specific to the mode you are running in
 # Format must be e164 (https://www.twilio.com/docs/glossary/what-e164), with the + and with no special characters
 
diff --git a/README.md b/README.md
index 0e0dc870f..a63b63e8a 100644
--- a/README.md
+++ b/README.md
@@ -472,7 +472,7 @@ LETSENCRYPT_EMAIL=%EMAIL ADDRESS FOR TEAM SYSADMIN%
 
 For now we'll comment out this optional item because we need the Boost CLI to creat this channel on twillio:
 ```
-# Signup channel number // Optional Phone number used by Signalboost for the special "signup channel" 
+# Support channel number // Optional Phone number used by Signalboost for the special "support channel" 
 # Use Boost cli to create these, you only need the one specific to the mode you are running in
 # Format must be e164 (https://www.twilio.com/docs/glossary/what-e164), with the + and with no special characters
 
diff --git a/app/config/signal.js b/app/config/signal.js
index 4ac5f5933..6839a4ae9 100644
--- a/app/config/signal.js
+++ b/app/config/signal.js
@@ -12,7 +12,7 @@ const defaults = {
   intervalBetweenRegistrations: 2000, // 2 seconds
   signaldStartupTime: 1000 * 60 * 5, // 5 minutes
   welcomeDelay: 3000, // 3 sec
-  signupPhoneNumber: process.env.SIGNUP_CHANNEL_NUMBER,
+  supportPhoneNumber: process.env.SIGNUP_CHANNEL_NUMBER,
   defaultMessageExpiryTime: 60 * 60 * 24 * 7, // 1 week
   expiryUpdateDelay: 200, // 200 millis
   setExpiryInterval: 2000, // 2 sec
@@ -34,7 +34,7 @@ const test = {
   intervalBetweenRegistrations: 5, // 10 millis,
   signaldStartupTime: 1, // 1 milli
   welcomeDelay: 0.0001, // .0001 millis
-  signupPhoneNumber: '+15555555555',
+  supportPhoneNumber: '+15555555555',
   expiryUpdateDelay: 1, // 1 milli
   setExpiryInterval: 1, // 1 milli
   minResendInterval: 2, // 20 millis
@@ -46,7 +46,7 @@ const test = {
 
 const development = {
   ...defaults,
-  signupPhoneNumber: process.env.SIGNUP_CHANNEL_NUMBER_DEV,
+  supportPhoneNumber: process.env.SIGNUP_CHANNEL_NUMBER_DEV,
 }
 
 module.exports = {
diff --git a/app/services/dispatcher/commands/execute.js b/app/services/dispatcher/commands/execute.js
index 01d1633a1..7386404bd 100644
--- a/app/services/dispatcher/commands/execute.js
+++ b/app/services/dispatcher/commands/execute.js
@@ -14,9 +14,6 @@ const { getAllAdminsExcept, getAdminMemberships } = require('../../../db/reposit
 const { messagesIn } = require('../strings/messages')
 const { memberTypes } = require('../../../db/repositories/membership')
 const { ADMIN, NONE } = memberTypes
-const {
-  signal: { signupPhoneNumber },
-} = require('../../../config')
 
 /**
  *
@@ -36,9 +33,6 @@ const execute = async (executable, dispatchable) => {
   const { command, payload, language } = executable
   const { db, sock, channel, sender, sdMessage } = dispatchable
 
-  // don't allow ANY command execution on the signup channel for non-admins
-  if (channel.phoneNumber === signupPhoneNumber && sender.type !== ADMIN) return noop()
-
   // if payload parse error occured return early and notify sender
   if (executable.error) {
     // sorry for this gross special casing! working fast during a mass mobilization! -aguestuser
@@ -56,32 +50,30 @@ const execute = async (executable, dispatchable) => {
   }
 
   // otherwise, dispatch on the command issued, and process it!
-  const result = await (
-    {
-      [commands.ACCEPT]: () => maybeAccept(db, channel, sender, language),
-      [commands.ADD]: () => maybeAddAdmin(db, sock, channel, sender, payload),
-      [commands.DECLINE]: () => decline(db, channel, sender, language),
-      [commands.DESTROY]: () => maybeConfirmDestroy(db, sock, channel, sender),
-      [commands.DESTROY_CONFIRM]: () => maybeDestroy(db, sock, channel, sender),
-      [commands.HELP]: () => showHelp(db, channel, sender),
-      [commands.HOTLINE_ON]: () => maybeToggleSettingOn(db, channel, sender, toggles.HOTLINE),
-      [commands.HOTLINE_OFF]: () => maybeToggleSettingOff(db, channel, sender, toggles.HOTLINE),
-      [commands.INFO]: () => showInfo(db, channel, sender),
-      [commands.INVITE]: () => maybeInvite(db, channel, sender, payload, language),
-      [commands.JOIN]: () => maybeAddSubscriber(db, channel, sender, language),
-      [commands.LEAVE]: () => maybeRemoveSender(db, channel, sender),
-      [commands.PRIVATE]: () =>
-        maybePrivateMessageAdmins(db, sock, channel, sender, payload, sdMessage),
-      [commands.RENAME]: () => maybeRenameChannel(db, channel, sender, payload),
-      [commands.REMOVE]: () => maybeRemoveMember(db, channel, sender, payload),
-      [commands.REPLY]: () => maybeReplyToHotlineMessage(db, channel, sender, payload),
-      [commands.VOUCHING_ON]: () => maybeToggleSettingOn(db, channel, sender, toggles.VOUCHING),
-      [commands.VOUCHING_OFF]: () => maybeToggleSettingOff(db, channel, sender, toggles.VOUCHING),
-      [commands.VOUCH_LEVEL]: () => maybeSetVouchLevel(db, channel, sender, payload),
-      [commands.SET_LANGUAGE]: () => setLanguage(db, sender, language),
-      [commands.SET_DESCRIPTION]: () => maybeSetDescription(db, channel, sender, payload),
-    }[command] || (() => noop())
-  )()
+  const result = await ({
+    [commands.ACCEPT]: () => maybeAccept(db, channel, sender, language),
+    [commands.ADD]: () => maybeAddAdmin(db, sock, channel, sender, payload),
+    [commands.DECLINE]: () => decline(db, channel, sender, language),
+    [commands.DESTROY]: () => maybeConfirmDestroy(db, sock, channel, sender),
+    [commands.DESTROY_CONFIRM]: () => maybeDestroy(db, sock, channel, sender),
+    [commands.HELP]: () => showHelp(db, channel, sender),
+    [commands.HOTLINE_ON]: () => maybeToggleSettingOn(db, channel, sender, toggles.HOTLINE),
+    [commands.HOTLINE_OFF]: () => maybeToggleSettingOff(db, channel, sender, toggles.HOTLINE),
+    [commands.INFO]: () => showInfo(db, channel, sender),
+    [commands.INVITE]: () => maybeInvite(db, channel, sender, payload, language),
+    [commands.JOIN]: () => maybeAddSubscriber(db, channel, sender, language),
+    [commands.LEAVE]: () => maybeRemoveSender(db, channel, sender),
+    [commands.PRIVATE]: () =>
+      maybePrivateMessageAdmins(db, sock, channel, sender, payload, sdMessage),
+    [commands.RENAME]: () => maybeRenameChannel(db, channel, sender, payload),
+    [commands.REMOVE]: () => maybeRemoveMember(db, channel, sender, payload),
+    [commands.REPLY]: () => maybeReplyToHotlineMessage(db, channel, sender, payload),
+    [commands.VOUCHING_ON]: () => maybeToggleSettingOn(db, channel, sender, toggles.VOUCHING),
+    [commands.VOUCHING_OFF]: () => maybeToggleSettingOff(db, channel, sender, toggles.VOUCHING),
+    [commands.VOUCH_LEVEL]: () => maybeSetVouchLevel(db, channel, sender, payload),
+    [commands.SET_LANGUAGE]: () => setLanguage(db, sender, language),
+    [commands.SET_DESCRIPTION]: () => maybeSetDescription(db, channel, sender, payload),
+  }[command] || (() => noop()))()
 
   result.notifications = result.notifications || []
   return { command, payload, ...result }
@@ -284,10 +276,7 @@ const maybeInvite = async (db, channel, sender, inviteePhoneNumbers, language) =
   if (!isEmpty(errors)) {
     return {
       status: statuses.ERROR,
-      message: cr.dbErrors(
-        errors.map(e => e.inviteePhoneNumber),
-        inviteResults.length,
-      ),
+      message: cr.dbErrors(errors.map(e => e.inviteePhoneNumber), inviteResults.length),
       notifications,
     }
   }
diff --git a/app/services/dispatcher/messenger.js b/app/services/dispatcher/messenger.js
index ca8875605..68eba7dea 100644
--- a/app/services/dispatcher/messenger.js
+++ b/app/services/dispatcher/messenger.js
@@ -14,7 +14,6 @@ const logger = loggerOf('messenger')
 const {
   defaultLanguage,
   signal: {
-    signupPhoneNumber,
     defaultMessageExpiryTime,
     setExpiryInterval,
     broadcastBatchSize,
@@ -66,10 +65,9 @@ const dispatch = async ({ commandResult, dispatchable }) => {
 }
 
 // (CommandResult, Dispatchable) -> MessageType
-const parseMessageType = (commandResult, { sender, channel }) => {
+const parseMessageType = (commandResult, { sender }) => {
   if (commandResult.status === statuses.NOOP) {
     if (sender.type === ADMIN) return BROADCAST_MESSAGE
-    if (channel.phoneNumber === signupPhoneNumber) return SIGNUP_MESSAGE
     return HOTLINE_MESSAGE
   }
   return COMMAND_RESULT
diff --git a/app/services/dispatcher/run.js b/app/services/dispatcher/run.js
index 364fe0ed3..035df75b1 100644
--- a/app/services/dispatcher/run.js
+++ b/app/services/dispatcher/run.js
@@ -11,7 +11,7 @@ const safetyNumberService = require('../registrar/safetyNumbers')
 const { messagesIn } = require('./strings/messages')
 const { get, isEmpty, isNumber } = require('lodash')
 const {
-  signal: { signupPhoneNumber },
+  signal: { supportPhoneNumber },
 } = require('../../config')
 
 /**
@@ -127,7 +127,7 @@ const relay = async (db, sock, channel, sender, inboundMsg) => {
 
 // (Database, Socket, SdMessage, number) -> Promise<void>
 const notifyRateLimitedMessage = async (db, sock, sdMessage, resendInterval) => {
-  const channel = await channelRepository.findDeep(db, signupPhoneNumber)
+  const channel = await channelRepository.findDeep(db, supportPhoneNumber)
   if (!channel) return Promise.resolve()
 
   const recipients = channelRepository.getAdminMemberships(channel)
@@ -137,7 +137,7 @@ const notifyRateLimitedMessage = async (db, sock, sdMessage, resendInterval) =>
         sock,
         memberPhoneNumber,
         sdMessageOf(
-          { phoneNumber: signupPhoneNumber },
+          { phoneNumber: supportPhoneNumber },
           messagesIn(language).notifications.rateLimitOccurred(sdMessage.username, resendInterval),
         ),
       ),
diff --git a/app/services/registrar/phoneNumber/common.js b/app/services/registrar/phoneNumber/common.js
index bbd3aa4cc..f1cf3446b 100644
--- a/app/services/registrar/phoneNumber/common.js
+++ b/app/services/registrar/phoneNumber/common.js
@@ -5,7 +5,7 @@ const signal = require('../../signal')
 const {
   twilio: { accountSid, authToken, smsEndpoint },
   registrar: { host },
-  signal: { signupPhoneNumber },
+  signal: { supportPhoneNumber },
 } = require('../../../config')
 
 // STRINGS
@@ -38,7 +38,7 @@ const notifyMembersExcept = async (db, sock, channel, message, sender) => {
 
 // (DB, Socket, String) -> Promise<void>
 const notifyMaintainers = async (db, sock, message) => {
-  const adminChannel = await channelRepository.findDeep(db, signupPhoneNumber)
+  const adminChannel = await channelRepository.findDeep(db, supportPhoneNumber)
   const adminPhoneNumbers = channelRepository.getAdminPhoneNumbers(adminChannel)
   await signal.broadcastMessage(sock, adminPhoneNumbers, signal.sdMessageOf(adminChannel, message))
 }
diff --git a/app/services/registrar/phoneNumber/recycle.js b/app/services/registrar/phoneNumber/recycle.js
index 7f1fbbbfa..032a907e2 100644
--- a/app/services/registrar/phoneNumber/recycle.js
+++ b/app/services/registrar/phoneNumber/recycle.js
@@ -57,7 +57,7 @@ const recycleChannelFailureNotification = channel =>
 
 // Channel -> Promise<void>
 const notifyMaintainersOfDestructionFailure = async (db, sock, channel) => {
-  const adminChannel = await channelRepository.findDeep(db, signalConfig.signupPhoneNumber)
+  const adminChannel = await channelRepository.findDeep(db, signalConfig.supportPhoneNumber)
   const adminPhoneNumbers = channelRepository.getAdminPhoneNumbers(adminChannel)
 
   await signal.broadcastMessage(
diff --git a/test/unit/services/dispatcher/commands/execute.spec.js b/test/unit/services/dispatcher/commands/execute.spec.js
index c8516dbe5..4bf2bc674 100644
--- a/test/unit/services/dispatcher/commands/execute.spec.js
+++ b/test/unit/services/dispatcher/commands/execute.spec.js
@@ -26,9 +26,6 @@ import {
 } from '../../../../support/factories/membership'
 import { messagesIn } from '../../../../../app/services/dispatcher/strings/messages'
 import { deauthorizationFactory } from '../../../../support/factories/deauthorization'
-const {
-  signal: { signupPhoneNumber },
-} = require('../../../../../app/config')
 
 describe('executing commands', () => {
   const db = {}
@@ -44,11 +41,6 @@ describe('executing commands', () => {
     messageCount: { broadcastIn: 42 },
   }
   const bystanderAdminMemberships = channel.memberships.slice(1, 3)
-  const signupChannel = {
-    name: 'SB_SIGNUP',
-    phoneNumber: signupPhoneNumber,
-    publications: channel.publications,
-  }
   const admin = {
     ...channel.memberships[0],
     phoneNumber: channel.memberships[0].memberPhoneNumber,
@@ -2110,23 +2102,6 @@ describe('executing commands', () => {
     })
   })
 
-  describe('new user attempting to JOIN the signup channel', () => {
-    it('returns NOOP', async () => {
-      const dispatchable = {
-        db,
-        channel: signupChannel,
-        sender: randomPerson,
-        sdMessage: sdMessageOf(signupChannel, 'HELLO'),
-      }
-      expect(await processCommand(dispatchable)).to.eql({
-        command: commands.NOOP,
-        status: statuses.NOOP,
-        message: '',
-        notifications: [],
-      })
-    })
-  })
-
   describe('invalid command', () => {
     it('returns NOOP status/message', async () => {
       const dispatchable = {
diff --git a/test/unit/services/dispatcher/messenger.spec.js b/test/unit/services/dispatcher/messenger.spec.js
index 036db37cd..82b9de11c 100644
--- a/test/unit/services/dispatcher/messenger.spec.js
+++ b/test/unit/services/dispatcher/messenger.spec.js
@@ -13,15 +13,13 @@ import { statuses } from '../../../../app/services/util'
 import { genPhoneNumber } from '../../../support/factories/phoneNumber'
 import { sdMessageOf } from '../../../../app/services/signal'
 import { messagesIn } from '../../../../app/services/dispatcher/strings/messages'
-import { defaultLanguage } from '../../../../app/config'
 import channelRepository from '../../../../app/db/repositories/channel'
 import hotlineMessageRepository from '../../../../app/db/repositories/hotlineMessage'
 const {
-  signal: { signupPhoneNumber, broadcastBatchSize },
+  signal: { broadcastBatchSize },
 } = require('../../../../app/config')
 
 describe('messenger service', () => {
-  const notifications = messagesIn(defaultLanguage).notifications
   const [db, sock] = [{}, { write: () => {} }]
   const channelPhoneNumber = genPhoneNumber()
   const subscriberPhoneNumbers = times(2, genPhoneNumber)
@@ -55,11 +53,6 @@ describe('messenger service', () => {
     messageCount: { broadcastIn: 42 },
   }
   const hotlineEnabledChannel = { ...channel, hotlineOn: true }
-  const signupChannel = {
-    name: 'SB_SIGNUP',
-    phoneNumber: signupPhoneNumber,
-    memberships: channel.memberships,
-  }
 
   const attachments = [{ filename: 'some/path', width: 42, height: 42 }]
   const sdMessage = {
@@ -354,43 +347,6 @@ describe('messenger service', () => {
       })
     })
 
-    describe('when message is a signup request', () => {
-      const adminPhoneNumbers = channelRepository.getAdminPhoneNumbers(channel)
-
-      beforeEach(async () => {
-        const dispatchable = {
-          db,
-          sock,
-          channel: signupChannel,
-          sender: randomSender,
-          sdMessage: sdMessageOf(signupChannel, 'gimme a channel'),
-        }
-        const commandResult = { status: commands.NOOP, message: '', notifications: [] }
-        await messenger.dispatch({ dispatchable, commandResult })
-      })
-
-      it('responds to requester', () => {
-        expect(sendMessageStub.getCall(0).args).to.eql([
-          sock,
-          randomSender.phoneNumber,
-          sdMessageOf(signupChannel, notifications.signupRequestResponse),
-        ])
-      })
-
-      it('forwards request to channel admins and appends phone number', () => {
-        adminPhoneNumbers.forEach((adminPhoneNumber, idx) => {
-          expect(sendMessageStub.getCall(idx + 1).args).to.eql([
-            sock,
-            adminPhoneNumber,
-            sdMessageOf(
-              signupChannel,
-              notifications.signupRequestReceived(randomSender.phoneNumber, 'gimme a channel'),
-            ),
-          ])
-        })
-      })
-    })
-
     describe('when message is a command response', () => {
       beforeEach(async () => {
         await messenger.dispatch({
diff --git a/test/unit/services/dispatcher/run.spec.js b/test/unit/services/dispatcher/run.spec.js
index 888efeb4d..9955845fd 100644
--- a/test/unit/services/dispatcher/run.spec.js
+++ b/test/unit/services/dispatcher/run.spec.js
@@ -21,7 +21,7 @@ import { messagesIn } from '../../../../app/services/dispatcher/strings/messages
 import { adminMembershipFactory } from '../../../support/factories/membership'
 import { inboundAttachmentFactory } from '../../../support/factories/sdMessage'
 const {
-  signal: { defaultMessageExpiryTime, signupPhoneNumber, minResendInterval },
+  signal: { defaultMessageExpiryTime, supportPhoneNumber, minResendInterval },
 } = require('../../../../app/config')
 
 describe('dispatcher service', () => {
@@ -284,10 +284,10 @@ describe('dispatcher service', () => {
     })
 
     describe('when message is a rate limit error notification', () => {
-      const signupChannel = deepChannelFactory({
-        phoneNumber: signupPhoneNumber,
+      const supportChannel = deepChannelFactory({
+        phoneNumber: supportPhoneNumber,
         memberships: ['EN', 'ES', 'FR'].map(language =>
-          adminMembershipFactory({ channelPhoneNumber: signupPhoneNumber, language }),
+          adminMembershipFactory({ channelPhoneNumber: supportPhoneNumber, language }),
         ),
       })
       const recipientNumber = genPhoneNumber()
@@ -313,9 +313,9 @@ describe('dispatcher service', () => {
 
       beforeEach(() => enqueueResendStub.returns(minResendInterval))
 
-      describe('and there is a signup channel', () => {
+      describe('and there is a support channel', () => {
         beforeEach(async () => {
-          findDeepStub.returns(Promise.resolve(signupChannel))
+          findDeepStub.returns(Promise.resolve(supportChannel))
           sock.emit('data', JSON.stringify(sdErrorMessage))
           await wait(2 * socketDelay)
         })
@@ -325,12 +325,12 @@ describe('dispatcher service', () => {
         })
 
         it('notifies admins of the support channel', () => {
-          signupChannel.memberships.forEach(({ memberPhoneNumber, language }, idx) =>
+          supportChannel.memberships.forEach(({ memberPhoneNumber, language }, idx) =>
             expect(sendMessageStub.getCall(idx).args).to.eql([
               sock,
               memberPhoneNumber,
               sdMessageOf(
-                { phoneNumber: signupPhoneNumber },
+                { phoneNumber: supportPhoneNumber },
                 messagesIn(language).notifications.rateLimitOccurred(
                   channel.phoneNumber,
                   minResendInterval,
@@ -341,7 +341,7 @@ describe('dispatcher service', () => {
         })
       })
 
-      describe('and there is not a signup channel', () => {
+      describe('and there is not a support channel', () => {
         beforeEach(async () => {
           findDeepStub.returns(Promise.resolve(null))
           sock.emit('data', JSON.stringify(sdErrorMessage))
-- 
GitLab


From 0a91966caf3395fbdbabf63fea2edd13e29bc909 Mon Sep 17 00:00:00 2001
From: aguestuser <aguestuser@riseup.net>
Date: Wed, 10 Jun 2020 00:45:15 -0400
Subject: [PATCH 2/4] [218] rename SIGNUP_CHANNEL_NUMBER, update value to
 8005717

---
 .env.dev.example     |   2 +-
 .env.example         |   2 +-
 .env.gpg             | Bin 3444 -> 3446 bytes
 README.md            |   2 +-
 app/config/signal.js |   4 ++--
 5 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/.env.dev.example b/.env.dev.example
index 4ccec9ddb..5e37f3216 100644
--- a/.env.dev.example
+++ b/.env.dev.example
@@ -17,4 +17,4 @@ TWILIO_AUTH_TOKEN=%HEX STRING%
 # Use Boost cli to create these, you only need the one specific to the mode you are running in
 # Format must be e164 (https://www.twilio.com/docs/glossary/what-e164), with the + and with no special characters
 
-SIGNUP_CHANNEL_NUMBER=%+15554445555%
+SUPPORT_CHANNEL_NUMBER=%+15554445555%
diff --git a/.env.example b/.env.example
index 4685cae2e..6671f882d 100644
--- a/.env.example
+++ b/.env.example
@@ -15,7 +15,7 @@ SIGNALBOOST_API_TOKEN=%HEX STRING%
 # Use Boost cli to create these, you only need the one specific to the mode you are running in
 # Format must be e164 (https://www.twilio.com/docs/glossary/what-e164), with the + and with no special characters
 
-SIGNUP_CHANNEL_NUMBER=%+15554445555%
+SUPPORT_CHANNEL_NUMBER=%+15554445555%
 
 # Twilio // Required in all modes to create channel numbers. Signup at https://www.twilio.com/  
 # Free accounts work but are limited to one phone number which will limit your ability to create channels
diff --git a/.env.gpg b/.env.gpg
index e5a820ba310eac96b892ae81d44c1d106a919024..f4a64607fd050bea855904691185813571ee2584 100644
GIT binary patch
literal 3446
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

literal 3444
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

diff --git a/README.md b/README.md
index a63b63e8a..2428b45f2 100644
--- a/README.md
+++ b/README.md
@@ -476,7 +476,7 @@ For now we'll comment out this optional item because we need the Boost CLI to cr
 # Use Boost cli to create these, you only need the one specific to the mode you are running in
 # Format must be e164 (https://www.twilio.com/docs/glossary/what-e164), with the + and with no special characters
 
-#SIGNUP_CHANNEL_NUMBER=%+15554445555%
+#SUPPORT_CHANNEL_NUMBER=%+15554445555%
 ```
 
 #### Configure ansible/inventory
diff --git a/app/config/signal.js b/app/config/signal.js
index 6839a4ae9..b20760cf7 100644
--- a/app/config/signal.js
+++ b/app/config/signal.js
@@ -12,7 +12,7 @@ const defaults = {
   intervalBetweenRegistrations: 2000, // 2 seconds
   signaldStartupTime: 1000 * 60 * 5, // 5 minutes
   welcomeDelay: 3000, // 3 sec
-  supportPhoneNumber: process.env.SIGNUP_CHANNEL_NUMBER,
+  supportPhoneNumber: process.env.SUPPORT_CHANNEL_NUMBER,
   defaultMessageExpiryTime: 60 * 60 * 24 * 7, // 1 week
   expiryUpdateDelay: 200, // 200 millis
   setExpiryInterval: 2000, // 2 sec
@@ -46,7 +46,7 @@ const test = {
 
 const development = {
   ...defaults,
-  supportPhoneNumber: process.env.SIGNUP_CHANNEL_NUMBER_DEV,
+  supportPhoneNumber: process.env.SUPPORT_CHANNEL_NUMBER_DEV,
 }
 
 module.exports = {
-- 
GitLab


From 5ba4ea9e5df02c4b9926d3c37ce7a0a7d6485f5d Mon Sep 17 00:00:00 2001
From: aguestuser <aguestuser@riseup.net>
Date: Wed, 10 Jun 2020 00:47:39 -0400
Subject: [PATCH 3/4] [218] add lint step to gitlab CI

---
 .gitlab-ci.yml | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 29d3f46a0..1a04fbea4 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -19,5 +19,12 @@ test_unit:
     - npm install
     - npx sequelize db:migrate --env test
     - NODE_ENV=test npx mocha ./test/unit  -name '*.spec.js' --recursive -r babel-register --reporter dot --exit
+  only:
+    - merge_requests
+
+test_lint:
+  script:
+    - npm install
+    - npx eslint app && npx eslint test
   only:
     - merge_requests
\ No newline at end of file
-- 
GitLab


From e83b6fd1c4f2b8bc5363a8a6c9e2b316107f1f7b Mon Sep 17 00:00:00 2001
From: aguestuser <aguestuser@riseup.net>
Date: Wed, 10 Jun 2020 01:01:21 -0400
Subject: [PATCH 4/4] [218] prefer yarn to npm install

---
 .gitlab-ci.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1a04fbea4..1b4b6ec91 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -16,7 +16,7 @@ test_unit:
     - name: postgres:latest
       alias: db
   script:
-    - npm install
+    - yarn install
     - npx sequelize db:migrate --env test
     - NODE_ENV=test npx mocha ./test/unit  -name '*.spec.js' --recursive -r babel-register --reporter dot --exit
   only:
@@ -24,7 +24,7 @@ test_unit:
 
 test_lint:
   script:
-    - npm install
+    - yarn install
     - npx eslint app && npx eslint test
   only:
     - merge_requests
\ No newline at end of file
-- 
GitLab