|
|
1.1 root 1: /* Synchronet Control Panel (GUI Borland C++ Builder Project for Win32) */
2:
1.1.1.2 ! root 3: /* $Id: MailCfgDlgUnit.cpp,v 1.18 2004/08/11 10:28:30 rswindell Exp $ */
1.1 root 4:
5: /****************************************************************************
6: * @format.tab-size 4 (Plain Text/Source Code File Header) *
7: * @format.use-tabs true (see http://www.synchro.net/ptsc_hdr.html) *
8: * *
1.1.1.2 ! root 9: * Copyright 2004 Rob Swindell - http://www.synchro.net/copyright.html *
1.1 root 10: * *
11: * This program is free software; you can redistribute it and/or *
12: * modify it under the terms of the GNU General Public License *
13: * as published by the Free Software Foundation; either version 2 *
14: * of the License, or (at your option) any later version. *
15: * See the GNU General Public License for more details: gpl.txt or *
16: * http://www.fsf.org/copyleft/gpl.html *
17: * *
18: * Anonymous FTP access to the most recent released source is available at *
19: * ftp://vert.synchro.net, ftp://cvs.synchro.net and ftp://ftp.synchro.net *
20: * *
21: * Anonymous CVS access to the development source and modification history *
22: * is available at cvs.synchro.net:/cvsroot/sbbs, example: *
23: * cvs -d :pserver:[email protected]:/cvsroot/sbbs login *
24: * (just hit return, no password is necessary) *
25: * cvs -d :pserver:[email protected]:/cvsroot/sbbs checkout src *
26: * *
27: * For Synchronet coding style and modification guidelines, see *
28: * http://www.synchro.net/source.html *
29: * *
30: * You are encouraged to submit any modifications (preferably in Unix diff *
31: * format) via e-mail to [email protected] *
32: * *
33: * Note: If this box doesn't appear square, then you need to fix your tabs. *
34: ****************************************************************************/
35:
36: //---------------------------------------------------------------------
37: #include <vcl.h>
38: #pragma hdrstop
39:
40: #include "MainFormUnit.h"
41: #include "MailCfgDlgUnit.h"
1.1.1.2 ! root 42: #include "TextFileEditUnit.h"
1.1 root 43: #include <stdio.h> // sprintf()
44: #include <mmsystem.h> // sndPlaySound()
45: //---------------------------------------------------------------------
46: #pragma resource "*.dfm"
47: TMailCfgDlg *MailCfgDlg;
48: //---------------------------------------------------------------------
49: __fastcall TMailCfgDlg::TMailCfgDlg(TComponent* AOwner)
50: : TForm(AOwner)
51: {
52: }
53: //---------------------------------------------------------------------
54: void __fastcall TMailCfgDlg::InboundSoundButtonClick(TObject *Sender)
55: {
56: OpenDialog->FileName=InboundSoundEdit->Text;
57: if(OpenDialog->Execute()==true) {
58: InboundSoundEdit->Text=OpenDialog->FileName;
59: sndPlaySound(OpenDialog->FileName.c_str(),SND_ASYNC);
60: }
61: }
62: //---------------------------------------------------------------------------
63:
64: void __fastcall TMailCfgDlg::OutboundSoundButtonClick(TObject *Sender)
65: {
66: OpenDialog->FileName=OutboundSoundEdit->Text;
67: if(OpenDialog->Execute()==true) {
68: OutboundSoundEdit->Text=OpenDialog->FileName;
69: sndPlaySound(OpenDialog->FileName.c_str(),SND_ASYNC);
70: }
71: }
72: //---------------------------------------------------------------------------
73:
74: void __fastcall TMailCfgDlg::FormShow(TObject *Sender)
75: {
76: char str[128];
77:
78: if(MainForm->mail_startup.interface_addr==0)
79: NetworkInterfaceEdit->Text="<ANY>";
80: else {
81: sprintf(str,"%d.%d.%d.%d"
82: ,(MainForm->mail_startup.interface_addr>>24)&0xff
83: ,(MainForm->mail_startup.interface_addr>>16)&0xff
84: ,(MainForm->mail_startup.interface_addr>>8)&0xff
85: ,MainForm->mail_startup.interface_addr&0xff
86: );
87: NetworkInterfaceEdit->Text=AnsiString(str);
88: }
89: MaxClientsEdit->Text=AnsiString(MainForm->mail_startup.max_clients);
90: MaxInactivityEdit->Text=AnsiString(MainForm->mail_startup.max_inactivity);
1.1.1.2 ! root 91: MaxRecipientsEdit->Text=AnsiString(MainForm->mail_startup.max_recipients);
! 92: MaxMsgSizeEdit->Text=AnsiString(MainForm->mail_startup.max_msg_size);
! 93: LinesPerYieldEdit->Text=AnsiString(MainForm->mail_startup.lines_per_yield);
1.1 root 94:
95: AutoStartCheckBox->Checked=MainForm->MailAutoStart;
96: LogFileCheckBox->Checked=MainForm->MailLogFile;
97: HostnameCheckBox->Checked
98: =!(MainForm->mail_startup.options&MAIL_OPT_NO_HOST_LOOKUP);
99:
100: RelayServerEdit->Text=AnsiString(MainForm->mail_startup.relay_server);
1.1.1.2 ! root 101: RelayAuthNameEdit->Text=AnsiString(MainForm->mail_startup.relay_user);
! 102: RelayAuthPassEdit->Text=AnsiString(MainForm->mail_startup.relay_pass);
1.1 root 103: SMTPPortEdit->Text=AnsiString(MainForm->mail_startup.smtp_port);
104: POP3PortEdit->Text=AnsiString(MainForm->mail_startup.pop3_port);
105: RelayPortEdit->Text=AnsiString(MainForm->mail_startup.relay_port);
106: DNSServerEdit->Text=AnsiString(MainForm->mail_startup.dns_server);
107: InboundSoundEdit->Text=AnsiString(MainForm->mail_startup.inbound_sound);
108: OutboundSoundEdit->Text=AnsiString(MainForm->mail_startup.outbound_sound);
1.1.1.2 ! root 109: POP3SoundEdit->Text=AnsiString(MainForm->mail_startup.pop3_sound);
1.1 root 110: DeliveryAttemptsEdit->Text
111: =AnsiString(MainForm->mail_startup.max_delivery_attempts);
112: RescanFreqEdit->Text=AnsiString(MainForm->mail_startup.rescan_frequency);
1.1.1.2 ! root 113: DefaultUserEdit->Text=AnsiString(MainForm->mail_startup.default_user);
! 114: BLSubjectEdit->Text=AnsiString(MainForm->mail_startup.dnsbl_tag);
! 115: BLHeaderEdit->Text=AnsiString(MainForm->mail_startup.dnsbl_hdr);
1.1 root 116:
117: DebugTXCheckBox->Checked=MainForm->mail_startup.options
118: &MAIL_OPT_DEBUG_TX;
1.1.1.2 ! root 119: DebugRXCheckBox->Checked=MainForm->mail_startup.options
! 120: &MAIL_OPT_DEBUG_RX_RSP;
1.1 root 121: DebugHeadersCheckBox->Checked=MainForm->mail_startup.options
122: &MAIL_OPT_DEBUG_RX_HEADER;
1.1.1.2 ! root 123: NotifyCheckBox->Checked
! 124: =!(MainForm->mail_startup.options&MAIL_OPT_NO_NOTIFY);
1.1 root 125: POP3EnabledCheckBox->Checked=MainForm->mail_startup.options
126: &MAIL_OPT_ALLOW_POP3;
127: POP3LogCheckBox->Checked=MainForm->mail_startup.options
128: &MAIL_OPT_DEBUG_POP3;
129: RelayRadioButton->Checked=MainForm->mail_startup.options
130: &MAIL_OPT_RELAY_TX;
1.1.1.2 ! root 131: RelayAuthPlainRadioButton->Checked=MainForm->mail_startup.options
! 132: &MAIL_OPT_RELAY_AUTH_PLAIN;
! 133: RelayAuthLoginRadioButton->Checked=MainForm->mail_startup.options
! 134: &MAIL_OPT_RELAY_AUTH_LOGIN;
! 135: RelayAuthCramMD5RadioButton->Checked=MainForm->mail_startup.options
! 136: &MAIL_OPT_RELAY_AUTH_CRAM_MD5;
! 137:
! 138: #if 0 /* this is a stupid option */
1.1 root 139: UserNumberCheckBox->Checked=MainForm->mail_startup.options
140: &MAIL_OPT_ALLOW_RX_BY_NUMBER;
1.1.1.2 ! root 141: #endif
! 142: AllowRelayCheckBox->Checked=MainForm->mail_startup.options
! 143: &MAIL_OPT_ALLOW_RELAY;
! 144: AuthViaIpCheckBox->Checked=MainForm->mail_startup.options
! 145: &MAIL_OPT_SMTP_AUTH_VIA_IP;
! 146: if(MainForm->mail_startup.options&MAIL_OPT_DNSBL_REFUSE)
! 147: BLRefuseRadioButton->Checked=true;
! 148: else if(MainForm->mail_startup.options&MAIL_OPT_DNSBL_BADUSER)
! 149: BLBadUserRadioButton->Checked=true;
! 150: else if(MainForm->mail_startup.options&MAIL_OPT_DNSBL_IGNORE)
! 151: BLIgnoreRadioButton->Checked=true;
! 152: else
! 153: BLTagRadioButton->Checked=true;
! 154: BLDebugCheckBox->Checked=MainForm->mail_startup.options
! 155: &MAIL_OPT_DNSBL_DEBUG;
! 156:
1.1 root 157: TcpDnsCheckBox->Checked=MainForm->mail_startup.options
158: &MAIL_OPT_USE_TCP_DNS;
159: SendMailCheckBox->Checked=
160: !(MainForm->mail_startup.options&MAIL_OPT_NO_SENDMAIL);
161:
1.1.1.2 ! root 162: DNSBLRadioButtonClick(Sender);
1.1 root 163: DNSRadioButtonClick(Sender);
164: POP3EnabledCheckBoxClick(Sender);
165: SendMailCheckBoxClick(Sender);
1.1.1.2 ! root 166: AllowRelayCheckBoxClick(Sender);
! 167: RelayAuthRadioButtonClick(Sender);
1.1 root 168: PageControl->ActivePage=GeneralTabSheet;
169: }
170: //---------------------------------------------------------------------------
171:
172: void __fastcall TMailCfgDlg::OKBtnClick(TObject *Sender)
173: {
174: char str[128],*p;
175: DWORD addr;
176:
1.1.1.2 ! root 177: SAFECOPY(str,NetworkInterfaceEdit->Text.c_str());
1.1 root 178: p=str;
179: while(*p && *p<=' ') p++;
180: if(*p && isdigit(*p)) {
181: addr=atoi(p)<<24;
182: while(*p && *p!='.') p++;
183: if(*p=='.') p++;
184: addr|=atoi(p)<<16;
185: while(*p && *p!='.') p++;
186: if(*p=='.') p++;
187: addr|=atoi(p)<<8;
188: while(*p && *p!='.') p++;
189: if(*p=='.') p++;
190: addr|=atoi(p);
191: MainForm->mail_startup.interface_addr=addr;
192: } else
193: MainForm->mail_startup.interface_addr=0;
194:
195: MainForm->mail_startup.smtp_port=SMTPPortEdit->Text.ToIntDef(25);
196: MainForm->mail_startup.pop3_port=POP3PortEdit->Text.ToIntDef(110);
197: MainForm->mail_startup.relay_port=RelayPortEdit->Text.ToIntDef(25);
198: MainForm->mail_startup.max_clients=MaxClientsEdit->Text.ToIntDef(10);
199: MainForm->mail_startup.max_inactivity=MaxInactivityEdit->Text.ToIntDef(120);
1.1.1.2 ! root 200: MainForm->mail_startup.max_recipients=MaxRecipientsEdit->Text.ToIntDef(100);
! 201: MainForm->mail_startup.max_msg_size
! 202: =MaxMsgSizeEdit->Text.ToIntDef(MainForm->mail_startup.max_msg_size);
1.1 root 203: MainForm->mail_startup.max_delivery_attempts
204: =DeliveryAttemptsEdit->Text.ToIntDef(10);
205: MainForm->mail_startup.rescan_frequency=RescanFreqEdit->Text.ToIntDef(300);
1.1.1.2 ! root 206: MainForm->mail_startup.lines_per_yield=LinesPerYieldEdit->Text.ToIntDef(10);
1.1 root 207:
1.1.1.2 ! root 208: SAFECOPY(MainForm->mail_startup.default_user
! 209: ,DefaultUserEdit->Text.c_str());
! 210: SAFECOPY(MainForm->mail_startup.dns_server
1.1 root 211: ,DNSServerEdit->Text.c_str());
1.1.1.2 ! root 212: SAFECOPY(MainForm->mail_startup.relay_server
1.1 root 213: ,RelayServerEdit->Text.c_str());
1.1.1.2 ! root 214: SAFECOPY(MainForm->mail_startup.relay_user
! 215: ,RelayAuthNameEdit->Text.c_str());
! 216: SAFECOPY(MainForm->mail_startup.relay_pass
! 217: ,RelayAuthPassEdit->Text.c_str());
! 218: SAFECOPY(MainForm->mail_startup.inbound_sound
1.1 root 219: ,InboundSoundEdit->Text.c_str());
1.1.1.2 ! root 220: SAFECOPY(MainForm->mail_startup.outbound_sound
1.1 root 221: ,OutboundSoundEdit->Text.c_str());
1.1.1.2 ! root 222: SAFECOPY(MainForm->mail_startup.pop3_sound
1.1 root 223: ,POP3SoundEdit->Text.c_str());
1.1.1.2 ! root 224: SAFECOPY(MainForm->mail_startup.dnsbl_tag
! 225: ,BLSubjectEdit->Text.c_str());
! 226: SAFECOPY(MainForm->mail_startup.dnsbl_hdr
! 227: ,BLHeaderEdit->Text.c_str());
1.1 root 228:
229: if(RelayRadioButton->Checked==true)
230: MainForm->mail_startup.options|=MAIL_OPT_RELAY_TX;
231: else
232: MainForm->mail_startup.options&=~MAIL_OPT_RELAY_TX;
1.1.1.2 ! root 233: MainForm->mail_startup.options&=~(MAIL_OPT_RELAY_AUTH_MASK);
! 234: if(RelayAuthLoginRadioButton->Checked==true)
! 235: MainForm->mail_startup.options|=MAIL_OPT_RELAY_AUTH_LOGIN;
! 236: else if(RelayAuthPlainRadioButton->Checked==true)
! 237: MainForm->mail_startup.options|=MAIL_OPT_RELAY_AUTH_PLAIN;
! 238: else if(RelayAuthCramMD5RadioButton->Checked==true)
! 239: MainForm->mail_startup.options|=MAIL_OPT_RELAY_AUTH_CRAM_MD5;
1.1 root 240: if(DebugTXCheckBox->Checked==true)
241: MainForm->mail_startup.options|=MAIL_OPT_DEBUG_TX;
242: else
243: MainForm->mail_startup.options&=~MAIL_OPT_DEBUG_TX;
1.1.1.2 ! root 244: if(DebugRXCheckBox->Checked==true)
! 245: MainForm->mail_startup.options|=MAIL_OPT_DEBUG_RX_RSP;
! 246: else
! 247: MainForm->mail_startup.options&=~MAIL_OPT_DEBUG_RX_RSP;
! 248: if(NotifyCheckBox->Checked==false)
! 249: MainForm->mail_startup.options|=MAIL_OPT_NO_NOTIFY;
! 250: else
! 251: MainForm->mail_startup.options&=~MAIL_OPT_NO_NOTIFY;
1.1 root 252: if(DebugHeadersCheckBox->Checked==true)
253: MainForm->mail_startup.options|=MAIL_OPT_DEBUG_RX_HEADER;
254: else
255: MainForm->mail_startup.options&=~MAIL_OPT_DEBUG_RX_HEADER;
256: if(POP3EnabledCheckBox->Checked==true)
257: MainForm->mail_startup.options|=MAIL_OPT_ALLOW_POP3;
258: else
259: MainForm->mail_startup.options&=~MAIL_OPT_ALLOW_POP3;
260: if(POP3LogCheckBox->Checked==true)
261: MainForm->mail_startup.options|=MAIL_OPT_DEBUG_POP3;
262: else
263: MainForm->mail_startup.options&=~MAIL_OPT_DEBUG_POP3;
1.1.1.2 ! root 264: #if 0 /* this is a stupid option */
1.1 root 265: if(UserNumberCheckBox->Checked==true)
266: MainForm->mail_startup.options|=MAIL_OPT_ALLOW_RX_BY_NUMBER;
267: else
268: MainForm->mail_startup.options&=~MAIL_OPT_ALLOW_RX_BY_NUMBER;
1.1.1.2 ! root 269: #endif
! 270: if(AllowRelayCheckBox->Checked==true)
! 271: MainForm->mail_startup.options|=MAIL_OPT_ALLOW_RELAY;
! 272: else
! 273: MainForm->mail_startup.options&=~MAIL_OPT_ALLOW_RELAY;
! 274: if(AuthViaIpCheckBox->Checked==true)
! 275: MainForm->mail_startup.options|=MAIL_OPT_SMTP_AUTH_VIA_IP;
! 276: else
! 277: MainForm->mail_startup.options&=~MAIL_OPT_SMTP_AUTH_VIA_IP;
! 278:
! 279: /* DNSBL */
! 280: MainForm->mail_startup.options&=
! 281: ~(MAIL_OPT_DNSBL_IGNORE|MAIL_OPT_DNSBL_REFUSE|MAIL_OPT_DNSBL_BADUSER);
! 282: if(BLIgnoreRadioButton->Checked==true)
! 283: MainForm->mail_startup.options|=MAIL_OPT_DNSBL_IGNORE;
! 284: else if(BLRefuseRadioButton->Checked==true)
! 285: MainForm->mail_startup.options|=MAIL_OPT_DNSBL_REFUSE;
! 286: else if(BLBadUserRadioButton->Checked==true)
! 287: MainForm->mail_startup.options|=MAIL_OPT_DNSBL_BADUSER;
! 288: if(BLDebugCheckBox->Checked==true)
! 289: MainForm->mail_startup.options|=MAIL_OPT_DNSBL_DEBUG;
1.1 root 290: else
1.1.1.2 ! root 291: MainForm->mail_startup.options&=~MAIL_OPT_DNSBL_DEBUG;
! 292:
1.1 root 293: if(HostnameCheckBox->Checked==false)
294: MainForm->mail_startup.options|=MAIL_OPT_NO_HOST_LOOKUP;
295: else
296: MainForm->mail_startup.options&=~MAIL_OPT_NO_HOST_LOOKUP;
297: if(TcpDnsCheckBox->Checked==true)
298: MainForm->mail_startup.options|=MAIL_OPT_USE_TCP_DNS;
299: else
300: MainForm->mail_startup.options&=~MAIL_OPT_USE_TCP_DNS;
301: if(SendMailCheckBox->Checked==false)
302: MainForm->mail_startup.options|=MAIL_OPT_NO_SENDMAIL;
303: else
304: MainForm->mail_startup.options&=~MAIL_OPT_NO_SENDMAIL;
305:
306: MainForm->MailAutoStart=AutoStartCheckBox->Checked;
307: MainForm->MailLogFile=LogFileCheckBox->Checked;
308:
309: MainForm->SaveSettings(Sender);
310: }
311: //---------------------------------------------------------------------------
312:
313:
314: void __fastcall TMailCfgDlg::POP3SoundButtonClick(TObject *Sender)
315: {
316: OpenDialog->FileName=POP3SoundEdit->Text;
317: if(OpenDialog->Execute()==true) {
318: POP3SoundEdit->Text=OpenDialog->FileName;
319: sndPlaySound(OpenDialog->FileName.c_str(),SND_ASYNC);
320: }
321: }
322: //---------------------------------------------------------------------------
323:
324: void __fastcall TMailCfgDlg::DNSRadioButtonClick(TObject *Sender)
325: {
1.1.1.2 ! root 326: bool checked = RelayRadioButton->Checked && SendMailCheckBox->Checked;
! 327: RelayTabSheet->TabVisible=checked;
! 328: RelayPortEdit->Enabled=checked;
! 329: RelayPortLabel->Enabled=checked;
! 330: DNSServerEdit->Enabled=!checked;
! 331: DNSServerLabel->Enabled=!checked;
! 332: TcpDnsCheckBox->Enabled=!checked;
1.1 root 333: }
334: //---------------------------------------------------------------------------
335:
336: void __fastcall TMailCfgDlg::POP3EnabledCheckBoxClick(TObject *Sender)
337: {
338: POP3PortEdit->Enabled=POP3EnabledCheckBox->Checked;
339: POP3PortLabel->Enabled=POP3EnabledCheckBox->Checked;
340: POP3SoundEdit->Enabled=POP3EnabledCheckBox->Checked;
341: POP3SoundLabel->Enabled=POP3EnabledCheckBox->Checked;
342: POP3SoundButton->Enabled=POP3EnabledCheckBox->Checked;
343: POP3LogCheckBox->Enabled=POP3EnabledCheckBox->Checked;
344: }
345: //---------------------------------------------------------------------------
346:
347:
348: void __fastcall TMailCfgDlg::SendMailCheckBoxClick(TObject *Sender)
349: {
350: bool checked=SendMailCheckBox->Checked;
351:
352: DeliveryAttemptsEdit->Enabled=checked;
353: DeliveryAttemptsLabel->Enabled=checked;
354: RescanFreqEdit->Enabled=checked;
355: RescanFreqLabel->Enabled=checked;
356: DNSRadioButton->Enabled=checked;
357: DNSServerEdit->Enabled=checked;
358: TcpDnsCheckBox->Enabled=checked;
359: RelayRadioButton->Enabled=checked;
360: OutboundSoundEdit->Enabled=checked;
361: OutboundSoundLabel->Enabled=checked;
362: OutboundSoundButton->Enabled=checked;
363:
1.1.1.2 ! root 364: DNSRadioButtonClick(Sender);
! 365: }
! 366: //---------------------------------------------------------------------------
! 367:
! 368:
! 369: void __fastcall TMailCfgDlg::DNSBLRadioButtonClick(TObject *Sender)
! 370: {
! 371: BLSubjectEdit->Enabled=BLTagRadioButton->Checked;
! 372: BLHeaderEdit->Enabled=BLTagRadioButton->Checked;
! 373: BLSubjectLabel->Enabled=BLTagRadioButton->Checked;
! 374: BLHeaderLabel->Enabled=BLTagRadioButton->Checked;
! 375: }
! 376: //---------------------------------------------------------------------------
! 377:
! 378: void __fastcall TMailCfgDlg::DNSBLServersButtonClick(TObject *Sender)
! 379: {
! 380: char filename[MAX_PATH+1];
! 381:
! 382: sprintf(filename,"%sdns_blacklist.cfg",MainForm->cfg.ctrl_dir);
! 383: Application->CreateForm(__classid(TTextFileEditForm), &TextFileEditForm);
! 384: TextFileEditForm->Filename=AnsiString(filename);
! 385: TextFileEditForm->Caption="Services Configuration";
! 386: TextFileEditForm->ShowModal();
! 387: delete TextFileEditForm;
! 388: }
! 389: //---------------------------------------------------------------------------
! 390:
! 391:
! 392: void __fastcall TMailCfgDlg::DNSBLExemptionsButtonClick(TObject *Sender)
! 393: {
! 394: char filename[MAX_PATH+1];
! 395:
! 396: sprintf(filename,"%sdnsbl_exempt.cfg",MainForm->cfg.ctrl_dir);
! 397: Application->CreateForm(__classid(TTextFileEditForm), &TextFileEditForm);
! 398: TextFileEditForm->Filename=AnsiString(filename);
! 399: TextFileEditForm->Caption="Services Configuration";
! 400: TextFileEditForm->ShowModal();
! 401: delete TextFileEditForm;
! 402: }
! 403: //---------------------------------------------------------------------------
! 404:
! 405: void __fastcall TMailCfgDlg::AllowRelayCheckBoxClick(TObject *Sender)
! 406: {
! 407: AuthViaIpCheckBox->Enabled=AllowRelayCheckBox->Checked;
! 408: }
! 409: //---------------------------------------------------------------------------
! 410:
! 411: void __fastcall TMailCfgDlg::RelayAuthRadioButtonClick(TObject *Sender)
! 412: {
! 413: bool enabled = !RelayAuthNoneRadioButton->Checked;
! 414:
! 415: RelayAuthNameEdit->Enabled=enabled;
! 416: RelayAuthPassEdit->Enabled=enabled;
! 417: RelayAuthNameLabel->Enabled=enabled;
! 418: RelayAuthPassLabel->Enabled=enabled;
1.1 root 419: }
420: //---------------------------------------------------------------------------
421:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.