示例#1
0
 def test(self):
     if not is_ci():
         self.assertTrue(True)
     else:
         global username
         global password
         api = CUNYFirstAPI(username, password)
         api.login()
         self.assertTrue(api.is_logged_in())
示例#2
0
def main():
    global user
    global state
    global api
    global redacted_print_std
    global redacted_print_err
    global endtime

    args = parse()
    state = LoginState.determine_state(args)

    try:

        # Only initialize twilio in production
        # or when specifically asked
        if state == LoginState.PROD or args.enable_phone:
            initialize_twilio()

        username = input(
            "Enter username: "******"Enter password: "******"Enter phone number: ") if not args.phone else args.phone

        ## Monkey Patching stdout to remove any sens. data
        redacted_list = [username, password]
        redacted_print_std = RedactedPrint(STDOutOptions.STDOUT, redacted_list)
        redacted_print_err = RedactedPrint(STDOutOptions.ERROR, redacted_list)
        redacted_print_std.enable()
        redacted_print_err.enable()

        if add_new_user_instance(username):
            endtime = datetime.datetime.now() + datetime.timedelta(days=14)
            api = CUNYFirstAPI(username, password, args.school.upper())
            user = User(username, password, number, args.school.upper())
            atexit.register(exit_handler)
            create_instance()
        else:
            print(already_in_session_message())

    except Exception as e:
        print("ERROR")
        traceback.print_exc()
示例#3
0
def start_notifier():

    create_connection()
    cursor = get_cursor()

    if cursor == None:
        return

    while True:
        global WAIT_INTERVAL

        cursor.execute('''SELECT * FROM Users \
                                   WHERE lastUpdated < NOW() - INTERVAL 30 MINUTE \
                                   ORDER BY lastUpdated DESC LIMIT 1'''
                       )  # get top row from

        try:
            row = cursor.next()
            column_names = cursor.column_names

            query_dict = {k: v for k, v in zip(column_names, row)}

            phoneNumber = query_dict['phoneNumber']
            last_updated = query_dict['lastUpdated']
            username = query_dict['username']
            school = query_dict['school']
            grade_hash = query_dict['gradeHash']
            encrypted_password = query_dict['password']
            date_created = query_dict['dateCreated']
            __id = query_dict['id']

            is_welcome = last_updated.year == 1970

            cursor.execute(
                f'UPDATE Users SET lastUpdated = NOW() WHERE id={__id};')

            decrypted_password = decrypt(encrypted_password,
                                         '../../private/keys/private.pem')
            api = CUNYFirstAPI(username, decrypted_password, school.upper())
            api.login()

            grade_result = refresh(api)
            grade_hash = str(hash(frozenset(grade_result.classes)))

            if grade_hash != query_dict['gradeHash']:
                message = create_text_message(grade_result, is_welcome)
                send_text(message, phoneNumber)
                cursor.execute(
                    f'UPDATE Users SET gradeHash = {grade_hash} WHERE id={__id};'
                )

            api.logout()
            removed = remove_user_if_necessary(cursor, username, date_created)
            if removed:
                send_text(SESSION_ENDED_TEXT, phoneNumber)

        except StopIteration:
            pass

        except:
            traceback.print_exc()
        time.sleep(constants.WAIT_INTERVAL)
示例#4
0
    def test(self):
        if not is_ci():
            self.assertTrue(True)
        else:
            global username
            global password

            api = CUNYFirstAPI(username, password)
            api.login()

            # test course match, days of week, start/end times
            loc = api.move_to(Locations.class_search).location()
            result1 = loc.action().submit_search(
                institution='QNS01',
                term='1192',
                course_number='1',
                course_number_match='G',
                days_of_week=['Monday', 'Wednesday'],
                meeting_start_time='12:00PM',
                meeting_end_time='3:00PM')
            test1 = len(result1['results']) > 0

            # test day of week match
            loc = api.move_to(Locations.class_search).location()
            result2 = loc.action().submit_search(institution='QNS01',
                                                 term='1192',
                                                 course_number_match='G',
                                                 course_number='1',
                                                 days_of_week_match='J',
                                                 days_of_week=['Tuesday'])
            test2 = len(result2['results']) == 0

            # test mode of instruction, open classes only, requirement designation
            loc = api.move_to(Locations.class_search).location()
            result3 = loc.action().submit_search(institution='QNS01',
                                                 term='1192',
                                                 course_number='1',
                                                 course_number_match='G',
                                                 requirement_designation='FSW',
                                                 meeting_start_time='12:00PM',
                                                 meeting_end_time='3:00PM',
                                                 open_classes_only=False,
                                                 mode_of_instruction='H')
            test3 = len(result3['results']) > 0

            # test last name match and last name
            loc = api.move_to(Locations.class_search).location()
            result4 = loc.action().submit_search(
                institution='QNS01',
                term='1192',
                course_number='1',
                course_number_match='G',
                instructor_last_name_match='B',
                instructor_last_name='Obren',
                open_classes_only=False)
            test4 = len(result4['results']) > 0

            # test invalid subject value by length
            loc = api.move_to(Locations.class_search).location()
            try:
                result5 = loc.action().submit_search(institution='QNS01',
                                                     term='1192',
                                                     subject='FAKESUBJECT',
                                                     course_number='111')
                self.assertTrue(False)
            except ValueError:
                self.assertTrue(True)

            # test invalid time
            loc = api.move_to(Locations.class_search).location()
            result6 = loc.action().submit_search(institution='QNS01',
                                                 term='1192',
                                                 course_number='111',
                                                 subject='CSCI',
                                                 meeting_start_time='25:00AM',
                                                 parsed=True)
            test6 = len(result6['results']) == 0

            self.assertTrue(test1)
            self.assertTrue(test2)
            self.assertTrue(test3)
            self.assertTrue(test4)
            self.assertTrue(test6)