Customize Error Reporting via E-mail in Pylons - email

I am sending myself WebApp error reports from Pylons when users hit critical errors and I would love to be able to get the full output of session[] in the reports and customize it to my liking, but I've got no idea how to do that, or where the report is actually created / put together.
Anyone know how I can accomplish that?

The short answer is that you will have to roll your own for this functionality. WebError is the package used to handle this, and it doesn't provide any extension points. Your best bet may be to use a fork of it with your changes, although even then the code is not pretty.

I thank Michael for answering me, without really giving me anything to build on. That meant I had to figure it out myself, and that's always a good thing :)
What I did was, I looked at /config/middleware.py in my Pylons project and found this line:
app = ErrorHandler(app, global_conf, **config['pylons.errorware'])
I made my own ErrorHandler def and my own ErrorMiddleware class at the top of the middleware.py file:
class ClaraErrorMiddleware(ErrorMiddleware):
def exception_handler(self, exc_info, environ):
# do what ever you want with the exc_info or environ vars
super(ClaraErrorMiddleware, self).exception_handler(exc_info, environ) # call parent
pass
def ClaraErrorHandler(app, global_conf, **errorware):
if asbool(global_conf.get('debug')):
return ErrorHandler(app, global_conf, **errorware)
else:
return ClaraErrorMiddleware(app, global_conf, **errorware)
So now, I can throw in some extra variables I want to be sent with my error emails. Simple enough ...

Related

Tiki Net_LDAP2 class loading

I have a problem when I tried to integrate tiki with my LDAP server. In the test_ldap.php I wrote the code to debug according to this website (https://doc.tiki.org/LDAP%20authentication). This code returned a success. So I know that my LDAP is working fine. I have a problem at
$entry = Net_LDAP2_Entry::createConnected($this->_ldap, $this->_entry);
In the shiftEntry function in Search.php. When I return debug in here, it goes to ClassLoader.php and it go to
register_shutdown_function(function () {
TikiLib::events()->trigger('tiki.process.shutdown', []);});
In my opinion, maybe the problem is the
spl_autoload_call
The spl_autoload_call function called Net_LDAP2 which extends PEAR somewhere before this line in Search.php. This would lead both Net_LDAP2 and PEAR and PEAR_ERROR... Then when it comes to Net_LDAP2_Entry class, it would also load PEAR.... Would this create a fatal error?
I keep having blank screen in my tiki. Tried to cut the code from Search.php to the test_ldap.php to test. It has the same problem.
I am using:
Version 16.2
OS: Clear OS
Thanks for your help. I am blocked now.
I think this may be a good start: https://dev.tiki.org/item6283. If you look in the comments by albertgi he states changing some function names in PEAR.php. I was having LDAP integration problems and this was one of the key problems.

In Padrino, where does access_control come from?

The Padrino Admin Guide (http://www.padrinorb.com/guides/padrino-admin) has the object "access_control", but it is not clear to me where it is set? I can guess, but that is not good enough. We have essentially:
class Admin < Padrino::Application
register Padrino::Admin::AccessControl
enable :authentication
set :login_page, "/admin/sessions/new"
access_control.roles_for :any do |role| #How is access_control set?
role.protect "/"
role.allow "/sessions"
end
...
I am expecting that access_control is set somewhere, but where? I am guessing that this has to do with the "register" command, but have not found any help in docs yet.
thanks for any help...
Well, little interest in this, but I needed an answer, so here is mine.
I have at the top register Padrino::Admin::AccessControl which also lists Authorization, Base, ProjectModule. I can see some of the methods used in the app from the docs:
https://www.padrinorb.com/api/Padrino/Admin/AccessControl.html
However, nothing I could see about "access_control". I finally saw in the docs something I had missed, the line:
Defined in:padrino-admin/lib/padrino-admin/access_control.rb
AhHa! That is what I needed. Github if I need to look further.

Is it possible to use a control without putting it on a form in VB6?

I'm pretty sure about the answer to this, but I'm trying a variety of things to get a very stubborn project to work. One idea was to try to run code through a control without defining it on a form.
So, for example, my original code looked like this:
frmProcess.MyViewer.MaxPageSize = 100
frmProcess.MyViewer.ResetPages
frmProcess.MyViewer.AddPageToView "C:\TestPage1.txt"
I've changed it to:
Dim objViewer As MyViewer
objViewer.MaxPageSize = 100
objViewer.ResetPages
objViewer.AddPageToView "C:\TestPage1.txt"
I get an error window with "Run-time error '91': Object variable or With block variable not set".
But there doesn't seem to be a way to 'set' this control. Is this just impossible, or is there another way to do it that doesn't require a form?
EDIT: I ended up abandoning this entire path of activity, as an alternate solution was found that got around the problem I was having with this form freezing. I don't want to delete this question in case someone else comes along and can benefit from the answers, which are potentially useful.
Try this on a form.
Dim objViewer As MyViewer
Set objViewer = Controls.Add("MyViewer", "MyViewer1")
objViewer.MaxPageSize = 100
objViewer.ResetPages
objViewer.AddPageToView "C:\TestPage1.txt"
I've had similar situations in the past. If all else fails and you have to use a form you can do something crude like
1) Set the .Left property of the control to a negative number (like -10000) so the control doesn't appear on the form, the user can not see it
2) Make the entire form not visible..
ActiveX controls normally expect a number of services from their containers, for example persistence. They are also "packaged and marked" in ways that set the kinds of instantiation they support.
See Introduction to ActiveX Controls.
While it is perfectly possible for a control to be created in such a way as to make many of the available services optional, most controls are created from template code that requires a number of them. And most controls that are "visible at runtime" are going to require container services.
However that doesn't mean a control can't be designed to support containerless instantiation. A well known example of such a control is Microsoft Script Control 1.0 (MSScriptControl.ScriptControl) which can be used either way.

