This is messed up, for sure. What is:
glPopAttrib();
glPopMatrix();
doing between glBegin and glEnd ?
Similarly for your other two tringles and quads.
Your normal calulation depends on whether you want a per vertex normal or a per face normal. For simple objects like yours, per face is reasonable, but you really should specify it, eg insert a new glNormal3f iin the code for glBegin(GL_Triangles) before the glVertex3f command.