this.handleContactChange(label,e.target.value)} label={label} value={this.getContactValue(label)}/>)\n }\n getSteps() {\n return ['Please provide contact information', 'Best time to call', 'CastleGarde Services','Additional Information'];\n }\n getStepContent(step) {\n switch (step) {\n case 0:\n return (\n \n );\n case 1:\n return (\n \n \n {['Any Day','Monday','Tuesday','Wednesday','Thursday','Friday'].map(day => (\n \n {this.handleValueChange('Any Day',day,'Day',e.target.checked)}}/>\n \n \n \n \n \n \n \n ))}\n
\n \n {['Anytime','Early Morning','Mid Morning','Mid Day','Early Afternoon','Mid Afternoon','Late Afternoon'].map(time => (\n \n {this.handleValueChange('Anytime',time,'Time',e.target.checked)}}/>\n \n \n \n \n \n \n \n ))}\n
\n
\n );\n case 2:\n return (\n \n {[\n ['General Information','Information Security Programs','Risk Assessment Programs','Compliance'],\n ['Policy and Procedures','Penetration Testing','Bank Secrecy','Business Continuity'],\n ['Training','Red Flag Identity Theft','Something else','All the above']\n ].map(serviceArray => (\n \n {serviceArray.map(service => (\n \n {this.handleValueChange('All the above',service,'Service',e.target.checked)}}/>\n \n \n ))}\n
\n ))}\n
\n );\n case 3:\n return (\n \n
Enter additional information - 1000 characters max.: \n {this.createRichTextBox()}\n
\n
If you have a document accessable by your PC, you can upload it now. We \nsupport Adobe .pdf, MS/Word .doc, WordPerfect .wpd, plain text .txt, Rich Text \nFormat .rtf, Excel .xls fiel types. \n
this.fileInput = ref} type='file' id='file'/>\n
\n
\n );\n default:\n return 'Unknown step';\n }\n }\n handleNext = () => {\n this.setState(state => ({\n activeStep: state.activeStep + 1,\n }));\n };\n \n handleBack = () => {\n this.setState(state => ({\n activeStep: state.activeStep - 1,\n }));\n };\n \n handleReset = () => {\n this.setState({\n activeStep: 0,\n });\n };\n \n handleSubmit = () => {\n axios.get('/api/ri/key')\n .then(response => {\n const id = response.data;\n\n if(this.file){\n let data = new FormData();\n data.append('file',this.file,this.file.name);\n axios.post('api/ri/upload/'+id,\n data,\n {\n headers: {\n 'accept': 'application/json',\n 'Accept-Language': 'en-US,en;q=0.8',\n 'Content-Type': `multipart/form-data; boundary=${data._boundary}`,\n }\n }\n ).then(response => {\n const data = JSON.parse(JSON.stringify(this.state));\n delete data.activeStep;\n \n axios.post('/api/ri/submitinformation/'+id,data)\n .then(response => {\n this.file = null;\n this.infoDialg.show(\"Your request information is sent to CastleGarde successfully, we will contact you soon\",\"SUCCESS\",false);\n this.setState({activeStep:0});\n })\n .catch(this.showAxiosError);\n })\n .catch(error => alert(error.message));\n }else{\n const data = JSON.parse(JSON.stringify(this.state));\n delete data.activeStep;\n \n axios.post('/api/ri/submitinformation/'+id,data)\n .then(response => {\n this.infoDialg.show(\"Your request information is sent to CastleGarde successfully, we will contact you soon\",\"SUCCESS\",false);\n this.setState({activeStep:0});\n })\n .catch(this.showAxiosError);\n }\n })\n .catch(this.showAxiosError);\n };\n isValidateEmail(email){\n const regex = /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)/;\n return regex.test(email);\n }\n render(){\n const steps = this.getSteps();\n const { activeStep } = this.state;\n return (\n \n
\n \n Request Information\n \n \n\n \n \n \n
\n {steps.map((label, index) => (\n \n {label} \n \n {this.getStepContent(index)} \n \n
\n \n Back\n \n \n \n {activeStep === steps.length - 1 ? 'Finish' : 'Next'}\n \n
\n
\n \n \n ))}\n \n {activeStep === steps.length && (\n
\n All steps completed - you're finished \n \n Reset\n \n \n Submit\n \n \n )}\n
this.infoDialg = ref}/>\n \n );\n }\n}","import React from 'react';\n\nimport './Groupbox.css';\n\nexport default class Groupbox extends React.Component{\n render(){\n return(\n \n \n {this.props.header} \n {this.props.children}\n
\n \n );\n }\n}","/**\n * Function to get cursor position\n */\r\nvar ip = require('ip');\r\n\nexport function getRange(el) {\n var cuRange, tbRange, headRange, range, dupRange, ret = {};\n if (el.setSelectionRange) {\n // standard\n ret.begin = el.selectionStart;\n ret.end = el.selectionEnd;\n ret.result = el.value.substring(ret.begin, ret.end);\n } else if (document.selection) {\n // ie\n if (el.tagName.toLowerCase() === 'input') {\n cuRange = document.selection.createRange();\n tbRange = el.createTextRange();\n tbRange.collapse(true);\n tbRange.select();\n headRange = document.selection.createRange();\n headRange.setEndPoint('EndToEnd', cuRange);\n ret.begin = headRange.text.length - cuRange.text.length;\n ret.end = headRange.text.length;\n ret.result = cuRange.text;\n cuRange.select();\n } else if (el.tagName.toLowerCase() === 'textarea') {\n range = document.selection.createRange();\n dupRange = range.duplicate();\n dupRange.moveToElementText(el);\n dupRange.setEndPoint('EndToEnd', range);\n ret.begin = dupRange.text.length - range.text.length;\n ret.end = dupRange.text.length;\n ret.result = range.text;\n }\n }\n el.focus();\n return ret;\n}\n\nexport function isValidIPItemValue(val) {\n val = parseInt(val);\n return !isNaN(val) && val >= 0 && val <= 255;\n}\r\n\r\nexport function calcCount(ipRange) {\r\n if (!ipRange) {\r\n return null;\r\n }\r\n const ss = ipRange.split('-');\r\n if (ss.length > 1) {\r\n const from = ss[0];\r\n const fa = from.split('.');\r\n const to = `${fa[0]}.${fa[1]}.${fa[2]}.${ss[1]}`;\r\n return (ip.toLong(to) - ip.toLong(from)) + 1;\r\n } else if (ss.length === 1) {\r\n return 1;\r\n } else {\r\n alert(`Error: calcCount for : ${ipRange}`);\r\n }\r\n}\r\nfunction isValid(ipRange) {\r\n if (!ipRange) {\r\n return false;\r\n } else\r\n return ip.isV4Format(ipRange.split('-')[0]);\r\n}\r\nexport function getNotation(ipRange) {\r\n if (!ipRange) {\r\n return 'None';\r\n }\r\n const ss = ipRange.split('-');\r\n if (ss.length === 2) {\r\n return 'From To';\r\n } else {\r\n if (ip.isV4Format(ss[0])) {\r\n return 'Single';\r\n } else {\r\n return 'URL';\r\n }\r\n }\r\n}\r\nfunction getFromAndTo(ipRange) {\r\n const ss = ipRange.split('-');\r\n if (ss.length === 1) {\r\n return { from: ipRange, to: ipRange };\r\n } else if (ss.length === 2) {\r\n const from = ss[0];\r\n const fa = from.split('.');\r\n const to = `${fa[0]}.${fa[1]}.${fa[2]}.${ss[1]}`;\r\n return { from, to };\r\n } else {\r\n throw {};\r\n }\r\n}\r\nexport function isOverlay(left, right) {\r\n if (!isValid(left) || !isValid(right)) {\r\n return left === right;\r\n }\r\n const l = getFromAndTo(left);\r\n const r = getFromAndTo(right);\r\n \r\n return !(ip.toLong(l.to) < ip.toLong(r.from) || ip.toLong(l.from) > ip.toLong(r.to));\r\n}\r\n\r\nfunction verifySingle(value) {\n if (!ip.isV4Format(value)) {\n return ' IP is not valid';\n }\n}\nfunction verifyFromTo(value) {\r\n const temp = value.split('-');\r\n const from = temp[0];\r\n const to = temp[1];\r\n if (!ip.isV4Format(from)) {\r\n return { error: '\"FROM\" IP is not valid' };\r\n }\n if (!to || to < 1 || to > 255) {\n return { error: '\"To\" is not valid' };\n }\r\n const fromInt = parseInt(from.split('.')[3]);\r\n const toInt = parseInt(to);\n if (fromInt > toInt) {\n return { error: '\"From\" must be less than \"TO\"' };\n }\n}\nfunction verifyURL() {\n const { url } = this.props;\r\n if (url) {\r\n return { value: url };\r\n } else {\r\n return { error: 'URL is empty' };\r\n }\n}\nexport function verify(format, value) {\n if (format === 'From To') {\r\n return verifyFromTo(value);\r\n } else if (format === 'Single') {\r\n return verifySingle(value);\r\n } else if (format === 'URL') {\r\n return verifyURL(value);\r\n } else {\r\n return 'Not support format :' + format;\r\n }\n}","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { getRange, isValidIPItemValue } from './helper';\nimport './style.css';\n\nexport default class IPut extends React.Component {\n /**\n * set default props\n */\n static defaultProps = {\n className: '',\n defaultValue: '...',\n isError: () => false,\n onChange: new Function()\n }\n /**\n * set prop type\n */\n static propTypes = {\n className: PropTypes.string,\n defaultValue: PropTypes.string || PropTypes.array,\n isError: PropTypes.func,\n onChange: PropTypes.func\n }\n /**\n * default state value\n */\n state = {\n value: []\n }\n\n componentDidMount() {\n let { defaultValue: value } = this.props;\n if (!Array.isArray(value)) {\n value = value.split('.');\n }\n this.setState({ value });\n }\n\n /**\n * Change Event\n */\n handleChange(e, i) {\n let val = parseInt(e.target.value);\n if (isNaN(e.target.value)) {\n return e.preventDefault();\n }\n\n if (e.target.value !== '' && !isValidIPItemValue(val)) {\n val = 255;\n }\n\n let value = this.state.value;\n value[i] = val;\n this.setState({ value }, () => this.onPropsChange());\n\n if (!isNaN(val) && String(val).length === 3 && i < 3) {\n this[`_input-${i + 1}`].focus();\n }\n }\n\n /**\n * Keydown Event\n */\n handleKeyDown(e, i) {\n /* 37 = ←, 39 = →, 8 = backspace */\n //alert(e.keyCode);\n let domId = i;\n if ((e.keyCode === 37 || e.keyCode === 8) && getRange(e.target).end === 0 && i > 0) { domId = i - 1; }\n if ((e.keyCode === 39 || e.keyCode === 190) && getRange(e.target).end === e.target.value.length && i < 3) { domId = i + 1; }\n this[`_input-${domId}`].focus();\n }\n\n /**\n * Paste Event\n */\n handlePaste(e, i) {\n if (!e.clipboardData || !e.clipboardData.getData) {\n return;\n }\n\n const pasteData = e.clipboardData.getData('text/plain');\n if (!pasteData) {\n return;\n }\n\n const value = pasteData.split('.').map(v => parseInt(v));\n if (value.length !== 4 - i) {\n return;\n }\n\n if (!value.every(isValidIPItemValue)) {\n return;\n }\n\n const { value: oldValue } = this.state;\n value.forEach((val, j) => {\n oldValue[i + j] = val;\n });\n\n this.setState({ value: oldValue }, () => this.onPropsChange());\n return e.preventDefault();\n }\n\n /**\n * call change props\n */\n onPropsChange() {\n const { value } = this.state;\n const ip = value.map(val => isNaN(val) ? '' : val).join('.');\n return this.props.onChange(ip);\n }\n\n render() {\n const { value } = this.state;\n const ip = value.map(val => isNaN(val) ? '' : val).join('.');\n\n const className = [\n 'react-ip-input',\n this.props.className,\n this.props.isError(ip) ? 'has-error' : ''\n ].join(' ');\n\n return (\n \n {value.map((val, i) =>\n
\n this[`_input-${i}`] = el}\n type=\"text\"\n value={isNaN(val) ? '' : val}\n onChange={e => this.handleChange(e, i)}\n onKeyDown={e => this.handleKeyDown(e, i)}\n onPaste={e => this.handlePaste(e, i)}\n />\n {i !== 3 ? . : false}\n
\n )}\n
\n );\n }\n}","import React from 'react';\n\nimport './style.css';\n\nexport default class CidrInput extends React.Component{\n constructor(props){\n super(props);\n\n this.state = {value:''};\n this.onChange = this.onChange.bind(this);\n }\n onChange(e){\n const intValue = parseInt(e.target.value);\n if(intValue > 0 && intValue <= 32){\n this.setState({value:intValue});\n \n if(this.props.onChange){\n this.props.onChange(intValue);\n }\n }else{\n this.setState({value:''});\n if(this.props.onChange){\n this.props.onChange(intValue);\n }\n }\n }\n render(){\n return (\n \n \n
\n );\n }\n}","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { getRange, isValidIPItemValue } from './helper';\nimport './style.css';\n\nexport default class WildcardInput extends React.Component {\n /**\n * set default props\n */\n static defaultProps = {\n className: '',\n defaultValue: '...',\n isError: () => false,\n onChange: new Function()\n }\n /**\n * set prop type\n */\n static propTypes = {\n className: PropTypes.string,\n defaultValue: PropTypes.string || PropTypes.array,\n isError: PropTypes.func,\n onChange: PropTypes.func\n }\n /**\n * default state value\n */\n state = {\n value: []\n }\n\n componentDidMount() {\n let { defaultValue: value } = this.props;\n if (!Array.isArray(value)) {\n value = value.split('.');\n }\n this.setState({ value });\n }\n\n /**\n * Change Event\n */\n handleChange(e, i) {\n if(e.target.value === '*'){\n if(i === 3){\n let value = this.state.value;\n value[3] = '*';\n this.setState({ value }, () => this.onPropsChange());\n return;\n }\n else{\n return e.preventDefault();\n }\n }\n\n let val = parseInt(e.target.value);\n if (isNaN(e.target.value)) {\n return e.preventDefault();\n }\n\n if (e.target.value !== '' && !isValidIPItemValue(val)) {\n val = 255;\n }\n\n let value = this.state.value;\n value[i] = val;\n this.setState({ value }, () => this.onPropsChange());\n\n if (!isNaN(val) && String(val).length === 3 && i < 3) {\n this[`_input-${i + 1}`].focus();\n }\n }\n\n /**\n * Keydown Event\n */\n handleKeyDown(e, i) {\n /* 37 = ←, 39 = →, 8 = backspace */\n //190 = .\n //alert(e.keyCode);\n let domId = i;\n if ((e.keyCode === 37 || e.keyCode === 8) && getRange(e.target).end === 0 && i > 0) { domId = i - 1; }\n if ((e.keyCode === 39 || e.keyCode === 190) && getRange(e.target).end === e.target.value.length && i < 3) { domId = i + 1; }\n this[`_input-${domId}`].focus();\n }\n\n /**\n * Paste Event\n */\n handlePaste(e, i) {\n if (!e.clipboardData || !e.clipboardData.getData) {\n return;\n }\n\n const pasteData = e.clipboardData.getData('text/plain');\n if (!pasteData) {\n return;\n }\n\n const value = pasteData.split('.').map(v => parseInt(v));\n if (value.length !== 4 - i) {\n return;\n }\n\n if (!value.every(isValidIPItemValue)) {\n return;\n }\n\n const { value: oldValue } = this.state;\n value.forEach((val, j) => {\n oldValue[i + j] = val;\n });\n\n this.setState({ value: oldValue }, () => this.onPropsChange());\n return e.preventDefault();\n }\n\n /**\n * call change props\n */\n onPropsChange() {\n const { value } = this.state;\n const ip = value.map(val => isNaN(val) ? '' : val).join('.');\n return this.props.onChange(ip);\n }\n\n render() {\n const { value } = this.state;\n const ip = value.map(val => isNaN(val) ? '' : val).join('.');\n\n const className = [\n 'react-ip-input',\n this.props.className,\n this.props.isError(ip) ? 'has-error' : ''\n ].join(' ');\n\n return (\n \n {value.map((val, i) =>\n
\n this[`_input-${i}`] = el}\n type=\"text\"\n value={(isNaN(val) && val !== '*' )? '' : val}\n onChange={e => this.handleChange(e, i)}\n onKeyDown={e => this.handleKeyDown(e, i)}\n onPaste={e => this.handlePaste(e, i)}\n />\n {i !== 3 ? . : false}\n
\n )}\n
\n );\n }\n}","import React from 'react';\n\nimport './style.css';\n\nexport default class UrlInput extends React.Component{\n constructor(props){\n super(props);\n\n this.state = {value:''};\n this.onChange = this.onChange.bind(this);\n }\n onChange(e){\n this.setState({ value: e.target.value });\r\n if (this.props.onChange) {\r\n this.props.onChange(e.target.value);\r\n }\n }\n render(){\n return (\n \n \n
\n );\n }\n}","import React from 'react';\n\nimport './style.css';\n\nexport default class ToInput extends React.Component{\n constructor(props){\n super(props);\n\n this.state = {value:''};\n this.onChange = this.onChange.bind(this);\n }\n onChange(e){\n const intValue = parseInt(e.target.value);\n if(intValue > 0 && intValue <= 255){\n this.setState({value:intValue});\n \n if(this.props.onChange){\n this.props.onChange(intValue);\n }\n }else{\n this.setState({value:''});\n if(this.props.onChange){\n this.props.onChange(intValue);\n }\n }\n }\n render(){\n return (\n \n \n
\n );\n }\n}","import React, {Component} from 'react';\n\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport Chip from '@material-ui/core/Chip';\n\nimport IPut from './iput/src/index';\nimport CidrInput from './iput/src/CidrInput';\nimport WildcardInut from './iput/src/WildcardInput';\nimport UrlInput from './iput/src/UrlInput';\nimport ToInput from './iput/src/ToInput';\n\n\nimport { getNotation } from './iput/src/helper';\n\n\n\nexport default class HostsInput extends React.Component{\n constructor(props){\n super(props);\n\n this.Format = this.Format.bind(this);\n }\n Format(props) {\n const {my, children, format, ...other } = props;\n \n return (\n \n \n {children}\n \n \n );\n }\n render() {\n var {format, value,onChange } = this.props;\n var from, to;\n if (value) {\n format = format? format : getNotation(value);\n if (format === 'Single' || format === 'URL') {\n from = value;\n } else if (format === 'From To') {\n if (value) {\n const ss = value.split('-');\n from = ss[0];\n to = ss[1];\n }\n }\n } else if (!format) {\n format = 'Single';\n }\n\n return(\n \n \n \n onChange(format,p)} />\n \n \n \n onChange(format,`${p}-${to}`)} />\n \n onChange(format,`${from}-${p}`)} />\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n onChange(format, p)} />\n \n
\n );\n }\n}","import React from 'react';\n\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\n\nimport {calcCount} from './iput/src/helper';\n\nexport default class HostsTable2 extends React.Component {\n \n render() {\n const { selected } = this.props;\n return (\n \n
\n \n \n Value \n Count \n \n \n \n {this.props.data.map(row => (\n {\n if (this.props.onSelect) {\n this.props.onSelect(row);\n }\n }}>\n \n {row}\n \n {calcCount(row)} \n\n \n ))}\n \n \n
\n
\n );\n }\n}","import React from 'react';\n\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\n\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableRow from '@material-ui/core/TableRow';\r\n\r\nimport { calcCount, verify } from './iput/src/helper';\n\nvar ip = require('ip');\n\nexport default class Validation extends React.Component {\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {count:null,error:null}\r\n }\r\n run(format, value) {\r\n const error = verify(format, value);\r\n var count;\r\n if (!error) {\r\n count = calcCount(value);\r\n }\r\n this.setState({ count, error });\r\n if (this.props.onValidate) {\r\n this.props.onValidate(!error);\r\n }\r\n }\n render() {\r\n const { error, count } = this.state;\n return (\n \n \n {error}
\n \n \n \n \n \n Count \n {count} \n \n \n
\n \n\n \n );\n }\n}","import React from 'react';\r\n\r\nimport Groupbox from '../core/Groupbox';\r\nimport HostsInput from './HostsInput';\r\n//import HostsTable from './HostsTable';\r\nimport HostsTable2 from './HostsTable2';\r\nimport Validation from './Validation';\r\nimport { isOverlay, getNotation } from './iput/src/helper';\r\n\r\nfunction removeFromArray(items, item) {\r\n var index = items.indexOf(item);\r\n if (index >= 0) {\r\n items.splice(index, 1);\r\n }\r\n}\r\n\r\nexport default class HostsTab extends React.Component{\r\n constructor(props){\r\n super(props);\r\n\r\n this.state = {\r\n includeSelected: null, excludeSelected: null, format: null, value: null,\r\n isValid:false};\r\n\r\n this.checkOverlay = this.checkOverlay.bind(this);\r\n this.checkOverlayAll = this.checkOverlayAll.bind(this);\r\n }\r\n checkOverlay(toAdd, target) {\r\n if (isOverlay(toAdd, target)) {\r\n return `${toAdd} is overlay with ${target}`;\r\n } else {\r\n return null;\r\n }\r\n }\r\n checkOverlayAll(toAdd, targetArray) {\r\n for (let target of targetArray) {\r\n const overlayCheck = this.checkOverlay(toAdd, target);\r\n if (overlayCheck) {\r\n return overlayCheck;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n onEvent(ribbonTitle, groupTitle, itemTitle) {\r\n const { include, exclude } = this.props;\r\n const { includeSelected, excludeSelected, value, isValid } = this.state;\r\n if (groupTitle === 'IP Entry Format') {\r\n this.setState({ format: itemTitle, value: null });\r\n }else if(groupTitle === 'Apply Entry'){\r\n if (itemTitle === 'Add') {\r\n if (!isValid) {\r\n alert('Not valid');\r\n return;\r\n }\r\n if (value) {\r\n const overlayCheck = this.checkOverlayAll(value, include);\r\n if (overlayCheck) {\r\n alert(overlayCheck);\r\n } else {\r\n include.push(value);\r\n this.onChange(include, exclude);\r\n }\r\n }\r\n } else if (itemTitle === 'Exclude') {\r\n if (!isValid) {\r\n alert('Not valid');\r\n return;\r\n }\r\n if (value) {\r\n const overlayCheck = this.checkOverlayAll(value, exclude);\r\n if (overlayCheck) {\r\n alert(overlayCheck);\r\n } else {\r\n exclude.push(value);\r\n this.onChange(include, exclude);\r\n }\r\n }\r\n } else if (itemTitle === 'Delete') {\r\n if (includeSelected) {\r\n removeFromArray(include, includeSelected);\r\n } else if (excludeSelected) {\r\n removeFromArray(exclude, excludeSelected);\r\n }\r\n\r\n this.onChange(include, exclude);\r\n }\r\n }\r\n }\r\n onChange(include, exclude) {\r\n this.setState({ include, exclude });\r\n if (this.props.onChange) {\r\n this.props.onChange(include, exclude);\r\n }\r\n }\r\n render() {\r\n const { include, exclude } = this.props;\r\n const { includeSelected, excludeSelected, format, value } = this.state;\r\n return (\r\n \r\n
\r\n this.hostsInput = ref} onChange={(format, value) => {\r\n this.setState({ format, value });\r\n this.validator.run(format,value);\r\n }\r\n } />\r\n this.validator = ref}\r\n value={value}\r\n onValidate={isValid => this.setState({ isValid })} />\r\n
\r\n \r\n
\r\n \r\n {\r\n const notation = getNotation(row);\r\n this.setState({ includeSelected: row, excludeSelected:null })\r\n }}\r\n data={include} />\r\n \r\n \r\n {\r\n const notation = getNotation(row);\r\n this.setState({ includeSelected: null, excludeSelected:row })\r\n }}\r\n data={exclude} />\r\n \r\n
\r\n
\r\n );\r\n }\r\n}","import React from 'react';\r\n\r\nimport axios from 'axios';\r\n\r\nimport AppBar from '@material-ui/core/AppBar';\r\nimport Toolbar from '@material-ui/core/Toolbar';\r\nimport Typography from '@material-ui/core/Typography';\r\n\r\nimport Button from '@material-ui/core/Button';\r\nimport Paper from '@material-ui/core/Paper';\r\n\r\nimport Input from '@material-ui/core/Input';\r\nimport MaskedInput from 'react-text-mask';\r\nimport FormControl from '@material-ui/core/FormControl';\r\nimport InputLabel from '@material-ui/core/InputLabel';\r\nimport InputAdornment from '@material-ui/core/InputAdornment';\r\nimport Grid from '@material-ui/core/Grid';\r\nimport TelephoneIcon from '@material-ui/icons/ContactPhone';\r\nimport EmailIcon from '@material-ui/icons/ContactMail';\r\nimport ClientIcon from '@material-ui/icons/AccountBalance';\r\nimport PeopleIcon from '@material-ui/icons/People';\r\nimport AddIcon from '@material-ui/icons/Add';\r\nimport ExcludeIcon from '@material-ui/icons/RemoveCircleOutline';\r\nimport DeleteIcon from '@material-ui/icons/Delete';\r\nimport SignerEmailIcon from '@material-ui/icons/EmailOutlined';\r\nimport SignerTitleIcon from '@material-ui/icons/Title';\r\n\r\nimport HostsTab from './HostsTab';\r\n\r\nimport 'react-quill/dist/quill.snow.css'; // ES6\r\n\r\nfunction validateEva(eva) {\r\n const r = [];\r\n if (!eva.clientName) {\r\n r.push(\"Credit Union Name is empty\");\r\n }\r\n if (!eva.contactName) {\r\n r.push(\"Contact Name is empty\");\r\n }\r\n if (!eva.telephone) {\r\n r.push(\"Contact Telephone is empty\");\r\n }\r\n if (!eva.email) {\r\n r.push(\"Contact Email is empty\");\r\n }\r\n if (!eva.signerName) {\r\n r.push(\"Signer Name is empty\");\r\n }\r\n if (!eva.signerEmail) {\r\n r.push(\"Signer Email is empty\");\r\n }\r\n if (!eva.include) {\r\n r.push(\"Publis IP Addresses is empty\");\r\n }\r\n if (r.length > 0) {\r\n return r.join('\\n');\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\nfunction TextMaskCustom(props) {\r\n const { inputRef, ...other } = props;\r\n \r\n return (\r\n {\r\n inputRef(ref ? ref.inputElement : null);\r\n }}\r\n mask={['(', /[1-9]/, /\\d/, /\\d/, ')', ' ', /\\d/, /\\d/, /\\d/, '-', /\\d/, /\\d/, /\\d/, /\\d/]}\r\n placeholderChar={'\\u2000'}\r\n showMask\r\n />\r\n );\r\n }\r\n\r\nexport class EvaWaiver extends React.Component {\r\n constructor(props){\r\n super(props);\r\n this.state = {\r\n activeStep: 1, eva: {},Contact:{},Day:'Any Day',Time:'Anytime',Service:'General Information'};\r\n\r\n this.getContactValue = this.getContactValue.bind(this);\r\n this.handleContactChange = this.handleContactChange.bind(this);\r\n\r\n this.handleValueChange = this.handleValueChange.bind(this);\r\n this.fileInputChanged = this.fileInputChanged.bind(this);\r\n\r\n this.showAxiosError = this.showAxiosError.bind(this);\r\n }\r\n showAxiosError(error){\r\n if(error.response && error.response.data){\r\n this.infoDialog.show(error.response.data,\"ERROR: \" +error.response.status,true);\r\n }else{\r\n this.infoDialog.show(JSON.stringify(error),\"ERROR\",true);\r\n }\r\n }\r\n getContactValue(field){\r\n return this.state.Contact[field];\r\n }\r\n handleContactChange = (field,value) => {\r\n const temp = this.state.Contact;\r\n temp[field] = value;\r\n this.setState({Contact:temp});\r\n }\r\n fileInputChanged(){\r\n this.file = this.fileInput.files[0];\r\n }\r\n removeFromString(str,item){\r\n if(!str){\r\n return str;\r\n }\r\n var items = str.split(';');\r\n var index = items.indexOf(item);\r\n if(index >= 0){\r\n items.splice(index,1);\r\n }\r\n return items.join(';')\r\n }\r\n addToString(str,item){\r\n if(!str){\r\n return item;\r\n }\r\n var items = str.split(';');\r\n var index = items.indexOf(item);\r\n if(index >= 0){\r\n return str;\r\n }else{\r\n items.push(item);\r\n return items.join(';');\r\n }\r\n }\r\n getValueState(exclusive,value,field){\r\n if(value === exclusive){\r\n return this.state[field] === value;\r\n }else{\r\n return (this.state[field] || '').indexOf(value) > -1;\r\n }\r\n }\r\n handleValueChange(exclusive,value,field,checked){\r\n if(checked){\r\n if(value === exclusive){\r\n const temp = {};\r\n temp[field] = value;\r\n this.setState(temp);\r\n }else{\r\n var vv = this.state[field];\r\n vv = this.removeFromString(vv,exclusive);\r\n vv = this.addToString(vv,value);\r\n const temp = {};\r\n temp[field] = vv;\r\n this.setState(temp);\r\n }\r\n }else{\r\n if(value === exclusive){\r\n const temp = {};\r\n temp[field] = value;\r\n this.setState(temp);\r\n }else{\r\n const vv = this.removeFromString(this.state[field],value);\r\n const temp = {};\r\n temp[field] = vv;\r\n this.setState(temp);\r\n }\r\n }\r\n }\r\n isValidateEmail(email){\r\n const regex = /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)/;\r\n return regex.test(email);\r\n }\r\n render(){\r\n const { activeStep,eva } = this.state;\r\n return (\r\n \r\n
\r\n \r\n \r\n CastleGarde External Vulnerability Assessment/Penetration Testing (EVA/PT) Waiver\r\n \r\n \r\n \r\n
\r\n \r\n \r\n Credit Union Name \r\n {\r\n eva.clientName = event.target.value;\r\n this.setState({ eva });\r\n }}\r\n startAdornment={\r\n \r\n \r\n \r\n } />\r\n \r\n \r\n \r\n \r\n Contact Name \r\n {\r\n eva.contactName = event.target.value;\r\n //if (!eva.signerName) {\r\n eva.signerName = event.target.value;\r\n //}\r\n this.setState({ eva });\r\n }}\r\n startAdornment={\r\n \r\n \r\n \r\n } />\r\n \r\n \r\n \r\n
\r\n \r\n \r\n Contact Telephone \r\n {\r\n eva.telephone = event.target.value;\r\n this.setState({ eva });\r\n }}\r\n startAdornment={\r\n \r\n \r\n \r\n }\r\n />\r\n \r\n \r\n \r\n \r\n Contact Email \r\n {\r\n eva.email = event.target.value;\r\n //if (!eva.signerEmail) {\r\n eva.signerEmail = event.target.value;\r\n //}\r\n this.setState({ eva });\r\n }}\r\n startAdornment={\r\n \r\n \r\n \r\n } />\r\n \r\n \r\n \r\n
\r\n \r\n \r\n Signer Name \r\n {\r\n eva.signerName = event.target.value;\r\n this.setState({ eva });\r\n }}\r\n startAdornment={\r\n \r\n \r\n } />\r\n \r\n \r\n \r\n \r\n Signer Title \r\n {\r\n eva.signerTitle = event.target.value;\r\n this.setState({ eva });\r\n }}\r\n startAdornment={\r\n \r\n \r\n \r\n } />\r\n \r\n \r\n \r\n \r\n Signer Email \r\n {\r\n eva.signerEmail = event.target.value;\r\n this.setState({ eva });\r\n }}\r\n startAdornment={\r\n \r\n \r\n \r\n } />\r\n \r\n \r\n \r\n
\r\n {\r\n this.hostsTab.onEvent('', 'IP Entry Format', 'Single');\r\n }} >Single \r\n |\r\n {\r\n this.hostsTab.onEvent('', 'IP Entry Format', 'From To');\r\n }} >From To \r\n |\r\n {\r\n this.hostsTab.onEvent('', 'IP Entry Format', 'URL');\r\n }} >URL \r\n \r\n {\r\n this.hostsTab.onEvent('', 'Apply Entry', 'Add');\r\n }} > \r\n {\r\n this.hostsTab.onEvent('', 'Apply Entry', 'Exclude');\r\n }} > \r\n {\r\n this.hostsTab.onEvent('', 'Apply Entry', 'Delete');\r\n }} > \r\n \r\n
this.hostsTab = ref}\r\n include={eva.include ? eva.include.split(',') : []}\r\n exclude={eva.exclude ? eva.exclude.split(',') : []}\r\n onChange={(include, exclude) => {\r\n eva.include = include.join(',');\r\n eva.exclude = exclude.join(',');\r\n this.setState({ eva });\r\n }} />\r\n \r\n {\r\n this.setState({ eva: {} });\r\n }} style={{ marginRight: '20px' }}>\r\n Reset\r\n \r\n {\r\n const validateResult = validateEva(eva);\r\n if (validateResult) {\r\n alert(validateResult);\r\n } else {\r\n axios.post('api/waiver/submitEvaWaiver', eva)\r\n .then(response => {\r\n const redirectUrl = response.data.redirectUrl;\r\n const envelopId = response.data.envelopId;\r\n this.setState({ envelopId });\r\n window.open(redirectUrl);\r\n }).catch(error => alert(error.message));\r\n }\r\n }\r\n } color='primary' variant='contained'>\r\n SIGN and SUBMIT\r\n \r\n {/*\r\n window.open(`api/waiver/getSignedDocument/${this.state.envelopId}`)\r\n } color='secondary' variant='contained'\r\n disabled={!this.state.envelopId}\r\n style={{ marginRight: '30px' }}>\r\n\r\n \r\n \r\n axios.get('api/waiver/done')\r\n .then(response => alert(response.data))\r\n .catch(error => alert(error.message))\r\n } color='secondary' variant='contained'\r\n style={{ marginRight: '30px' }}>\r\n\r\n */}\r\n \r\n \r\n );\r\n }\r\n}","import React from \"react\";\r\nimport {Box, Collapse, IconButton} from '@material-ui/core';\r\nimport Alert from '@material-ui/lab/Alert';\r\nimport {Close} from '@material-ui/icons';\r\n\r\nexport function ErrorBar(props){\r\n const {error,onClear} = props;\r\n\r\n return (\r\n \r\n \r\n {\r\n if(onClear){\r\n onClear();\r\n }\r\n }}\r\n >\r\n \r\n \r\n }\r\n sx={{ mb: 2 }}\r\n >\r\n {(error || '').substring(0,100)}\r\n \r\n\r\n \r\n \r\n );\r\n}\r\n\r\nexport function MessageBar(props){\r\n const {message,onClear} = props;\r\n\r\n return (\r\n \r\n \r\n {\r\n if(onClear){\r\n onClear();\r\n }\r\n }}\r\n >\r\n \r\n \r\n }\r\n sx={{ mb: 2 }}\r\n >\r\n {(message || '').substring(0,100)}\r\n \r\n\r\n \r\n \r\n );\r\n}","import React from 'react';\r\nimport {IconButton, TextField, Toolbar, Tooltip, Typography} from '@material-ui/core';\r\nimport {\r\n AddBox,\r\n AddCircleOutlineOutlined,\r\n Adjust,\r\n DeleteForeverRounded,\r\n PlayCircleFilledOutlined,\r\n StopRounded\r\n} from '@material-ui/icons'\r\nimport DownloadAllIcon from \"@material-ui/icons/CloudDownloadTwoTone\";\r\nimport EmailIcon from \"@material-ui/icons/ContactMail\";\r\nimport {ClearAllTwoTone} from \"@mui/icons-material\";\r\n\r\nexport function WaiversToolbar(props){\r\n const {\r\n newEvaWaiver, isAllowNewEvaWaiver,\r\n onClientFilter\r\n } = props;\r\n\r\n return \r\n CastleGarde Waivers \r\n\r\n onClientFilter(e.target.value)}\r\n variant='outlined' />\r\n\r\n {\r\n isAllowNewEvaWaiver ?\r\n \r\n : ''\r\n }\r\n \r\n \r\n}","import React, {useEffect, useState} from \"react\";\r\nimport {Button, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle} from \"@material-ui/core\";\r\n\r\nexport default function AlertDialog(props) {\r\n const {onDock} = props;\r\n const [open,setOpen] = useState(false);\r\n const [title,setTitle] = useState(null);\r\n const [message, setMessage] = useState(null);\r\n const [onOk, setOnOk] = useState(() => () => alert(\"no onOk set\"));\r\n const show = (title, message, onOk) => {\r\n setOpen(true);\r\n setTitle(title);\r\n setMessage(message);\r\n setOnOk(() => onOk)\r\n };\r\n\r\n useEffect(() => {\r\n onDock(show);\r\n },[]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n return (\r\n \r\n setOpen(false)}\r\n aria-labelledby=\"alert-dialog-title\"\r\n aria-describedby=\"alert-dialog-description\"\r\n >\r\n \r\n {title}\r\n \r\n \r\n \r\n {message}\r\n \r\n \r\n \r\n setOpen(false)}>Cancel \r\n {\r\n setOpen(false);\r\n onOk();\r\n }} autoFocus color='secondary'>\r\n Ok\r\n \r\n \r\n \r\n
\r\n );\r\n}","import React, {useEffect, useState} from \"react\";\r\nimport {\r\n Button,\r\n Chip,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogContentText,\r\n DialogTitle,\r\n Table,\r\n TableCell,\r\n TableRow\r\n} from \"@material-ui/core\";\r\n\r\nimport { EvaWaiver } from \"./EvaWaiver\";\r\n\r\nexport function EvaWaiverDialog(props){\r\n const {onDock} = props;\r\n const [open,setOpen] = useState(false);\r\n const [onOk, setOnOk] = useState(() => () => alert(\"no onOk set\"));\r\n const [evaWaiver,setEvaWaiver] = useState(false);\r\n const show = (evaWaiver, onOk) => {setOpen(true); setEvaWaiver(evaWaiver); setOnOk(() => onOk)};\r\n\r\n useEffect(() => {\r\n onDock(show);\r\n },[]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n return setOpen(false)} \r\n fullWidth maxWidth=\"lg\"\r\n >\r\n New Waiver \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n setOpen(false)}>Cancel \r\n {\r\n \r\n setOpen(false);\r\n onOk(evaWaiver);\r\n }}>OK \r\n \r\n \r\n}","import React, {useEffect, useState} from \"react\";\r\nimport axios from 'axios';\r\n\r\nimport Groupbox from \"../core/Groupbox\";\r\n\r\nimport { IconButton, Typography, Tooltip, TextField, List, ListItem,\r\nListItemText } from '@material-ui/core';\r\n\r\nimport {Add, PersonAdd, PersonAddDisabled, Remove} from '@material-ui/icons';\r\n\r\nimport {ErrorBar, MessageBar} from \"../phish2/Bars\";\r\n\r\nimport { WaiversToolbar } from \"./WaiversToolbar\";\r\n\r\nimport AlertDialog from \"../phish2/AlertDialog\";\r\nimport {EvaWaiverDialog} from \"./EvaWaiverDialog\";\r\n\r\nexport function Waivers(props){\r\n const [isAdmin, setIsAdmin] = useState(false);\r\n const [error, setError] = useState(null);\r\n const [docxClients,setDocxClients] = useState([]);\r\n const [clientFilter,setClientFilter] = useState(null);\r\n const [client,setClient] = useState(null);\r\n\r\n const [showAlertDialog, setShowAlertDialog] = useState(() => () =>\r\n alert('no show alert dialog docked'));\r\n\r\n const [showEvaWaiverDialog, setShowEvaWaiverDialog] = useState(() => () =>\r\n alert('no show alert dialog docked'));\r\n\r\n const displayError = error => {\r\n if (error.response) {\r\n setError(error.response.status + ' ' + error.response.data);\r\n } else if(error.message) {\r\n setError(error.message);\r\n } else{\r\n setError(error);\r\n }\r\n }\r\n\r\n const filterClients = (clients,filter) => {\r\n let r = clients;\r\n if(!r ){\r\n return r;\r\n }\r\n if(filter){\r\n r = clients.filter(p => (p.title && p.title.toUpperCase().startsWith(filter.toUpperCase())));\r\n }\r\n r.sort((a,b) => {\r\n if(a.title > b.title){\r\n return 1;\r\n }\r\n if(a.title < b.title){\r\n return -1;\r\n }\r\n return 0;\r\n });\r\n\r\n return r;\r\n };\r\n const loadIsAdmin = () => {\r\n axios.get('api/phish/isAdmin')\r\n .then(response => {\r\n setIsAdmin(response.data);\r\n })\r\n .catch(() => setIsAdmin(false));\r\n }\r\n const loadClients = () => {\r\n const url = 'api/waivers/docxClients';\r\n axios.get(url)\r\n .then(response => setDocxClients(response.data))\r\n .catch(displayError)\r\n }\r\n useEffect(loadIsAdmin, []);\r\n useEffect(loadClients,[])\r\n\r\n if(!isAdmin){\r\n return '';\r\n }\r\n\r\n return \r\n
setError(null)}/>\r\n setClientFilter(value)}\r\n isAllowNewEvaWaiver={true}\r\n newEvaWaiver={() => showEvaWaiverDialog()}\r\n />\r\n \r\n
\r\n \r\n {\r\n filterClients(docxClients,clientFilter).map(docxClient =>\r\n setClient(docxClient)} dense button>\r\n {docxClient.title + docxClient.id} \r\n )\r\n \r\n } \r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n setShowAlertDialog(() => show)}/>\r\n setShowEvaWaiverDialog(() => show)}/>\r\n \r\n}","import React from 'react';\r\nimport {IconButton, TextField, Toolbar, Tooltip, Typography} from '@material-ui/core';\r\nimport {\r\n AddBox,\r\n AddCircleOutlineOutlined,\r\n Adjust,\r\n DeleteForeverRounded,\r\n PlayCircleFilledOutlined,\r\n StopRounded\r\n} from '@material-ui/icons'\r\nimport DownloadAllIcon from \"@material-ui/icons/CloudDownloadTwoTone\";\r\nimport EmailIcon from \"@material-ui/icons/ContactMail\";\r\nimport {ClearAllTwoTone} from \"@mui/icons-material\";\r\n\r\nexport function PhishToolbar(props){\r\n const {\r\n sendTemplate,\r\n clearTargets,\r\n newRse,isAllowNewRse, newCampaign, isAllowNewCampaign,\r\n deleteRse, isAllowDeleteRse,\r\n isAllowClearTargets,\r\n isAllowEditCampaign, editCampaign,\r\n isAllowStart, startCampaign,\r\n isAllowStop, stopCampaign,\r\n isAllowDeleteCampaign, deleteCampaign,\r\n isAllowReport, reportCampaign,\r\n onClientFilter\r\n } = props;\r\n\r\n return \r\n CastleGarde RSE \r\n\r\n
\r\n\r\n onClientFilter(e.target.value)}\r\n variant='outlined' />\r\n\r\n {\r\n isAllowNewRse ?\r\n \r\n : ''\r\n }\r\n {\r\n isAllowDeleteRse ?\r\n
\r\n : ''\r\n }\r\n {\r\n isAllowClearTargets?\r\n \r\n \r\n
:''\r\n }\r\n {\r\n isAllowNewCampaign ?\r\n \r\n : ''\r\n }\r\n {\r\n isAllowEditCampaign ?\r\n \r\n : ''\r\n }\r\n {\r\n isAllowStart ?\r\n \r\n : ''\r\n }\r\n {\r\n isAllowStop ?\r\n
\r\n : ''\r\n }\r\n {\r\n isAllowDeleteCampaign ?\r\n
\r\n : ''\r\n }\r\n {\r\n isAllowReport ?\r\n
\r\n : ''\r\n }\r\n \r\n}","class DateHelper{\r\n addYears(date,years){\r\n return new Date(date.getFullYear() + parseInt(years,10),date.getMonth(),date.getDate());\r\n }\r\n addDays(date,days){\r\n if(date){\r\n return new Date(date.getTime() + 24*60*60*1000*days);\r\n }else{\r\n return null;\r\n }\r\n }\r\n addHours(date,hours){\r\n return new Date(date.getTime() + 60*60*1000*hours);\r\n }\r\n addFiscalYear(date,years){\r\n return this.addDays(this.addYears(date,years),-1);\r\n }\r\n //mm/dd/yy\r\n toShortDate(dateStr) {\r\n if(!dateStr){\r\n return '';\r\n }\r\n var date = this.toDate(dateStr);\r\n return (date.getMonth() + 1) + '/' + date.getDate()+ '/' + (date.getFullYear() - 2000);\r\n }\r\n //mm/dd/yyyy\r\n toShortDateForCrm(dateStr) {\r\n if (!dateStr) {\r\n return '';\r\n }\r\n var date = this.toDate(dateStr);\r\n return (date.getMonth() + 1) + '/' + date.getDate() + '/' + (date.getFullYear());\r\n }\r\n toShortDateIgnoreTimezone(dateStr) {\r\n if (!dateStr) {\r\n return '';\r\n }\r\n return this.toShortDate(this.addHours(this.toDate(dateStr), 9));\r\n }\r\n\r\n //hh:mm\r\n toShortTime(dateStr){\r\n if(!dateStr){\r\n return '';\r\n }\r\n var dt = this.toDate(dateStr);\r\n return this.pad(dt.getHours())+':'+this.pad(dt.getMinutes());\r\n }\r\n //hh:mm PM AM\r\n toShortTimeForCrm(dateStr) {\r\n if (!dateStr) {\r\n return '';\r\n }\r\n var dt = this.toDate(dateStr);\r\n return this.pad((dt.getHours() + 24) % 12 || 12)\r\n + ':' + this.pad(dt.getMinutes())\r\n + '' + (dt.getHours() >= 12 ? 'PM' : 'AM');\r\n }\r\n \r\n toShortDateRange(StartStr,EndStr){\r\n if(!StartStr){\r\n return '';\r\n }\r\n return this.toShortDate(StartStr) + '-' + this.toShortDate(EndStr);\r\n }\r\n toShortDateRangeIgnoreTimezone(startStr, endStr) {\r\n if (!startStr) {\r\n return '';\r\n } else if (!endStr) {\r\n return '';\r\n } else {\r\n return this.toShortDate(this.addHours(this.toDate(startStr), 9)) + '-' + this.toShortDate(this.addHours(this.toDate(endStr), 9));\r\n }\r\n }\r\n //9 => 09\r\n //11 => 11\r\n pad(number) {\r\n if ( number < 10 ) {\r\n return '0' + number;\r\n }\r\n return number;\r\n }\r\n //yyyy-mm-ddThh:mm\r\n toESTString(dateStr) {\r\n if(!dateStr){\r\n return ''\r\n }\r\n let dt = this.toDate(dateStr);\r\n return dt.getFullYear() +\r\n '-' + this.pad( dt.getMonth() + 1 ) +\r\n '-' + this.pad( dt.getDate() ) +\r\n 'T' + this.pad( dt.getHours() ) +\r\n ':' + this.pad( dt.getMinutes() )\r\n };\r\n //yyyy-mm-dd\r\n toESTDateString(dateStr) {\r\n if(!dateStr){\r\n return ''\r\n }\r\n let dt = this.toDate(dateStr);\r\n return dt.getFullYear() +\r\n '-' + this.pad( dt.getMonth() + 1 ) +\r\n '-' + this.pad( dt.getDate() ) \r\n };\r\n //yyyy-mm-ddThh:mm.sssZ\r\n toESTString2(dateStr) {\r\n if(!dateStr){\r\n return ''\r\n }\r\n let dt = this.toDate(dateStr);\r\n return dt.getFullYear() +\r\n '-' + this.pad( dt.getMonth() + 1 ) +\r\n '-' + this.pad( dt.getDate() ) +\r\n 'T' + this.pad( dt.getHours() ) +\r\n ':' + this.pad( dt.getMinutes() ) +\r\n ':' + this.pad( dt.getSeconds() ) +\r\n '.' + (dt.getMilliseconds() / 1000).toFixed(3).slice(2, 5) +\r\n 'Z';\r\n };\r\n toDate(obj){\r\n if(!obj){\r\n return null;\r\n }\r\n if(typeof obj === 'string'){\r\n if(obj.endsWith('Z')){\r\n return new Date(obj);\r\n }else{\r\n //return new Date(obj+'Z');\r\n return new Date(obj);\r\n }\r\n }else if(typeof obj.getMonth === 'function'){\r\n return obj;\r\n }else{\r\n return null;\r\n }\r\n }\r\n isMoreThanOneDay(start,end){\r\n if(!start){\r\n return false;\r\n }\r\n if(!end){\r\n return false;\r\n }\r\n start = this.toDate(start);\r\n end = this.toDate(end);\r\n const span = end.getTime() - start.getTime();\r\n const result = span >= 24*60*60*1000;\r\n return result;\r\n }\r\n //mm/dd/yy hh:mm\r\n toShortDateTime(dateStr) {\r\n if (!dateStr) {\r\n return '';\r\n }\r\n const date = this.toDate(dateStr);\r\n if(!date){\r\n return '';\r\n }\r\n return (date.getMonth() + 1) + '/' + date.getDate() + '/' + (date.getFullYear() - 2000)\r\n + ' ' + this.pad(date.getHours()) + ':' + this.pad(date.getMinutes());\r\n }\r\n toRoundDate(obj){\r\n if(!obj){\r\n return null;\r\n }\r\n const dt = this.toDate(obj);\r\n return new Date(dt.getFullYear(),dt.getMonth(),dt.getDate(),0,0);\r\n }\r\n roundDateForService(service) {\r\n if (!service) {\r\n return;\r\n }\r\n if (!service.start || !service.end) {\r\n return;\r\n }\r\n \r\n const dtStart = this.toDate(service.start);\r\n const dtEnd = this.toDate(service.end);\r\n\r\n if ((dtStart.getFullYear() === dtEnd.getFullYear()) &&\r\n (dtStart.getMonth() === dtEnd.getMonth()) &&\r\n (dtStart.getDate() === dtEnd.getDate())){\r\n service.start = new Date(dtStart.getFullYear(), dtStart.getMonth(), dtStart.getDate(), 0, 0);\r\n service.end = new Date(dtEnd.getFullYear(), dtEnd.getMonth(), dtEnd.getDate(), 0, 0);\r\n }\r\n else {\r\n service.start = new Date(dtStart.getFullYear(), dtStart.getMonth(), dtStart.getDate(), 0, 1);\r\n service.end = new Date(dtEnd.getFullYear(), dtEnd.getMonth(), dtEnd.getDate(), 0, 1);\r\n }\r\n }\r\n isWithinTwoWeeks(d) {\r\n if (!d) {\r\n return false;\r\n }\r\n d = this.toDate(d);\r\n let now = new Date();\r\n let span = d.getTime() - now.getTime();\r\n if (span < 14 * 24 * 60 * 60 * 1000 && span >= 0) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n isWithinEightHours(d) {\r\n const minutes = this.howManyMinutesToNow(d);\r\n if (!minutes) {\r\n return false;\r\n }\r\n if (minutes < 8 * 60 && minutes >= 0) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n isWithinPastThreeDays(d) {\r\n const minutes = this.howManyMinutesToNow(d);\r\n if (!minutes) {\r\n return false;\r\n }\r\n if (minutes < 0 && minutes >= -3 * 24 * 60) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n howManyMinutesToNow(d) {\r\n if (!d) {\r\n return null;\r\n }\r\n d = this.toDate(d);\r\n let now = new Date();\r\n let span = d.getTime() - now.getTime();\r\n return span / (1000 * 60);\r\n }\r\n howLongToNow(d) {\r\n const minutes = this.howManyMinutesToNow(d);\r\n if (!minutes) {\r\n return null;\r\n }\r\n if (minutes < 60) {\r\n return Math.round(minutes) + ' Mins';\r\n } else if (minutes < 24 * 60) {\r\n return Math.round(minutes / 60) + ' Hours';\r\n } else {\r\n return Math.round(minutes / (24 * 60)) + ' Days';\r\n }\r\n }\r\n compare(obj1,obj2){\r\n if(!obj1){\r\n return 0;\r\n }\r\n if(!obj2){\r\n return 0;\r\n }\r\n const d1 = this.toDate(obj1);\r\n const d2 = this.toDate(obj2);\r\n if(d1 > d2){\r\n return 1;\r\n }else if(d1 < d2){\r\n return -1;\r\n }else{\r\n return 0;\r\n }\r\n }\r\n compare2(obj1,obj2){\r\n if(!obj1){\r\n return -1;\r\n }\r\n if(!obj2){\r\n return 1;\r\n }\r\n const d1 = this.toDate(obj1);\r\n const d2 = this.toDate(obj2);\r\n if(d1 > d2){\r\n return 1;\r\n }else if(d1 < d2){\r\n return -1;\r\n }else{\r\n return 0;\r\n }\r\n }\r\n isGreater(obj1,obj2){\r\n return this.compare(obj1,obj2) === 1;\r\n }\r\n isLess(obj1,obj2){\r\n return this.compare(obj1,obj2) === -1\r\n }\r\n months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\r\n toVagueDate(dateStr) {\r\n if (!dateStr) {\r\n return '';\r\n }\r\n var date = this.toDate(dateStr);\r\n return this.months[date.getMonth()] + '-' + (date.getFullYear() - 2000);\r\n }\r\n}\r\n\r\nexport default new DateHelper();","import dateHelper from \"./dateHelper\";\r\n\r\nexport function SHOW_AXIOS_ERROR(error){\r\n if (error.response) {\r\n alert(error.response.status + ' ' + error.response.data);\r\n } else {\r\n alert(error.message);\r\n }\r\n}\r\n\r\nexport function COMPARE_BY_START(a, b) {\r\n const aDate = dateHelper.toDate(a.start);\r\n const bDate = dateHelper.toDate(b.start);\r\n\r\n if (aDate > bDate) {\r\n return 1;\r\n } else if (aDate < bDate) {\r\n return -1;\r\n } else {\r\n return 0;\r\n }\r\n}","import React, {useEffect, useState} from \"react\";\r\nimport {TreeItem} from \"@material-ui/lab\";\r\nimport {AccountBalanceOutlined, AccountTreeOutlined, AlternateEmailRounded} from \"@material-ui/icons\";\r\nimport {Typography} from \"@material-ui/core\";\r\nimport axios from \"axios\";\r\nimport {COMPARE_BY_START, SHOW_AXIOS_ERROR} from \"../core/FUNCS\";\r\nimport dateHelper from \"../core/dateHelper\";\r\n\r\nfunction MountSensor(props) {\r\n const {\r\n onMount,\r\n } = props;\r\n\r\n useEffect(() => {\r\n onMount(true);\r\n return () => onMount(false)\r\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n return null;\r\n}\r\n\r\nfunction CampaignView(props){\r\n const {campaign, onCampaignSelected} = props;\r\n\r\n return onCampaignSelected(campaign)}\r\n label={\r\n
\r\n
\r\n \r\n {campaign.sendingProfile + ' (' +\r\n dateHelper.toShortDateRange(campaign.start, campaign.end) + ')'}\r\n \r\n
\r\n
}/>\r\n}\r\n\r\nfunction RseView(props){\r\n const {rse, onRseSelected, onCampaignSelected} = props;\r\n const [campaigns, setCampaigns] = useState([]);\r\n const loadMyChildren = () => {\r\n axios.get('api/phish/readCampaigns/'+ rse.id)\r\n .then(response => {\r\n setCampaigns(response.data);\r\n })\r\n .catch(SHOW_AXIOS_ERROR);\r\n };\r\n return onRseSelected(rse,loadMyChildren)}\r\n label={\r\n
\r\n
\r\n \r\n {rse.title} ({dateHelper.toShortDate(rse.start)})\r\n \r\n
\r\n
}>\r\n <>\r\n {\r\n if(isMount){\r\n loadMyChildren();\r\n }\r\n }}/>\r\n {\r\n (campaigns || []).map(camp => )\r\n }\r\n >\r\n\r\n \r\n}\r\n\r\nexport function ClientView(props){\r\n const {docxClient, onClientSelected, onRseSelected, onCampaignSelected} = props;\r\n const [rses, setRses] = useState([]);\r\n const loadMyChildren = () => {\r\n axios.get('api/phish/readRses/'+docxClient.id)\r\n .then(response => {\r\n setRses(response.data);\r\n })\r\n .catch(SHOW_AXIOS_ERROR);\r\n };\r\n\r\n return {onClientSelected(docxClient, loadMyChildren)}}\r\n label={\r\n
\r\n
\r\n \r\n {docxClient.title}\r\n \r\n
\r\n
}>\r\n <>\r\n {\r\n if(isMount) {\r\n loadMyChildren();\r\n }\r\n }}/>\r\n {\r\n (rses || [])\r\n .sort(COMPARE_BY_START)\r\n .map(rse => )\r\n }\r\n >\r\n \r\n}\r\n","import {Paper, Table, TableBody, TableCell, TableHead, TableRow, Typography} from \"@material-ui/core\";\r\nimport React from \"react\";\r\nimport {NativeTypes} from \"react-dnd-html5-backend\";\r\nimport {DropTarget} from \"react-dnd\";\r\nimport dateHelper from \"../core/dateHelper\";\r\n\r\nfunction sortByLastScanDate(myTargets){\r\n if(!myTargets){\r\n return myTargets;\r\n }\r\n return myTargets.sort((a,b) => dateHelper.compare2(a.lastScanDate,b.lastScanDate));\r\n}\r\n\r\nfunction MyTargetsTable(props){\r\n const {items, onDoubleClick} = props;\r\n return \r\n \r\n \r\n Full Name \r\n Email \r\n Status \r\n Last Scan Date \r\n \r\n \r\n \r\n {\r\n sortByLastScanDate(items).map(item => {\r\n onDoubleClick(item.id);\r\n }}\r\n >\r\n {item.name} \r\n {item.email} \r\n {item.status} \r\n {dateHelper.toShortDate(item.lastScanDate)} \r\n )\r\n }\r\n \r\n
\r\n}\r\n\r\n\r\n\r\nconst Panel = ({\r\n accepts,\r\n isOver,\r\n canDrop,\r\n connectDropTarget,\r\n lastDroppedItem,\r\n items,\r\n title,\r\n selectable,\r\n disabled,\r\n onChange,\r\n onDoubleClick\r\n }) => {\r\n return connectDropTarget(\r\n \r\n
\r\n {\r\n items && items.length > 0 ?\r\n \r\n :\r\n \r\n {'Drag an employee list file here to upload targets to phish'}\r\n \r\n\r\n }\r\n \r\n
\r\n )\r\n}\r\n\r\nconst DropPanel = DropTarget(\r\n props => props.accepts,\r\n {\r\n drop(props, monitor) {\r\n props.onDrop(props, monitor)\r\n },\r\n },\r\n (connect, monitor) => ({\r\n connectDropTarget: connect.dropTarget(),\r\n isOver: monitor.isOver(),\r\n canDrop: monitor.canDrop(),\r\n }),\r\n)(Panel)\r\n\r\nexport function MyTargetsView(props) {\r\n const {onUpload,items,disabled,onChange,title,selectable,\r\n onDoubleClick\r\n } = props;\r\n const handleDrop = (item, monitor)=>{\r\n if (onUpload) {\r\n onUpload(monitor.getItem().files[0]);\r\n }\r\n };\r\n return \r\n {\r\n disabled?\r\n
:\r\n
\r\n\r\n }\r\n\r\n
;\r\n}","import React, {useEffect, useState} from \"react\";\r\nimport {\r\n Button,\r\n Chip,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogContentText,\r\n DialogTitle,\r\n Table,\r\n TableCell,\r\n TableRow,\r\n TextField\r\n} from \"@material-ui/core\";\r\n//import DateTimePicker from \"react-datetime-picker/src/DateTimePicker\";\r\nimport DatePicker from \"react-date-picker\";\r\n\r\nexport function RseDialog(props){\r\n const {onDock} = props;\r\n const [open,setOpen] = useState(false);\r\n const [rse, setRse] = useState(null);\r\n const [onOk, setOnOk] = useState(() => () => alert(\"no onOk set\"));\r\n const show = (rse, onOk) => {\r\n setOpen(true);\r\n setRse(rse);\r\n setOnOk(() => onOk)\r\n };\r\n\r\n useEffect(() => {\r\n onDock(show);\r\n },[]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n return setOpen(false)}\r\n\r\n >\r\n RSE \r\n \r\n \r\n\r\n \r\n \r\n \r\n For Client \r\n \r\n \r\n\r\n \r\n \r\n \r\n Description \r\n \r\n setRse({...rse, title:e.target.value})}\r\n />\r\n \r\n \r\n \r\n Scheduled \r\n \r\n {\r\n setRse({...rse, start:dt});\r\n }}\r\n />\r\n \r\n \r\n
\r\n \r\n \r\n setOpen(false)}>Cancel \r\n {\r\n if(!rse){\r\n alert('No RSE');\r\n return;\r\n }\r\n if(!rse.start){\r\n alert('Please set up scheduled date');\r\n return;\r\n }\r\n if(!rse.title){\r\n alert('Please give it a description, like Quarter One, or First Half Year');\r\n return;\r\n }\r\n setOpen(false);\r\n onOk(rse);\r\n }}>OK \r\n \r\n \r\n}","import React,{Component} from 'react';\r\nimport Select from '@material-ui/core/Select';\r\nimport MenuItem from '@material-ui/core/MenuItem';\r\nimport Checkbox from '@material-ui/core/Checkbox';\r\nimport { ListItemText } from '@material-ui/core';\r\n \r\nexport default class CgSelect extends Component {\r\n constructor(props){\r\n super(props);\r\n\r\n this.onChange = this.onChange.bind(this);\r\n this.convertValue = this.convertValue.bind(this);\r\n }\r\n onChange(value){\r\n if(!value){\r\n this.props.onChange(null);\r\n }\r\n if(this.props.isMulti){\r\n this.props.onChange(value.join(';'));\r\n }else{\r\n this.props.onChange(value);\r\n }\r\n }\r\n convertValue(){\r\n if(this.props.isMulti){\r\n return this.props.value?this.props.value.split(';'):[];\r\n } else {\r\n return this.props.value ? this.props.value:'';\r\n }\r\n }\r\n render() {\r\n const {style} = this.props;\r\n return (\r\n this.onChange(event.target.value)}\r\n renderValue={value => this.props.isMulti?value.join(';'):value}\r\n displayEmpty={true}\r\n >\r\n {\r\n this.props.options.map(p => (\r\n this.props.isMulti?(\r\n \r\n -1} />\r\n \r\n \r\n ):(\r\n {p} \r\n )\r\n ))\r\n }\r\n \r\n );\r\n }\r\n}","import React, {useEffect, useState} from \"react\";\r\nimport {\r\n Button,\r\n Chip,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogContentText,\r\n DialogTitle,\r\n Table,\r\n TableCell,\r\n TableRow\r\n} from \"@material-ui/core\";\r\n//import DateTimePicker from \"react-datetime-picker/src/DateTimePicker\";\r\nimport DateTimePicker from \"react-datetime-picker\";\r\nimport CgSelect from \"../core/CgSelect\";\r\nimport axios from \"axios\";\r\nimport dateHelper from \"../core/dateHelper\";\r\nimport {Label} from \"@mui/icons-material\";\r\n\r\nexport function CampaignDialog(props){\r\n const {onDock, goParameters} = props;\r\n const [open,setOpen] = useState(false);\r\n const [from,setFrom] = useState(null);\r\n const [campaign, setCampaign] = useState(null);\r\n const [onOk, setOnOk] = useState(() => () => alert(\"no onOk set\"));\r\n //const [goParameters, setGoParameters] = useState([]);\r\n const show = (campaign, onOk) => {setOpen(true); setCampaign(campaign); setOnOk(() => onOk)};\r\n\r\n useEffect(() => {\r\n onDock(show);\r\n },[]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n return setOpen(false)}\r\n\r\n >\r\n Campaign \r\n \r\n \r\n\r\n \r\n \r\n \r\n For Client \r\n \r\n \r\n\r\n \r\n \r\n \r\n For RSE \r\n \r\n \r\n\r\n \r\n \r\n \r\n Start Date \r\n \r\n {\r\n if(!(campaign || {}).start){\r\n dt = dateHelper.addHours(dt, 9.5 );\r\n }\r\n setCampaign({...campaign, start:dt, end:dateHelper.addDays(dt,3)});\r\n }}\r\n />\r\n \r\n \r\n \r\n Interval \r\n \r\n Emails would be sent evenly within\r\n {\r\n setCampaign({...campaign, tag3:value});\r\n }} />\r\n Hours\r\n \r\n \r\n \r\n Due Date \r\n \r\n {\r\n setCampaign({...campaign, end:dt});\r\n }}\r\n />\r\n \r\n \r\n \r\n Email Account \r\n \r\n p.from)}\r\n value={from}\r\n onChange={value => {\r\n setFrom(value);\r\n setCampaign({...campaign, sendingProfile:null});\r\n }} />\r\n \r\n\r\n \r\n \r\n Email Tamplate \r\n \r\n p.from === from) || {}).profiles || []}\r\n value={(campaign || {}).sendingProfile}\r\n onChange={value => {\r\n setCampaign({...campaign, sendingProfile:value});\r\n }} />\r\n \r\n \r\n\r\n
\r\n \r\n \r\n setOpen(false)}>Cancel \r\n {\r\n if(!campaign){\r\n alert('No Campaign');\r\n return;\r\n }\r\n if(!campaign.start){\r\n alert('No Start Date');\r\n return;\r\n }\r\n if(!campaign.end){\r\n alert('No Due Date');\r\n return;\r\n }\r\n if(!campaign.sendingProfile){\r\n alert('No Email Template');\r\n return;\r\n }\r\n setOpen(false);\r\n onOk(campaign);\r\n }}>OK \r\n \r\n \r\n}","import React, {useEffect, useState} from \"react\";\r\nimport {\r\n Button,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogContentText,\r\n DialogTitle, Grid,\r\n Table,\r\n TableCell,\r\n TableRow,\r\n TextField\r\n} from \"@material-ui/core\";\r\n//import DateTimePicker from \"react-datetime-picker/src/DateTimePicker\";\r\nimport CgSelect from \"../core/CgSelect\";\r\nimport axios from \"axios\";\r\n\r\nexport function SendTemplateDialog(props){\r\n const {goParameters} = props;\r\n const {onDock} = props;\r\n const [open,setOpen] = useState(false);\r\n const [from, setFrom] = useState(null);\r\n const [sendingTemplate, setSendingTemplate] = useState({});\r\n const [onOk, setOnOk] = useState(() => () => alert(\"no onOk set\"));\r\n const show = (onOk) => {setOpen(true); setSendingTemplate({}); setOnOk(() => onOk)};\r\n\r\n useEffect(() => {\r\n onDock(show);\r\n },[]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n return setOpen(false)}\r\n\r\n >\r\n Sending Scripts \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n Name \r\n \r\n {\r\n setSendingTemplate({...sendingTemplate, name:event.target.value})\r\n }} value={sendingTemplate.name}/>\r\n \r\n \r\n \r\n Email \r\n \r\n {\r\n setSendingTemplate({...sendingTemplate, email:event.target.value})\r\n }} value={sendingTemplate.email}/>\r\n \r\n \r\n {\r\n const url = 'api/phish/readTemplateLogForEmail/' + sendingTemplate.email;\r\n axios.get(url).then(response => {\r\n alert(JSON.stringify(response.data));\r\n })\r\n .catch(error => alert(\"error: \" + error.message()));\r\n }}>Check \r\n \r\n \r\n \r\n Email Account \r\n \r\n p.from)}\r\n value={from}\r\n onChange={value => {\r\n setFrom(value);\r\n setSendingTemplate({...sendingTemplate, templates:''});\r\n }} />\r\n \r\n\r\n \r\n \r\n Email Tamplates \r\n \r\n p.from === from) || {}).profiles || []}\r\n value={sendingTemplate.templates}\r\n onChange={value => {\r\n setSendingTemplate({...sendingTemplate, templates:value});\r\n }} />\r\n \r\n\r\n \r\n
\r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n setOpen(false)}>Cancel \r\n {\r\n if(!sendingTemplate){\r\n alert('No Sending Tempalte');\r\n return;\r\n }\r\n if(!sendingTemplate.templates){\r\n alert('No Email Templates Specified');\r\n return;\r\n }\r\n setOpen(false);\r\n onOk(sendingTemplate);\r\n }}>OK \r\n \r\n \r\n}","export const CONSTS = {\r\n EmailSent : \"Email Sent\",\r\n EmailOpened : \"Email Opened\",\r\n ClickedLink : \"Clicked Link\",\r\n SubmittedData : \"Submitted Data\",\r\n EmailReported : \"Email Reported\",\r\n\r\n\r\n CampaignInitialzied : \"Initialized\",\r\n CampaignInProgress : \"In progress\",\r\n CampaignDone : \"Done\",\r\n CampaignError : \"Error\",\r\n}","import * as React from 'react';\r\nimport { styled, alpha } from '@mui/material/styles';\r\nimport Button from '@mui/material/Button';\r\nimport Menu from '@mui/material/Menu';\r\nimport MenuItem from '@mui/material/MenuItem';\r\nimport EditIcon from '@mui/icons-material/Edit';\r\nimport Divider from '@mui/material/Divider';\r\nimport ArchiveIcon from '@mui/icons-material/Archive';\r\nimport FileCopyIcon from '@mui/icons-material/FileCopy';\r\nimport MoreHorizIcon from '@mui/icons-material/MoreHoriz';\r\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\r\nimport {ClearAll} from \"@mui/icons-material\";\r\n\r\nconst StyledMenu = styled((props) => (\r\n \r\n))(({ theme }) => ({\r\n '& .MuiPaper-root': {\r\n borderRadius: 6,\r\n marginTop: theme.spacing(1),\r\n minWidth: 180,\r\n color:\r\n theme.palette.mode === 'light' ? 'rgb(55, 65, 81)' : theme.palette.grey[300],\r\n boxShadow:\r\n 'rgb(255, 255, 255) 0px 0px 0px 0px, rgba(0, 0, 0, 0.05) 0px 0px 0px 1px, rgba(0, 0, 0, 0.1) 0px 10px 15px -3px, rgba(0, 0, 0, 0.05) 0px 4px 6px -2px',\r\n '& .MuiMenu-list': {\r\n padding: '4px 0',\r\n },\r\n '& .MuiMenuItem-root': {\r\n '& .MuiSvgIcon-root': {\r\n fontSize: 18,\r\n color: theme.palette.text.secondary,\r\n marginRight: theme.spacing(1.5),\r\n },\r\n '&:active': {\r\n backgroundColor: alpha(\r\n theme.palette.primary.main,\r\n theme.palette.action.selectedOpacity,\r\n ),\r\n },\r\n },\r\n },\r\n}));\r\n\r\nexport default function DropDownButton(props) {\r\n const {addBatchTargetToCampaign, clearAllTargetFromCampaign} = props;\r\n const [anchorEl, setAnchorEl] = React.useState(null);\r\n const open = Boolean(anchorEl);\r\n const handleClick = (event) => {\r\n setAnchorEl(event.currentTarget);\r\n };\r\n const handleClose = () => {\r\n setAnchorEl(null);\r\n };\r\n\r\n return (\r\n \r\n }\r\n >\r\n Options\r\n \r\n \r\n
\r\n );\r\n}","import React, {useEffect, useState} from \"react\";\r\nimport {\r\n Button,\r\n Dialog,\r\n DialogActions,\r\n DialogContent,\r\n DialogContentText,\r\n DialogTitle, Grid,\r\n Table,\r\n TableCell,\r\n TableRow,\r\n TextField\r\n} from \"@material-ui/core\";\r\n//import DateTimePicker from \"react-datetime-picker/src/DateTimePicker\";\r\nimport CgSelect from \"../core/CgSelect\";\r\nimport axios from \"axios\";\r\nimport dateHelper from \"../core/dateHelper\";\r\n\r\nfunction parseDetailsToGetUserAgent(item){\r\n if(!item){\r\n return '!item';\r\n }\r\n\r\n if(!item.Details){\r\n return '!item.Details';\r\n }\r\n\r\n const str = item.Details.replace('\\u0022','\"');\r\n const json = JSON.parse(str);\r\n\r\n if(!json){\r\n return '!json';\r\n }\r\n if(!json.browser){\r\n return '!json.browser';\r\n }\r\n\r\n return json.browser['user-agent'];\r\n}\r\n\r\nfunction parseDetailsToGetIP(item){\r\n if(!item){\r\n return '!item';\r\n }\r\n\r\n if(!item.Details){\r\n return '!item.Details';\r\n }\r\n\r\n const str = item.Details.replace('\\u0022','\"');\r\n const json = JSON.parse(str);\r\n\r\n if(!json){\r\n return '!json';\r\n }\r\n if(!json.browser){\r\n return '!json.browser';\r\n }\r\n\r\n return json.browser['address'];\r\n}\r\n\r\nexport function TimelineDialog(props){\r\n const {onDock} = props;\r\n const [open,setOpen] = useState(false);\r\n const [timelineItems, setTimelineItems] = useState([]);\r\n const [onOk, setOnOk] = useState(() => () => alert(\"no onOk set\"));\r\n const show = (timelineItems) => {\r\n setOpen(true);\r\n setTimelineItems(timelineItems);\r\n };\r\n\r\n useEffect(() => {\r\n onDock(show);\r\n },[]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n return setOpen(false)}\r\n >\r\n Timeline {(timelineItems || []).length} \r\n \r\n \r\n\r\n \r\n\r\n \r\n \r\n\r\n \r\n Time\r\n \r\n \r\n Event\r\n \r\n \r\n Agent\r\n \r\n \r\n IP\r\n \r\n \r\n {\r\n (timelineItems || []).map(item => \r\n\r\n \r\n {dateHelper.toShortDateTime(item.Time)}\r\n \r\n \r\n {item.Message}\r\n \r\n \r\n {\r\n parseDetailsToGetUserAgent(item)\r\n }\r\n\r\n \r\n \r\n {\r\n parseDetailsToGetIP(item)\r\n }\r\n \r\n )\r\n }\r\n
\r\n\r\n \r\n \r\n setOpen(false)}>OK \r\n \r\n \r\n}","import React, {useEffect, useState} from \"react\";\r\nimport {PhishToolbar} from './PhishToolbar'\r\nimport {TreeView} from \"@material-ui/lab\";\r\nimport {ChevronRight, ExpandMore} from \"@material-ui/icons\";\r\n\r\nimport {ClientView} from \"./ClientView\";\r\nimport axios from \"axios\";\r\nimport {saveAs} from 'file-saver';\r\nimport Groupbox from \"../core/Groupbox\";\r\nimport {\r\n Avatar,\r\n Button,\r\n Chip,\r\n Table,\r\n TableBody,\r\n TableCell,\r\n TableHead,\r\n TableRow,\r\n Toolbar, Tooltip,\r\n Typography\r\n} from \"@material-ui/core\";\r\nimport {MyTargetsView} from \"./MyTargetsView\";\r\nimport {SHOW_AXIOS_ERROR} from \"../core/FUNCS\";\r\nimport {RseDialog} from \"./NewRseDialog\";\r\nimport {CampaignDialog} from \"./CampaignDialog\";\r\nimport {SendTemplateDialog} from './SendTemplateDialog';\r\nimport {ErrorBar, MessageBar} from \"./Bars\";\r\nimport dateHelper from \"../core/dateHelper\";\r\nimport {CONSTS} from './CONSTS'\r\nimport AddIcon from \"@material-ui/icons/Add\";\r\nimport AlertDialog from \"./AlertDialog\";\r\nimport DropDownButton from \"./DropDownButton\";\r\nimport {CheckBox} from \"@mui/icons-material\";\r\nimport {Checkbox} from \"@mui/material\";\r\nimport {TimelineDialog} from \"./TimelineDialog\";\r\n\r\n\r\n//axios.defaults.baseURL = 'https://localhost:5001';\r\n\r\n//axios.defaults.baseURL = 'https://test.castlegarde.com:5003';\r\n\r\nfunction excludeResultsFromMyTargets(myTargets, results){\r\n if(!results){\r\n return myTargets;\r\n }\r\n\r\n if(!myTargets){\r\n return myTargets;\r\n }\r\n\r\n return myTargets.filter(p => !(results.some(pp => pp.email === p.email)));\r\n}\r\n\r\nexport function Phish2(props){\r\n const [isAdmin, setIsAdmin] = useState(false);\r\n const [error, setError] = useState(null);\r\n const [docxClients,setDocxClients] = useState([]);\r\n const [goParameters, setGoParameters] = useState([]);\r\n const [clientFilter,setClientFilter] = useState(null);\r\n const [client,setClient] = useState(null);\r\n const [expanded, setExpanded] = useState([]);\r\n const [myTargets, setMyTargets] = useState([]);\r\n const [loadRses, setLoadRses] = useState(() =>()=> alert('Select a client first'));\r\n const [rse,setRse] = useState(null);\r\n const [loadCampaigns, setLoadCampaigns] = useState(() => ()=> alert('Select a RSE first'));\r\n const [campaign,setCampaign] = useState(null);\r\n const [results, setResults] = useState([]);\r\n\r\n const [showRseDialog, setShowRseDialog] = useState(() => () => alert(\"no show rse dialog docked\"));\r\n const [showCampaignDialog, setShowCampaignDialog] = useState(() => () =>\r\n alert('no show campaign dialog docked'));\r\n const [showSendTemplateDialog, setShowSendTemplateDialog] = useState(() => () =>\r\n alert('no show send template dialog docked'));\r\n const [showAlertDialog, setShowAlertDialog] = useState(() => () =>\r\n alert('no show alert dialog docked'));\r\n const [showTimelineDialog, setShowTimelineDialog] = useState(() => () =>\r\n alert(\"no show timeline dialog docked\"));\r\n\r\n const displayError = error => {\r\n if (error.response) {\r\n setError(error.response.status + ' ' + error.response.data);\r\n } else if(error.message) {\r\n setError(error.message);\r\n } else{\r\n setError(error);\r\n }\r\n }\r\n\r\n const filterClients = (clients,filter) => {\r\n let r = clients;\r\n if(!r ){\r\n return r;\r\n }\r\n if(filter){\r\n r = clients.filter(p => (p.title && p.title.toUpperCase().startsWith(filter.toUpperCase())));\r\n }\r\n //r.sort((a,b) => {\r\n // if(a.title > b.title){\r\n // return 1;\r\n // }\r\n // if(a.title < b.title){\r\n // return -1;\r\n // }\r\n // return 0;\r\n //});\r\n\r\n return r;\r\n };\r\n\r\n const loadCampaign = (campaign) => {\r\n axios.get('api/phish/readCampaign/' + campaign.id)\r\n .then(response => {\r\n setCampaign(response.data);\r\n setResults((response.data || {}).results);\r\n })\r\n .catch(displayError);}\r\n\r\n const loadClients = () => {\r\n const url = 'api/phish/docxClients';\r\n axios.get(url)\r\n .then(response => setDocxClients(response.data))\r\n .catch(displayError)\r\n }\r\n\r\n const loadGoParameters = () => {\r\n axios.get('api/phish/getGoParameters2')\r\n .then(response => {\r\n setGoParameters(response.data);\r\n })\r\n .catch(displayError);\r\n }\r\n\r\n const loadIsAdmin = () => {\r\n axios.get('api/phish/isAdmin')\r\n .then(response => {\r\n setIsAdmin(response.data);\r\n })\r\n .catch(() => setIsAdmin(false));\r\n }\r\n\r\n //useEffect(loadIsAdmin, []);\r\n //useEffect(loadClients,[])\r\n //useEffect(loadGoParameters, []);\r\n\r\n useEffect(() => {\r\n const interval = setInterval(() => {\r\n if(campaign && campaign.id && campaign.status\r\n && campaign.status !== 'Done'){\r\n loadCampaign(campaign);\r\n }\r\n }, 30000);\r\n return () => clearInterval(interval);\r\n }, [campaign]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n //if(!isAdmin){\r\n // return '';\r\n //}\r\n\r\n return \r\n
setError(null)}/>\r\n\r\n {\r\n if(!goParameters || goParameters.length == 0){\r\n showAlertDialog(\"Loading\", \"Still loading data, please wait\",() => {});\r\n }else{\r\n showSendTemplateDialog(sendingTemplate => {\r\n axios.post('api/phish/sendTemplate', sendingTemplate)\r\n .then(response => alert(\"sent templates\"))\r\n .catch(displayError);\r\n });\r\n }\r\n }}\r\n\r\n clientFilter={clientFilter}\r\n onClientFilter={value => setClientFilter(value)}\r\n\r\n isAllowNewRse={client && loadRses}\r\n newRse={() => {\r\n showRseDialog({clientId:client.id, clientTitle:client.title},\r\n rse => {\r\n rse.clientId = client.id;\r\n axios.post('api/phish/newRse',rse)\r\n .then(response => {\r\n loadRses();\r\n })\r\n .catch(displayError);\r\n });\r\n }}\r\n\r\n isAllowDeleteRse={rse}\r\n deleteRse={() => {\r\n \r\n showAlertDialog((rse || {}).title,\r\n `Are you sure to delete this RSE: ${(rse || {}).title} of ${(client || {}).title} `,\r\n () => {\r\n axios.get('api/phish/deleteRse/' + rse.id)\r\n .then(response => {\r\n loadRses();\r\n })\r\n .catch(SHOW_AXIOS_ERROR);\r\n })\r\n }}\r\n\r\n isAllowClearTargets={client}\r\n clearTargets={() => {\r\n showAlertDialog(\"Delete all employees\",\r\n `Are you sure to delete all employees from ${(client || {}).title} `,\r\n () => {\r\n axios.get('api/phish/clearTargets/' + client.id)\r\n .then(response => {\r\n axios.get('api/phish/readTargets/' + client.id)\r\n .then(response => setMyTargets(response.data))\r\n .catch(SHOW_AXIOS_ERROR);\r\n })\r\n .catch(displayError);\r\n })\r\n }}\r\n\r\n isAllowNewCampaign={rse}\r\n newCampaign={() => {\r\n if(!goParameters || goParameters.length == 0){\r\n showAlertDialog(\"Loading\", \"Still loading data, please wait\",() => {});\r\n }else {\r\n showCampaignDialog({clientTitle: client.title, tag2: rse.title},\r\n campaign => {\r\n const url = 'api/phish/newCampaign/' + rse.id;\r\n axios.post(url, campaign)\r\n .then(response => {\r\n loadCampaigns();\r\n })\r\n .catch(displayError);\r\n });\r\n }\r\n }}\r\n isAllowEditCampaign={campaign}\r\n editCampaign={() => {\r\n if(!goParameters || goParameters.length == 0){\r\n showAlertDialog(\"Loading\", \"Still loading data, please wait\",() => {});\r\n }else {\r\n //alert('haha');\r\n //return;\r\n showCampaignDialog(campaign, campaign => {\r\n campaign.status = null;\r\n const url = 'api/phish/updateCampaign';\r\n axios.post(url, campaign)\r\n .then(response => {\r\n loadCampaigns();\r\n })\r\n .catch(displayError);\r\n });\r\n }\r\n }}\r\n isAllowStart={campaign && !campaign.status}\r\n startCampaign={() => {\r\n showAlertDialog(campaign.sendingProfile + ' (' +\r\n dateHelper.toShortDateRange(campaign.start, campaign.end) + ')',\r\n `Are you sure to start this campaign for ${(rse || {}).title} of ${(client || {}).title} `,\r\n () => {\r\n axios.get('api/phish/startCampaign/' + campaign.id)\r\n .then(response => {\r\n setCampaign(response.data);\r\n setResults((response.data || {}).results);\r\n axios.get('api/phish/readTargets/' + client.id)\r\n .then(response => setMyTargets(response.data))\r\n .catch(SHOW_AXIOS_ERROR);\r\n })\r\n .catch(displayError);\r\n })\r\n }}\r\n isAllowStop={campaign && campaign.status === 'In progress'}\r\n stopCampaign={() => {\r\n axios.get('api/phish/completeCampaign/' + campaign.id)\r\n .then(response => {\r\n setCampaign(response.data);\r\n })\r\n .catch(displayError);\r\n }}\r\n isAllowDeleteCampaign={campaign}\r\n deleteCampaign={() => {\r\n showAlertDialog(campaign.sendingProfile + ' (' +\r\n dateHelper.toShortDateRange(campaign.start, campaign.end) + ')',\r\n `Are you sure to delete this campaign for ${(rse || {}).title} of ${(client || {}).title} `,\r\n () => {\r\n axios.get('api/phish/deleteCampaign/' + campaign.id)\r\n .then(response => {\r\n loadCampaigns();\r\n })\r\n .catch(SHOW_AXIOS_ERROR);\r\n })\r\n }}\r\n isAllowReport={rse}\r\n reportCampaign={() => {\r\n //const url = 'https://localhost:5001/api/phish/reportCampaign/' + rse.id;\r\n const url = 'api/phish/reportCampaign/' + rse.id;\r\n saveAs(url);\r\n }}\r\n />\r\n \r\n
\r\n }\r\n defaultExpandIcon={ }\r\n sx={{ height: 240, flexGrow: 1, maxWidth: 400, overflowY: 'auto' }}\r\n >\r\n {\r\n filterClients(docxClients,clientFilter).map(docxClient =>\r\n {\r\n setLoadRses(()=> loadMyChildren);\r\n setClient(client);\r\n setExpanded([client.id]);\r\n setRse(null);\r\n setCampaign(null);\r\n setResults([]);\r\n axios.get('api/phish/readTargets/' + client.id)\r\n .then(response => setMyTargets(response.data))\r\n .catch(SHOW_AXIOS_ERROR);\r\n }}\r\n onRseSelected={(rse,loadMyChildren) => {\r\n setRse(rse);\r\n setExpanded([rse.clientId,rse.id]);\r\n setCampaign(null);\r\n setLoadCampaigns(() =>loadMyChildren);\r\n setResults([]);\r\n }}\r\n onCampaignSelected={loadCampaign}\r\n />\r\n )\r\n }\r\n \r\n
\r\n
\r\n
\r\n \r\n {\r\n const url = 'api/phish/importTargets/' + client.id;\r\n let data = new FormData();\r\n data.append('file', file, file.name);\r\n axios.post(url,\r\n data,\r\n {\r\n headers: {\r\n 'accept': 'application/json',\r\n 'Accept-Language': 'en-US,en;q=0.8',\r\n 'Content-Type': `multipart/form-data; boundary=${data._boundary}`,\r\n }\r\n }\r\n ).then(response => {\r\n setMyTargets(response.data);\r\n }).catch(displayError);\r\n }}\r\n\r\n onDoubleClick={id => {\r\n if(campaign && campaign.id){\r\n const url = 'api/phish/AddTargetToCampaign/' + id + '/' + campaign.id;\r\n //alert(url);\r\n axios.get(url)\r\n .then(response => {\r\n axios.get('api/phish/readResults/' + campaign.id)\r\n .then(reponse => setResults(response.data.results))\r\n .catch(SHOW_AXIOS_ERROR);\r\n })\r\n .catch(SHOW_AXIOS_ERROR);\r\n }\r\n }}\r\n items={excludeResultsFromMyTargets(myTargets, results)}/>\r\n
\r\n \r\n
\r\n {(myTargets || []).length} \r\n\r\n {\r\n if(campaign && campaign.id){\r\n const url = 'api/phish/addBatchTargetToCampaign/' + client.id + '/' + campaign.id + '/' + number;\r\n axios.get(url)\r\n .then(response => {\r\n axios.get('api/phish/readResults/' + campaign.id)\r\n .then(reponse => setResults(response.data.results))\r\n .catch(SHOW_AXIOS_ERROR);\r\n })\r\n .catch(SHOW_AXIOS_ERROR);\r\n }\r\n }} clearAllTargetFromCampaign={() => {\r\n if(campaign && campaign.id){\r\n const url = 'api/phish/clearAllTargetFromCampaign/' + campaign.id;\r\n axios.get(url)\r\n .then(response => {\r\n axios.get('api/phish/readResults/' + campaign.id)\r\n .then(reponse => setResults(response.data.results))\r\n .catch(SHOW_AXIOS_ERROR);\r\n })\r\n .catch(SHOW_AXIOS_ERROR);\r\n }\r\n }}\r\n />\r\n {(results || []).length} \r\n Status:{(campaign || {}).status} \r\n Start:{dateHelper.toShortDateTime((campaign || {}).start)} \r\n Sent:{(campaign || {}).emailsSent} \r\n Opened:{(campaign || {}).emailsOpened}\r\n \r\n Clicked:{(campaign || {}).emailsClicked}\r\n \r\n \r\n
\r\n \r\n
\r\n\r\n \r\n \r\n Full Name \r\n Email \r\n Status \r\n False Positive \r\n Sent \r\n Opened \r\n Clicked \r\n IP \r\n \r\n\r\n \r\n \r\n {\r\n results.map(result => {\r\n if(campaign && campaign.id){\r\n const url = 'api/phish/removeTargetFromCampaign/' + result.id + '/' + campaign.id;\r\n //alert(url);\r\n axios.get(url)\r\n .then(response => {\r\n axios.get('api/phish/readResults/' + campaign.id)\r\n .then(reponse => setResults(response.data.results))\r\n .catch(SHOW_AXIOS_ERROR);\r\n })\r\n .catch(SHOW_AXIOS_ERROR);\r\n }\r\n }}>\r\n {result.name} \r\n {result.email} \r\n {\r\n /*\r\n {\r\n result.status === CONSTS.EmailSent?\r\n :\r\n result.status === CONSTS.EmailOpened?\r\n :\r\n result.status === CONSTS.ClickedLink?\r\n :\r\n result.status === CONSTS.SubmittedData?\r\n :\r\n !result.status?\r\n '':\r\n \r\n\r\n } \r\n */\r\n }\r\n\r\n \r\n {\r\n const timelineItems = JSON.parse(result.tag3)\r\n showTimelineDialog(timelineItems);\r\n }}>\r\n \r\n \r\n\r\n \r\n \r\n \r\n {\r\n if(e.target.checked){\r\n result.tag2 = \"true\";\r\n }else{\r\n result.tag2 = null;\r\n }\r\n const url = 'api/phish/ChangeFalsePositiveForResult/' + campaign.id;\r\n //alert(url);\r\n axios.post(url, result)\r\n .then(response => {\r\n setResults(response.data.results)\r\n }).catch(SHOW_AXIOS_ERROR);\r\n }}/>\r\n \r\n \r\n {result.emailSentDate2} \r\n {result.emailOpenedDate2} \r\n {result.clickedLinkDate2} \r\n {result.ip} \r\n )\r\n }\r\n \r\n
\r\n
\r\n\r\n \r\n
\r\n\r\n
setShowRseDialog(() => show)}/>\r\n setShowCampaignDialog(() => show)}\r\n goParameters = {goParameters}\r\n />\r\n setShowSendTemplateDialog(() => show)}\r\n />\r\n setShowAlertDialog(() => show)}/>\r\n setShowTimelineDialog(() => show)}/>\r\n \r\n 0 && goParameters && goParameters.length > 0)?'Done with loading data':'Loading data, please wait...'}/>\r\n \r\n}","import React from \"react\";\nimport { DndProvider } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\nimport './App.css';\nimport { Route } from 'react-router';\nimport { Container } from '@material-ui/core';\n//import { Counter } from './components/Counter';\n//import { Docx2 } from './components/docx2/Docx2';\n//import { RoleAndUser } from './components/role_and_user/RoleAndUser';\nimport { RequestInformation } from './components/request_information/RequestInformation';\nimport { EvaWaiver } from './components/eva_waiver/EvaWaiver';\nimport { Waivers } from \"./components/eva_waiver/Waivers\";\nimport {Phish2} from './components/phish2/Phish2';\nfunction App() {\n return (\n \n \n \n {\n /*\n \n \n \n \n \n */\n }\n \n \n \n \n \n \n \n
\n );\n}\n\nexport default App;\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { BrowserRouter } from 'react-router-dom';\nimport './index.css';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nReactDOM.render(\n \n \n \n \n ,\n document.getElementById('root')\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}