SuspectScore in Email Headers

I've Googled quite a bit and cannot find a definition to tell me what this means or how I can fix it.
I'm setting up some follow up emails, using mailgun.org as my SMTP provider and in the header I'm receiving this:
X-Proofpoint-Spam-Details: rule=notspam policy=default score=0
spamscore=0 suspectscore=99 phishscore=0 adultscore=0 bulkscore=100
classifier=spam adjust=0 reason=mlx scancount=1
engine=7.0.1-1308280000 definitions=main-1310230044
All of that looks fine with the exception of suspectscore=99 I can't find a definition for this, but it can't be a good thing to be a 99% suspect.
Anyone can enlighten me or point me to an accurate definition of suspectscore?
That's a header specific to a vendor product: Proofpoint. You'll have to work with them to understand what's going on.

How do I get the text-form verification code when doing auto site access in Perl?

I'm playing around with Win32::IE:Mechanize to try to access some authentication-required sites automatically. So far I've achieved moderate success, for example, I can automatically log in to my yahoo mailbox. But I find many sites are using some kind of image verification mechanism, which is possibly called CAPTCHA. I can do nothing to them. But one of the sites I'm trying to auto access is using a plain-text verification code. It is comnposed of four digits, selectable and copyable. But they're not in the source file which can be fetched using
$mech->content;
I searched for the keyword that appears on the webpage but not in the source file through all the files in the Temporary Internet Files but still can't find it.
Any idea what's going on? I was suspecting that the verification code was somehow hidden in some cookie file but I can't seem to find it :(
The following is the code that completes all the fields requirements except for the verification code:
use warnings;
use Win32::IE::Mechanize;
my $url = "http://www.zjsmap.com/smap/smap_login.jsp";
my $eccode = "myeccode";
my $username = "myaccountname";
my $password = "mypassword";
my $verify = "I can't figure out how to let the script get the code yet"
my $mech = Win32::IE::Mechanize->new(visible=>1);
$mech->get($url);
sleep(1); #avoids undefined value error
$mech->form_name("BaseForm");
$mech->field(ECCODE => $eccode);
$mech->field(MEMBERACCOUNT => $username);
$mech->field(PASSWORD => $password);
$mech->field(verify => $verify);
$mech->click();
Like always any suggestions/comments would be greatly appreciated :)
UPDATE
I've figured out a not-so-smart way to solve this problem. Please comment on my own asnwer posted below. Thanks like always :)
This is the reason why they are there. To stop program like yours to do automated stuff ;-)
A CAPTCHA or Captcha is a type of
challenge-response test used in
computing to ensure that the response
is not generated by a computer.
This appears to be an irrelevant number. The page uses it in 3 places: generating it; displaying it on the form next to the input field for it; and checking for the input value being equal to the random number chosen. That is, it is a client-only check. Still, if you disable javascript it looks like, I'm guessing, important cookies don't get set. If you can execute JavaScript in the context of the page (you should be able to with a get method call and a javascript URI), you could change the value of random_number to f.e. 42 and fill that in on the form.
The code is inserted by JavaScript – disable JS, reload the page and see it disappear. You have to hunt through the JS code to get an idea where it comes from and how to replicate it.
Thanks to james2vegas, zoul and Shoban.
I've finally figured out on my own a not-so-smart but at-least-workable way to solve the problem I described here. I'd like to share it here. I think the approach suggested by #james2vegas is probably much better...but anyway I'm learning along the way.
My approach is this:
Although the verification code is not in the source file but since it is still selectable and copyable, I can let my script copy everything in the login page and then extract the verification code.
To do this, I use the sendkeys functions in the Win32::Guitest module to do "Select All" and "Copy" to the login page.
Then I use Win32:Clipboard to get the clipboard content and then Regexp to extract the code. Something like this:
$verify = Win32::Clipboard::GetText();
$verify =~ s/.* (\d{4}).*/$1/msg;
A few thoughts:
The random number is generated by something like this in Perl
my $random_number = int(rand(8999)) + 1000; #var random_number = rand(1000,10000);
And then it checks if $verify == $random_number. I don't know how to catch the value of one-session-only $random_number. I think it is stored somewhere in the memory. If I can capture the value directly then I wouldn't have gone to so much trouble of using this and that extra module.