You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
4.9 KiB
132 lines
4.9 KiB
using System; |
|
using System.Configuration; |
|
using System.Net; |
|
using System.Net.Http; |
|
using System.Net.Mail; |
|
using System.Text; |
|
using System.Threading.Tasks; |
|
using Microsoft.Azure.WebJobs; |
|
using Microsoft.Azure.WebJobs.Extensions.Http; |
|
using Microsoft.Azure.WebJobs.Host; |
|
|
|
namespace Bit.Function |
|
{ |
|
public static class NewHelpdeskTicket |
|
{ |
|
[FunctionName("NewHelpdeskTicket")] |
|
public static HttpResponseMessage Run( |
|
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "api/newhelpdeskticket")]HttpRequestMessage req, |
|
TraceWriter log) |
|
{ |
|
//ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | |
|
// SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; |
|
|
|
var data = req.Content.ReadAsFormDataAsync().Result; |
|
if(data == null) |
|
{ |
|
return req.CreateResponse(HttpStatusCode.BadRequest, "No data provided."); |
|
} |
|
|
|
if(string.IsNullOrWhiteSpace(data["name"])) |
|
{ |
|
return req.CreateResponse(HttpStatusCode.BadRequest, "Name is required."); |
|
} |
|
|
|
if(data["name"].Length > 50) |
|
{ |
|
return req.CreateResponse(HttpStatusCode.BadRequest, "Name must be less than 50 characters."); |
|
} |
|
|
|
if(string.IsNullOrWhiteSpace(data["email"])) |
|
{ |
|
return req.CreateResponse(HttpStatusCode.BadRequest, "Email is required."); |
|
} |
|
|
|
if(data["email"].Length > 50) |
|
{ |
|
return req.CreateResponse(HttpStatusCode.BadRequest, "Email must be less than 50 characters."); |
|
} |
|
|
|
if(!data["email"].Contains("@") || !data["email"].Contains(".")) |
|
{ |
|
return req.CreateResponse(HttpStatusCode.BadRequest, "Email is not valid."); |
|
} |
|
|
|
if(string.IsNullOrWhiteSpace(data["message"])) |
|
{ |
|
return req.CreateResponse(HttpStatusCode.BadRequest, "Message is required."); |
|
} |
|
|
|
//if(!await SubmitApiAsync(data["name"], data["email"], data["message"], log)) |
|
//{ |
|
// return req.CreateResponse(HttpStatusCode.BadRequest, "Ticket failed to create."); |
|
//} |
|
|
|
SubmitEmail(data["name"], data["email"], data["message"], log); |
|
|
|
return req.CreateResponse(HttpStatusCode.OK, "Ticket created."); |
|
} |
|
|
|
private async static Task<bool> SubmitApiAsync(string name, string email, string message, TraceWriter log) |
|
{ |
|
using(var client = new HttpClient()) |
|
{ |
|
client.BaseAddress = new Uri("https://bitwarden.freshdesk.com/api/v2"); |
|
client.DefaultRequestHeaders.Accept.Clear(); |
|
client.DefaultRequestHeaders.Add("Authorization", MakeFreshdeskApiAuthHeader(log)); |
|
|
|
var response = await client.PostAsJsonAsync("tickets", |
|
new |
|
{ |
|
name = name, |
|
email = email, |
|
status = 2, |
|
priority = 2, |
|
source = 1, |
|
subject = "Bitwarden.com Website Contact", |
|
description = FormatMessage(message) |
|
}); |
|
|
|
return response.IsSuccessStatusCode; |
|
} |
|
} |
|
|
|
private static void SubmitEmail(string name, string email, string message, TraceWriter log) |
|
{ |
|
var sendgridApiKey = ConfigurationManager.AppSettings["SendgridApiKey"]; |
|
var client = new SmtpClient("smtp.sendgrid.net", /*465*/ 587) |
|
{ |
|
//EnableSsl = true, |
|
Credentials = new NetworkCredential("apikey", sendgridApiKey) |
|
}; |
|
|
|
var fromAddress = new MailAddress(email, name, Encoding.UTF8); |
|
var mailMessage = new MailMessage(fromAddress, new MailAddress("bitwardencomsupport@bitwarden.freshdesk.com")) |
|
{ |
|
Subject = "Bitwarden.com Website Contact", |
|
Body = FormatMessage(message), |
|
IsBodyHtml = true |
|
}; |
|
|
|
client.SendCompleted += (s, e) => |
|
{ |
|
client.Dispose(); |
|
mailMessage.Dispose(); |
|
}; |
|
client.SendAsync(mailMessage, null); |
|
} |
|
|
|
private static string FormatMessage(string message) |
|
{ |
|
return message.Replace("\r\n", "\n").Replace("\r", "\n").Replace("\n", "<br>"); |
|
} |
|
|
|
private static string MakeFreshdeskApiAuthHeader(TraceWriter log) |
|
{ |
|
var freshdeskApiKey = ConfigurationManager.AppSettings["FreshdeskApiKey"]; |
|
var b64Creds = Convert.ToBase64String( |
|
Encoding.GetEncoding("ISO-8859-1").GetBytes(freshdeskApiKey + ":X")); |
|
return b64Creds; |
|
} |
|
} |
|
}
|
|
|